Excel 基于2个范围的每个单元格的宏循环
我尝试创建一个带有2个输入框的宏,通过第一个输入框,用户选择一个区域,在该区域中,它被写入每个单元格C或D(贷方或借方) 通过第二个输入,用户选择一个范围,在该范围内,用户将相应的金额写入每个单元格 我要做的是:Excel 基于2个范围的每个单元格的宏循环,excel,vba,for-loop,Excel,Vba,For Loop,我尝试创建一个带有2个输入框的宏,通过第一个输入框,用户选择一个区域,在该区域中,它被写入每个单元格C或D(贷方或借方) 通过第二个输入,用户选择一个范围,在该范围内,用户将相应的金额写入每个单元格 我要做的是: 如果贷方/借方范围内的对应单元格值为“D”,则对应单元格(我指该借方对应的金额)保持为正,否则变为负 例如,如果用户在J列中选择C/D范围,然后用户通过第二个输入框选择B列中的所有相应金额,我希望如果J1=“D”在B1中返回正值,否则在B1中返回负值,依此类推所有其他行 我试图执行我的
如果贷方/借方范围内的对应单元格值为“D”,则对应单元格(我指该借方对应的金额)保持为正,否则变为负 例如,如果用户在J列中选择C/D范围,然后用户通过第二个输入框选择B列中的所有相应金额,我希望如果J1=“D”在B1中返回正值,否则在B1中返回负值,依此类推所有其他行 我试图执行我的宏,但它无法正常工作,我收到错误消息
#NAME?
请在下面找到2个屏幕截图(执行宏之前和之后)以及VBA代码
如果有人能帮我,那就太好了
Sub ReturncorrectsignofamountaccordingtoDorC()
Dim c As Range
Dim WorkRng2 As Range
Dim WorkRng As Range
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Please select the range D/C", xTitleId, WorkRng.Address, Type:=8)
Set WorkRng2 = Application.Selection
Set WorkRng2 = Application.InputBox("Please select the range of amounts", xTitleId, WorkRng.Address, Type:=8)
For Each c In WorkRng2
c.FormulaR1C1 = _
"=IF(c.WorkRng.value=""D"",c.WorkRng2.value= c.WorkRng2.value, c.WorkRng2.value= -c.WorkRng2.value)"
Next c
End Sub
问题是您在字符串中混合了vba。您需要拉出vba并连接:
Range("A1").Formula = "=SUM(" & Range("A2").Address & ")"
参考值c.WorkRng.value
也不正确c
是范围对象,而不是WorkRng
此外,您尝试插入的公式将是循环的,并且会导致许多问题,只需将该值乘以1
或-1
Sub ReturncorrectsignofamountaccordingtoDorC()
Dim c As Range
Dim WorkRng2 As Range
Dim WorkRng As Range
Set WorkRng = Application.InputBox("Please select the range D/C", Type:=8)
Set WorkRng2 = Application.InputBox("Please select the range of amounts", Type:=8)
For Each c In WorkRng2
c.Value = c.Value * IIf(c.Offset(0, WorkRng.Column - c.Column).Value = "D", 1, -1)
Next c
End Sub
就我个人而言,我会使用变体阵列来加快速度:
Sub ReturncorrectsignofamountaccordingtoDorC()
Do
Dim WorkRng As Range
Set WorkRng = Application.InputBox("Please select the range D/C", Type:=8)
Dim WorkRng2 As Range
Set WorkRng2 = Application.InputBox("Please select the range of amounts", Type:=8)
If WorkRng.Cells.Count <> WorkRng2.Cells.Count Then MsgBox "Ranges must be same size"
Loop Until WorkRng.Cells.Count = WorkRng2.Cells.Count
Dim rng1 As Variant
rng1 = WorkRng.Value
Dim rng2 As Variant
rng2 = WorkRng2.Value
Dim i As Long
For i = LBound(rng1, 1) To UBound(rng1, 1)
rng2(i, 1) = rng2(i, 1) * IIf(rng1(i, 1) = "D", 1, -1)
Next i
WorkRng2.Value = rng2
End Sub
Sub-returnCorrectSignOfamountAccordorc()
做
变暗工作范围
设置WorkRng=Application.InputBox(“请选择范围D/C”,类型:=8)
Dim WORNG2 As范围
设置WorkRng2=Application.InputBox(“请选择金额范围”,类型:=8)
如果是WorkRng.Cells.Count WorkRng2.Cells.Count,则MsgBox“范围大小必须相同”
循环直到WorkRng.Cells.Count=WorkRng2.Cells.Count
Dim rng1作为变体
rng1=工作RNG.值
Dim rng2作为变体
rng2=工作rng2.值
我想我会坚持多久
对于i=LBound(rng1,1)到UBound(rng1,1)
rng2(i,1)=rng2(i,1)*IIf(rng1(i,1)=“D”,1,-1)
接下来我
WorkRng2.Value=rng2
端接头
问题在于您在字符串中混合了vba。您需要拉出vba并连接:
Range("A1").Formula = "=SUM(" & Range("A2").Address & ")"
参考值c.WorkRng.value
也不正确c
是范围对象,而不是WorkRng
此外,您尝试插入的公式将是循环的,并且会导致许多问题,只需将该值乘以1
或-1
Sub ReturncorrectsignofamountaccordingtoDorC()
Dim c As Range
Dim WorkRng2 As Range
Dim WorkRng As Range
Set WorkRng = Application.InputBox("Please select the range D/C", Type:=8)
Set WorkRng2 = Application.InputBox("Please select the range of amounts", Type:=8)
For Each c In WorkRng2
c.Value = c.Value * IIf(c.Offset(0, WorkRng.Column - c.Column).Value = "D", 1, -1)
Next c
End Sub
就我个人而言,我会使用变体阵列来加快速度:
Sub ReturncorrectsignofamountaccordingtoDorC()
Do
Dim WorkRng As Range
Set WorkRng = Application.InputBox("Please select the range D/C", Type:=8)
Dim WorkRng2 As Range
Set WorkRng2 = Application.InputBox("Please select the range of amounts", Type:=8)
If WorkRng.Cells.Count <> WorkRng2.Cells.Count Then MsgBox "Ranges must be same size"
Loop Until WorkRng.Cells.Count = WorkRng2.Cells.Count
Dim rng1 As Variant
rng1 = WorkRng.Value
Dim rng2 As Variant
rng2 = WorkRng2.Value
Dim i As Long
For i = LBound(rng1, 1) To UBound(rng1, 1)
rng2(i, 1) = rng2(i, 1) * IIf(rng1(i, 1) = "D", 1, -1)
Next i
WorkRng2.Value = rng2
End Sub
Sub-returnCorrectSignOfamountAccordorc()
做
变暗工作范围
设置WorkRng=Application.InputBox(“请选择范围D/C”,类型:=8)
Dim WORNG2 As范围
设置WorkRng2=Application.InputBox(“请选择金额范围”,类型:=8)
如果是WorkRng.Cells.Count WorkRng2.Cells.Count,则MsgBox“范围大小必须相同”
循环直到WorkRng.Cells.Count=WorkRng2.Cells.Count
Dim rng1作为变体
rng1=工作RNG.值
Dim rng2作为变体
rng2=工作rng2.值
我想我会坚持多久
对于i=LBound(rng1,1)到UBound(rng1,1)
rng2(i,1)=rng2(i,1)*IIf(rng1(i,1)=“D”,1,-1)
接下来我
WorkRng2.Value=rng2
端接头
我试图弄清楚Set WorkRng=Application.Selection的目的是什么,如果没有它,作业对我来说就无法进行…@dwirony是的,我必须重新添加它。不知道为什么。@ScottCraner啊,我弄明白了它为什么会抛出这个错误-因为InputBox
使用了MyRange.Address
的参数,而不是Selection.Address
,啊哈@dwirony是的,谢谢,修复了删除冗余的代码。@ScottCraner,我想在这里提出一个问题,因为我对它感到非常困惑。。。哈我试图弄清楚设置WorkRng=Application.Selection的目的是什么,如果没有它,作业对我来说就无法进行…@dwirony是的,我必须把它加回去。不知道为什么。@ScottCraner啊,我弄明白了它为什么会抛出这个错误-因为InputBox
使用了MyRange.Address
的参数,而不是Selection.Address
,啊哈@dwirony是的,谢谢,修复了删除冗余的代码。@ScottCraner,我想在这里提出一个问题,因为我对它感到非常困惑。。。哈在你的例子中,所有的值都是正的怎么样?在你的例子中,所有的值都是正的怎么样?