Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
        Dim fc As Double = 9700
        Dim startF60, startF40, stopF40, stopF60 As Double
        Dim startF60dB, startF40dB, stopF40dB, stopF60dB As Double
        Dim t As Double = 22.994
        Dim tr As Double = 0.024

        'tr = Int(t / 10) * 10

        Dim db40width As Double = 7.6 / Math.Sqrt(t * 10 ^ -6 * tr * 10 ^ -6)

        Dim db60 As Double = -60

        Dim db60witdh As Double = db40width * 10 ^ (-(db60 + 40) / 10 / 3)

        startF60 = fc - (db60witdh*10 ^ -6) / 2
        stopF60 = fc + (db60witdh*10 ^ -6) / 2
        startF40 = fc - (db40width*10 ^ -6) / 2
        stopF40 = fc + (db40width*10 ^ -6) / 2

        startF60dB = -40 + -30*Math.Log10((fc - 9677) / (db40width*10 ^ -6 / 2))
        startF40dB = -40
        stopF40dB = -40
        stopF60dB = -40 + -30*Math.Log10((9723 - fc) / (db40width*10 ^ -6 / 2))

        MessageBox.Show("40dB帯域幅:" & db40width & vbCrLf &
            "60dB帯域幅:" & db60witdh & vbCrLf &
                        "startF60:" & startF60 & vbCrLf &
                        "startF40:" & startF40 & vbCrLf &
                        "stopF40:" & stopF40 & vbCrLf &
                        "stopF60:" & stopF60 & vbCrLf &
                        "startF60の振幅:" & startF60dB & vbCrLf &
                        "startF60の振幅:" & startF40dB & vbCrLf &
                        "startF60の振幅:" & stopF40dB & vbCrLf &
                        "startF60の振幅:" & stopF60dB & vbCrLf)
    End Sub

メモ2

'*******************************************************************************************************
'マスク値の計算
Function CalcMaskData(Freq As Double) As Double
    
    '60dB境界下限周波数より低い場合
    '60dB境界上限周波数より高い場合
    If Freq <= StartF60 Or Freq >= StopF60 Then
        CalcMaskData = (-60dB or 43+10log(PEP))
    End If
    
    '40dB帯域内の場合
    If Freq >= StartF40 And Freq <= StopF40 Then
        CalcMaskData = 0
    End If
    
    '60dB境界下限周波数~40dB境界下限周波数の場合
    If Freq > StartF60  And Freq < StartF40  Then
    '   CalcMaskData = -40 - 30 * Log(2 * (CenterF - Freq) / D40Width) / Log(10)
  'D40Width:40dB帯域幅
        CalcMaskData = -40 - 30 * (0.6931 + Log(CenterF - Freq) - lnD40Width) / 2.3026
    End If
    
    '40dB境界上限周波数~60dB境界上限周波数の場合
    If Freq < StopF60  And Freq > StopF40  Then
'        CalcMaskData = -40 - 30 * Log(2 * (Freq - CenterF - OffsetF) / D40Width) / Log(10)
        CalcMaskData = -40 - 30 * (0.6931 + Log(Freq - CenterF) - lnD40Width) / 2.3026
    End If
    
    Exit Function

End Function
'******************************************************************************************
【マスクデータの生成について】 
マスクデータを生成する際、周波数点は以下のようにしています。 
①下記の周波数点は必ず生成されるようにしています。 
 ・40dB 帯域幅の上限下限の周波数点 
   マスクデータ = 0dB 
 ・40dB 帯域幅の上限+0.001 Hz、下限-0.001 Hz の周波数点 
   マスクデータ = -40dB 
 ・帯域外領域とスプリアス領域の境界周波数 
   マスクデータ = 43+10log(PEP)か-60dBのどちらか小さい方

②帯域外領域とスプリアス領域の境界周波数内のマスクデータ計算周波数点は
 40 dB 帯域幅内を含めて、参照帯域幅の Step で生成されます。 

