Excel VBA除以一个值,然后显示与除数相关的值
我试图找出最清晰的方式来显示,例如,初始值表示为Excel VBA除以一个值,然后显示与除数相关的值,excel,vba,Excel,Vba,我试图找出最清晰的方式来显示,例如,初始值表示为300asx,关键路径表示为1.5asy。这两个值都可以通过图纸上的输入进行更改 连同这些值,我们有一个a和b资源。在这种情况下,a将填充一行中的200单元格,b将填充100 正如我之前提到的,x和y可以改变,比如说,如果y是2,a填充150和b填充150。如果y为1,则只有a填充300 目前我正在使用If语句,但我觉得这很混乱,可能会导致无休止的代码,以涵盖所有可能的结果,我需要一个更好的解决方案 下面是一个我目前正在实现的简单化示例: Priv
300
asx
,关键路径表示为1.5
asy
。这两个值都可以通过图纸上的输入进行更改
连同这些值,我们有一个a
和b
资源。在这种情况下,a
将填充一行中的200
单元格,b
将填充100
正如我之前提到的,x
和y
可以改变,比如说,如果y
是2
,a
填充150
和b
填充150
。如果y
为1
,则只有a
填充300
目前我正在使用If语句,但我觉得这很混乱,可能会导致无休止的代码,以涵盖所有可能的结果,我需要一个更好的解决方案
下面是一个我目前正在实现的简单化示例:
Private Sub Example()
Dim ActiveWB As Worksheet
Set ActiveWB = ActiveWorkbook.Sheets("Sheet1")
Dim cell As Range
Dim a, b, x, y As Double
x = ActiveWB.Range("A1").Value
y = ActiveWB.Range("A2").Value
a = x / y
b = x - a
For Each cell In ActiveWB.Range(Cells(3, 1), Cells(3, a))
If (cell.Column >= 0) And (cell.Column <> x) Then
If (y = 1) And (a > 0) Then
cell.Value = "a"
a = a - 1
ElseIf (y > 1) And (y < 2) And (a > 0) Then
cell.Value = "a"
a = a - 1
If (b > 0) Then
cell.Offset(1, 0).Value = "b"
b = b - 1
End If
ElseIf (y >= 2) And (y < 2.5) And (a > 0) Then
cell.Value = "a"
a = a - 1
If (b > 0) Then
cell.Offset(1, 0).Value = "b"
b = b - 1
End If
'..... and so on......
End If
End If
Next cell
End Sub
Private子示例()
将ActiveWB设置为工作表
设置ActiveWB=ActiveWorkbook.Sheets(“Sheet1”)
暗淡单元格作为范围
尺寸a、b、x、y为双精度
x=有效WB.范围(“A1”).值
y=有效WB.范围(“A2”).值
a=x/y
b=x-a
对于ActiveWB.范围内的每个单元格(单元格(3,1),单元格(3,a))
如果(cell.Column>=0)和(cell.Column x),则
如果(y=1)和(a>0),则
cell.Value=“a”
a=a-1
ElseIf(y>1)和(y<2)以及(a>0)则
cell.Value=“a”
a=a-1
如果(b>0),则
单元格偏移量(1,0).Value=“b”
b=b-1
如果结束
ElseIf(y>=2)和(y<2.5)以及(a>0)则
cell.Value=“a”
a=a-1
如果(b>0),则
单元格偏移量(1,0).Value=“b”
b=b-1
如果结束
'..... 等等
如果结束
如果结束
下一个细胞
端接头
如有任何建议,将不胜感激。谢谢你抽出时间。Y.我可能不完全理解其复杂性,但根据您共享的内容,您可以使用以下内容替换for循环以实现相同的结果:
ActiveWB.Range(Cells(3, 1), Cells(3, a)).Value = "a"
If b > 0 then
ActiveWB.Range(Cells(4, 1), Cells(4, b)).Value = "b"
End If
首先应分别为每个变量声明类型:
Dim a, b, x, y As Double
变成:
Dim a As Double, b As Double, x As Double, y As Double
或者(这是我喜欢的):
秒,如果a和b仅用于确定范围宽度,则它们最好不是浮点类型。请使用整数(小于2^15)或长:
那么,您对a和b的赋值不能保持现在的状态,但应如下所示:
a = Int(x / y)
b = Int(x - a)
然后我希望您的x和y值在工作表中限制为值>0和x>y。如果没有,那么首先在脚本中测试它
现在是最后一个(和您的原始问题),如果您愿意,可以为完整范围的单元格指定一个值:
If a > 0 Then Range(Cells(3, 1), Cells(3, a)).Value = "a"
If b > 0 Then Range(Cells(4, 1), Cells(4, b)).Value = "b"
我不明白你为什么从a和b中取1,所以如果这真的增加了一些东西,请详细说明一下一般逻辑…我不明白你想实现什么_T@Chris说明或所需解决方案有问题吗?为什么要测试
y
值?似乎每个单元格的默认值都是“a”,第二列中的第一个b
单元格获得“b”@YaMo可以随意选择K_b的答案作为正确答案。我之前回答过,但库布的回答更有用。谢谢你的建议,这很有效。我觉得我的例子有点过于简单化了。但我很乐意接受这一点。“YAMO考虑当代码< b=0 < /代码> @ kyb时,我知道,这也可以被纠正,但我只是在复制他所陈述的行为。我决定不指出我建议更改的其他内容,这与您的回答不同。感谢您的指点和解释,我对VBA仍然很陌生+1@K_B它来自更复杂的逻辑原始代码。由于值在各节中循环,并且值被放置在与这些资源相关的位置。@Chris,请将Dim a、b、c声明为整数
,并查看“本地人监视”窗口中每个值的类型。另请参见:,向下滚动以注意用一条Dim语句+1声明的变量,这肯定是一个更有用的答案。我还建议重命名ActiveWB
,因为很容易错误地认为它应该是工作簿对象,而实际上它是工作表。
a = Int(x / y)
b = Int(x - a)
If a > 0 Then Range(Cells(3, 1), Cells(3, a)).Value = "a"
If b > 0 Then Range(Cells(4, 1), Cells(4, b)).Value = "b"