Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 基于2个范围的每个单元格的宏循环_Excel_Vba_For Loop - Fatal编程技术网

Excel 基于2个范围的每个单元格的宏循环

Excel 基于2个范围的每个单元格的宏循环,excel,vba,for-loop,Excel,Vba,For Loop,我尝试创建一个带有2个输入框的宏,通过第一个输入框,用户选择一个区域,在该区域中,它被写入每个单元格C或D(贷方或借方) 通过第二个输入,用户选择一个范围,在该范围内,用户将相应的金额写入每个单元格 我要做的是: 如果贷方/借方范围内的对应单元格值为“D”,则对应单元格(我指该借方对应的金额)保持为正,否则变为负 例如,如果用户在J列中选择C/D范围,然后用户通过第二个输入框选择B列中的所有相应金额,我希望如果J1=“D”在B1中返回正值,否则在B1中返回负值,依此类推所有其他行 我试图执行我的

我尝试创建一个带有2个输入框的宏,通过第一个输入框,用户选择一个区域,在该区域中,它被写入每个单元格C或D(贷方或借方) 通过第二个输入,用户选择一个范围,在该范围内,用户将相应的金额写入每个单元格

我要做的是:
如果贷方/借方范围内的对应单元格值为“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,我想在这里提出一个问题,因为我对它感到非常困惑。。。哈在你的例子中,所有的值都是正的怎么样?在你的例子中,所有的值都是正的怎么样?