③測定開始周波数から帯域外領域とスプリアス領域の境界周波数の下側までの周波数点は 
 5 点程度になるように生成しています。 

④帯域外領域とスプリアス領域の境界周波数の上側から測定終了周波数までの周波数点は 
 5点程度になるように生成しています。 

'****************************************************************************************
【分かったこと】
・電力5W以下は43+10log(PEP)の方が小さい
・スプリアスのATTは入力レベルの適正、通常は内部回路の保護のため最低でも10dBは入れておく
 →尖っていない方だけ変化する。低いほど低い、大きいほど高い。

メモ

①フォーム閉じる時の保存確認を排除
②セッティング保存ボタンを設ける
③パルス特性の結果を反映させるテキストボックスを用意する
 →40dB帯域幅にも反映させる
④電力測定後、PEPに反映させる(空中線電力)
⑤規格線作成

【短パルス選択時】
●下記の定数/値を取得する(初期設定)
・中心周波数
・40dB帯域幅
・測定周波数範囲下限(開始周波数)[MHz]
・測定周波数範囲上限(終了周波数)[MHz]
・オフセット周波数[MHz]
・参照帯域幅[MHz]
・減衰曲線(30dB/decade)
・空中戦電力[W]

●結果を入れておくといい
・帯域外領域とスプリアス領域との境界 下側
・40dB帯域幅 下側
・40dB帯域幅 上側
・帯域外領域とスプリアス領域との境界 上側

●参照帯域幅(スプリアス領域で測定する周波数帯ごとに定義される)計算
 入力値:(ユーザー)[MHz]
 選択:1MHz固定、指定値、
    非符号化パルス変調(固定周波数):1/パルス幅[us]
    位相変調符号化パルスレーダー(固定周波数):1/移送変調チップ長[us]
    周波数変調及びチャープレーダ:√(周波数偏移幅[MHz]/パルス幅[us])

③規格線作成
dim LimitNo as long
dim MaskFreq() as double
dim MaskLimit() as double

LimitNo = 0
Erase MaskFreq
Erase MaskLimit

・ステップ周波数(-60dBのポイント数を減らす式)  
    TempF = Int*1
    End If
    
    '40dB帯域内の場合
    If Freq >= StartF40 And Freq <= StopF40 Then
        CalcMaskData = 0
    End If
    
    '60dB境界下限周波数~40dB境界下限周波数の場合
    If Freq > StartF60  And Freq < StartF40  Then
    '   CalcMaskData = -40 - 30 * Log(2 * (CenterF - Freq) / D40Width) / Log(10)
  'D40Width:40dB帯域幅
        CalcMaskData = -40 - 30 * (0.6931 + Log(CenterF - Freq) - lnD40Width) / 2.3026
    End If
    
    '40dB境界上限周波数~60dB境界上限周波数の場合
    If Freq < StopF60  And Freq > StopF40  Then
'        CalcMaskData = -40 - 30 * Log(2 * (Freq - CenterF - OffsetF) / D40Width) / Log(10)
        CalcMaskData = -40 - 30 * (0.6931 + Log(Freq - CenterF) - lnD40Width) / 2.3026
    End If
    
    Exit Function

End Function
'******************************************************************************************
【マスクデータの生成について】 
マスクデータを生成する際、周波数点は以下のようにしています。 
①下記の周波数点は必ず生成されるようにしています。 
 ・40dB 帯域幅の上限下限の周波数点 
   マスクデータ = 0dB 
 ・40dB 帯域幅の上限+0.001 Hz、下限-0.001 Hz の周波数点 
   マスクデータ = -40dB 
 ・帯域外領域とスプリアス領域の境界周波数 
   マスクデータ = 43+10log(PEP)か-60dBのどちらか小さい方

②帯域外領域とスプリアス領域の境界周波数内のマスクデータ計算周波数点は
 40 dB 帯域幅内を含めて、参照帯域幅の Step で生成されます。 

