【问题标题】:macro looping from each cell from the basis of 2 ranges基于 2 个范围从每个单元格进行宏循环
【发布时间】:2018-11-06 16:16:39
【问题描述】:

我尝试创建一个带有 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

【问题讨论】:

  • 在你的例子中所有的值都是正数怎么样?

标签: excel vba for-loop


【解决方案1】:

问题是您在字符串中混合了 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

【讨论】:

  • 我试图弄清楚Set WorkRng = Application.Selection 的目的是什么,如果没有它,我的作业将无法进行......
  • @dwirony 是的,我必须将其添加回来。不知道为什么。
  • @ScottCraner Ahh 我知道它为什么会抛出这个错误 - 这是因为 InputBox 正在接受 MyRange.Address 的论点而不是 Selection.Address,啊哈!
  • @dwirony 是的,谢谢,修复了代码以消除冗余。
  • @ScottCraner 我正要在这里提出一个问题,因为我对此感到非常困惑......哈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2020-01-30
相关资源
最近更新 更多