尝试在数组的特定行上输入数据

时间:2019-07-08 17:49:26

标签: vba

我创建了一个具有500行10列的数组。我正在尝试使用雷达距离方程式生成信号强度数组。我想在两个范围内检测两个目标,并将它们放置在阵列中的特定位置。我有2个if语句嵌套在2个for循环内。 for循环可以正常工作,但是我无法弄清楚If语句在哪里出错。所有值都是正确的(因此请在msgbox中输入值)

我曾尝试将Signal(i,j)= 0移至If语句中,但是由于行50和250以外的其他位置,我不确定如何设置范围。

Sub Generate_Power_Amplitude()
'/////////////////////Basic Parameters////////////////////////////
'/////////////////////Step 1//////////////////////////////////////
' Input the parameters of the Radar Range Equation
TotalPower = 10000 '(Watts)
Gain = 3162.27766 '(35 dB of gain)
Wavelength = 0.3 '(meters)
RCS = 15 '(meters^2)
RangeToTarget = 35000 '(meters)
PulseWidth = 1.67 * 10 ^ -6 '(seconds)
Bandwidth = 6 * 10 ^ 5 '(Hertz)
RangeBins = 1 * 10 ^ 3 '(meters)
PRI = 1 * 10 ^ -4 '(seconds)
PRF = 1 * 10 ^ 4 '(Hertz)
PRIDistance = 60000 '(meters)
'//////////////////Targets/////////////////////////////////////////////
'//////////////////Step 2//////////////////////////////////////////////
' Define how many targets and their distance
Target1 = 25000 '(meters)
Target2 = 125000 '(meters)
'/////////////////Operations//////////////////////////////////////////
RadarRangeNumerator = TotalPower * Gain ^ 2 * Wavelength ^ 2 * RCS
RadarRangeDenomenator = (4 * 3.1415926) ^ 3 * RangeToTarget ^ 4
RelativePower = RadarRangeNumerator / RadarRangeDenomenator
PowerAmplitude = RelativePower ^ 0.5
RelativePower1 = RadarRangeNumerator / ((4 * 3.1415926) ^ 3 * Target1 ^ 4)
RelativePower2 = RadarRangeNumerator / ((4 * 3.1415926) ^ 3 * Target2 ^ 4)
PowerAmp1 = RelativePower1 ^ 0.5
PowerAmp2 = RelativePower2 ^ 0.5

Dim Signal(500, 10)
For i = 1 To 500
    For j = 1 To 10
        If i = 50 Then
            Signal(50, j) = PowerAmp1
        ElseIf i = 250 Then
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i
MsgBox Signal(50, 1)
MsgBox Signal(250, 1)
End Sub

我让msgboxes给出了正确的值,这是新的For循环,下面有一条评论,正如我说的那样,我认为这最终会破裂,如果有正确的方法,请告诉我。 / p>

Dim Signal(500, 10)
For i = 1 To 500
    For j = 1 To 10
        If i = 500 Then
            Signal(50, j) = PowerAmp1
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i

2 个答案:

答案 0 :(得分:0)

答案可能太简单了,但是似乎您只需要使用UboundLbound工具进行循环即可。这是代码示例,您可以根据数组大小设置限制:

Dim Signal(500, 10)
For i = Lbound(Signal,1) To Ubound(Signal,1)
    For j = LBound(Signal,2) To UBound(Signal,2)
        If i = Ubound(Signal,1) Then
            'This part confuses me:
            Signal(50, j) = PowerAmp1
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i

答案 1 :(得分:0)

如果您只想将50和250的值插入数组,则无需将所有值都设置为零。在VBA中,包括数组元素在内的所有变量值都初始化为零。因此,这将产生与您的代码完全相同的结果:

Dim Signal(1 To 500, 1 To 10)
Signal(50, j) = PowerAmp1
Signal(250, j) = PowerAmp2

并且,顺便说一句,请注意,我专门说明了数组的维数范围。 VBA将默认为基于零的数组-这意味着您的定义是根据0 to 500生成的数组,即501个元素。

@PGSystemTester在将循环界限直接与数组界限相关联方面是完全正确的。这是很常见的做法,以后可以为您节省很多心痛。

Dim Signal(1 To 500, 1 To 10)
For i = LBound(Signal, 1) To UBound(Signal, 1)
    For j = LBound(Signal, 2) To UBound(Signal, 2)
        If i = 500 Then
            Signal(50, j) = PowerAmp1
            Signal(250, j) = PowerAmp2
        End If
        Signal(i, j) = 0
    Next j
Next i

您的下一步可能是计算到每个目标的一系列步进范围内的功率。请记住,要定义可变数量的步骤-在这种情况下为数组元素-您必须使用ReDim

Const RANGE_STEPS As Long = 1000
Dim Signal As Variant
ReDim Signal(1 To RANGE_STEPS, 1 To 10)

如果您使用的是UBound和LBound函数,则循环将保持完全相同。