③測定開始周波数から帯域外領域とスプリアス領域の境界周波数の下側までの周波数点は 
 5 点程度になるように生成しています。 

④帯域外領域とスプリアス領域の境界周波数の上側から測定終了周波数までの周波数点は 
 5点程度になるように生成しています。 

'****************************************************************************************
【分かったこと】
・電力5W以下は43+10log(PEP)の方が小さい
・スプリアスのATTは入力レベルの適正、通常は内部回路の保護のため最低でも10dBは入れておく
 →尖っていない方だけ変化する。低いほど低い、大きいほど高い。

以上

*1:StartF60 - StartF) / 20)
    Select Case TempF 
        Case Is < 1:            StepNegF = 0.1
        Case Is < 10:           StepNegF = Int(TempF)
        Case Is < 100:          StepNegF = Int(TempF / 10) * 10
        Case Is < 1000:         StepNegF = Int(TempF / 100) * 100
        Case Is < 10000:        StepNegF = Int(TempF / 1000) * 1000
        Case Else:              StepNegF = 10000
    End Select
    
    TempF= Int((StopF - StopF60) / 20)
    Select Case TempF
        Case Is < 1:            StepPosF = 0.1
        Case Is < 10:           StepPosF = Int(TempF)
        Case Is < 100:          StepPosF = Int(TempF / 10) * 10
        Case Is < 1000:         StepPosF = Int(TempF / 100) * 100
        Case Is < 10000:        StepPosF = Int(TempF / 1000) * 1000
        Case Else:              StepPosF = 10000
    End Select

 '①startF~StartF60
I = 1
Do While Integer.Parse(StartF + (I - 1) * StepNegF) < StartF60
 If I = 1 Then
  Freq = StartF
 Else
  Freq = Integer.Parse(StartF + (I - 1) * StepNegF)
 End If
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
 I = I + 1
Loop

'②StartF60~StartF40
I = 1
Do While (StartF60 + (I - 1) * BWref < StartF40
 'BWref:参照帯域幅[MHz]
    Freq = StartF60 + (I - 1) * BWref 
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
    I = I + 1
Loop

'③StartF40
Freq = StartF40
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
LimitNo = LimitNo + 1

'④StartF40~StopF40
I = 1
Do While (StartF40) + (I - 1) * BWref < StopF40
    Freq = (StartF40) + (I - 1) * BWref
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
 I = I + 1
Loop

'⑤StopF40
Freq = StopF40
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
LimitNo = LimitNo + 1


'⑥StopF40~StopF60
I = 2
Do While (StopF40) + (I - 1) * BWref < StopF60
    Freq = (StopF40) + (I - 1) * BWref
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
    LimitNo = LimitNo + 1
    I = I + 1
Loop

'⑦StopF60 ~ F_Stop
I = 1
Freq = (StopF60) + (I - 1) * StepPosF
Ret = SetMaskData(LimitNo, Freq)
LimitNo = LimitNo + 1

I = 2
Do While (StopF60) + (I - 1) * StepPosF < StopF
    Freq = Integer.Parse(StopF60) + (I - 1) * StepPosF
 MaskFreq(LimitNo)=Freq
 MaskLimit(LimitNo)=CalcMaskData(Frep)
 LimitNo = LimitNo + 1
    I = I + 1
Loop

 MaskFreq(LimitNo)=StopF
 MaskLimit(LimitNo)=CalcMaskData(Frep)


'*******************************************************************************************************
'マスク値の計算
Function CalcMaskData(Freq As Double) As Double
    
    '60dB境界下限周波数より低い場合
    '60dB境界上限周波数より高い場合
    If Freq <= StartF60 Or Freq >= StopF60 Then
        CalcMaskData = (-60dB or 43+10log(PEP

VBA ExcelでWordのテキストボックス内の文字列に取り消し線を表示させる

Sub EXCEL_WORD02() 'EXCEL VBAから既存のWORDファイルを起動する。
 
    Dim WordApp As Object
    Dim WordDoc As Word.Document
                            '
    Set WordApp = CreateObject("Word.Application") ' CreateObject関数でWordをセット
 
    WordApp.Visible = True 'Wordを起動する
  
    Set WordDoc = WordApp.Documents.Open("C:\Users\sannp\OneDrive\デスクトップ\test01.docx") ' 指定したWordファイルを起動します。
 
    Dim srcText As String
    srcText = "なおき"
     
    Dim shp As Object  ' Word.Shape
 
    For Each shp In WordApp.ActiveDocument.Shapes
        If shp.Type = msoTextBox Then
            Call DoubleStrikeText(shp, srcText)

        End If
    Next
    
End Sub

 

Public Sub DoubleStrikeText(shp As Variant, srcText As String)
    
    If shp.TextFrame.HasText Then
        Dim objFind As Find
        Set objFind = shp.TextFrame.TextRange.Find
        
        objFind.ClearFormatting
        objFind.Forward = True
        objFind.Text = srcText
        objFind.Replacement.Font.DoubleStrikeThrough = True
        Call objFind.Execute(Replace:=wdReplaceAll)
        
    End If
End Sub

 

 

VBA ExcelでWordのテキストボックス内の文字列を置換

Sub EXCEL_WORD01() 'EXCEL VBAから既存のWORDファイルを起動する。
 
    Dim WordApp As Object
    Dim WordDoc As Word.Document
                            '
    Set WordApp = CreateObject("Word.Application") ' CreateObject関数でWordをセット
 
    WordApp.Visible = True 'Wordを起動する
  
    Set WordDoc = WordApp.Documents.Open("C:\Users\sannp\OneDrive\デスクトップ\test01.docx") ' 指定したWordファイルを起動します。
 
 
     '--- 置換前の文字列 ---'
    Dim srcText As String
    srcText = "置換前"
    
    '--- 置換後の文字列 ---'
    Dim replaceText As String
    replaceText = "置換後"
 
 
 
    Dim shp As Object  ' Word.Shape
 
    For Each shp In WordApp.ActiveDocument.Shapes
        If shp.Type = msoTextBox Then
            'MsgBox shp.TextFrame.TextRange.Text
            Call ReplaceShapeText(shp, srcText, replaceText)
        End If
    Next
    

    
End Sub
 

Public Sub ReplaceShapeText(shp As Variant, srcText As String, replaceText As String)
    
    If shp.TextFrame.HasText Then
        Dim objFind As Find
        Set objFind = shp.TextFrame.TextRange.Find
        
        objFind.ClearFormatting
        objFind.Forward = True
        objFind.Text = srcText
        objFind.Replacement.Text = replaceText
        Call objFind.Execute(Replace:=wdReplaceAll)
        
    End If
End Sub

Async/awaite&backgroundWorkerを使ったスレッド処理

Imports System.ComponentModel
Imports System.Threading
Public Class Form1

Dim cts As CancellationTokenSource

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)

Dim i As Integer

'ループ終了かキャンセルされた時まではループ続ける
For i = 1 To 10
If bgWorker.CancellationPending Then
'キャンセルされたとき
e.Cancel = True
Return
End If

System.Threading.Thread.Sleep(500)

bgWorker.ReportProgress(i)
Next

e.Result = 10
Form2.Label1.Text = "10deg"

End Sub

'スレッド中の処理
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object,
ByVal e As ProgressChangedEventArgs) _
Handles BackgroundWorker1.ProgressChanged

'Label1のテキストを変更する
Form2.Label1.Text = e.ProgressPercentage.ToString() & "deg"
Form2.Label2.Text = "目標は10deg"

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object,
ByVal e As RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1.RunWorkerCompleted

If Not e.Error Is Nothing Then
'エラーが発生したとき
Label1.Text = "エラー:" & e.Error.Message
ElseIf e.Cancelled Then
'キャンセルされたとき
Else
'正常に終了したとき
'結果を取得する
Dim result As Integer = CInt(e.Result)
Label1.Text = result.ToString() & "deg"
End If

Thread.Sleep(1000)

Form2.Close()

Button1.Enabled = True
Button2.Enabled = False

End Sub

'スレッド開始
Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

cts = New CancellationTokenSource()

'処理が行われているときは、何もしない
If BackgroundWorker1.IsBusy Then
Return
End If

Try

'BackgroundWorkerのProgressChangedイベントが発生するようにする
BackgroundWorker1.WorkerReportsProgress = True

'キャンセルできるようにする
BackgroundWorker1.WorkerSupportsCancellation = True

Form2.Show()

'BackgroundWorker処理開始
BackgroundWorker1.RunWorkerAsync()

Dim t = posi_move(cts.Token)
Await t

Catch ex As Exception
MessageBox.Show("キャンセルされました")
End Try

Button3.Enabled = True
Button4.Enabled = False

End Sub

'スレッド中の処理
Async Function posi_move(token As CancellationToken) As Task(Of Task)

Dim a As Integer
Dim c As Integer = 0

Button3.Enabled = False
Button4.Enabled = True

Dim result As Task = Task.Run(
Sub()
While True

For a = 1 To 10

If (token.IsCancellationRequested) Then 'キャンセル時の処理
c = 1
Exit While
End If

Thread.Sleep(500)
Next

Exit While

End While
End Sub
)
Await result

If c = 1 Then
MessageBox.Show("中断しました")
Else
MessageBox.Show("タスク終了")
End If

Return result

End Function

'スレッド停止
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

Label1.Text = Form2.Label1.Text

Form2.Close()

'キャンセルする
BackgroundWorker1.CancelAsync()

cts.Cancel()

End Sub
End Class

VB:BackgroundWorkerを使ったスレッド処理

Imports System.ComponentModel
Imports System.Threading
Public Class Form1

'スレッド開始ボタン処理
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

'処理が行われているときは、何もしない
If BackgroundWorker1.IsBusy Then
Return
End If

Button1.Enabled = False
Button2.Enabled = True

'BackgroundWorkerのProgressChangedイベントが発生するようにする
BackgroundWorker1.WorkerReportsProgress = True

'キャンセルできるようにする
BackgroundWorker1.WorkerSupportsCancellation = True

Form2.Show()

'BackgroundWorker処理開始
BackgroundWorker1.RunWorkerAsync()

End Sub

'スレッド停止ボタン処理
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

Button1.Enabled = True
Button2.Enabled = False

Label1.Text = Form2.Label1.Text

Form2.Close()

'キャンセルする
BackgroundWorker1.CancelAsync()

End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)

Dim i As Integer

'ループ終了かキャンセルされた時まではループ続ける
For i = 1 To 10
If bgWorker.CancellationPending Then
'キャンセルされたとき
e.Cancel = True
Return
End If

System.Threading.Thread.Sleep(1000)

bgWorker.ReportProgress(i)
Next

e.Result = 10
Form2.Label1.Text = "10deg"

End Sub

'スレッド中の処理
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object,
ByVal e As ProgressChangedEventArgs) _
Handles BackgroundWorker1.ProgressChanged

'Label1のテキストを変更する
Form2.Label1.Text = e.ProgressPercentage.ToString() & "deg"
Form2.Label2.Text = "目標は10deg"

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object,
ByVal e As RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1.RunWorkerCompleted

If Not e.Error Is Nothing Then
'エラーが発生したとき
Label1.Text = "エラー:" & e.Error.Message
ElseIf e.Cancelled Then
'キャンセルされたとき
Else
'正常に終了したとき
'結果を取得する
Dim result As Integer = CInt(e.Result)
Label1.Text = result.ToString() & "deg"
End If

Thread.Sleep(1000)

Form2.Close()

Button1.Enabled = True
Button2.Enabled = False

End Sub

End Class