excel VBA'循环时'的问题。似乎无法找到结束循环的布尔值

Posted

技术标签:

【中文标题】excel VBA\'循环时\'的问题。似乎无法找到结束循环的布尔值【英文标题】:Problem with excel VBA 'Loop While'. Cannot seem to find boolean value to end the loopexcel VBA'循环时'的问题。似乎无法找到结束循环的布尔值 【发布时间】:2021-06-06 01:11:48 【问题描述】:

大家早上好。我正在构建一个项目财务模型,该模型需要我通过使用复制/粘贴循环表来打破一些循环。

现在,我正在使用代码,其中需要“Fin 语句”选项卡中的一个单元格在循环切断之前转到 True。但由于某种原因它不起作用。我需要你的帮助来修复代码。

Sub Cir_Reinvestment()
'
' Cir_Reinvestment Macro
    
' For Scenario 1
    
    Dim I As Long
    Dim Rngcashchk As Boolean

    'Cell where sheet checks for True/False statement
    Rngcashchk = Sheets("Fin Statements").Cells(105, E)
    


    'Copy Paste Actions start here
    
    Sheets("Inputs").Select
    Range("Macro.Cashflow.Closing.Copy").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("Macro.Cashflow.Closing.Paste").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Sheets("Inputs").Select
    Range("MacroRS.Invested.Fund.Copy").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("MacroRS.Invested.Fund.Paste").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("MacroRS.REIncome.Copy").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("MacroRS.REIncome.Paste").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Range("Macro.Cashflow.Closing.Copy").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Range("Macro.Cashflow.Closing.Paste").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
 
'Loop should end once Cell is True

 Loop Until Rngcashchk = True

End Sub

【问题讨论】:

1. 循环的Do 部分在哪里? 2.您可能还想查看How to avoid using Select in Excel VBA 您似乎没有在发布的代码中的任何地方更改 Rngcashchk。单元格中的值会随着代码的执行而改变吗? 什么时候结束,Rngcashchk 永远不会改变。 Cell(105, E) 是否可能是其中一个范围的一部分? 但它不起作用无济于事。有错误吗?如果有,它的编号和描述是什么?如果E 不是定义的名称,那么Cells(105, E) 将不起作用。请改用Cells(105, "E")。您能否将命名范围替换为实际地址(其中只有 6 个)? 好的,它正在使用“E”,但循环没有结束。该怎么办? 【参考方案1】:
    我在Loop Until 前面没有看到关键字Do 顺便说一句,在复制/粘贴之前选择一个范围是不必要的。你可以这样做: Range("A1").Copy Range("B1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 您可以在所有复制粘贴进度结束时拨打Application.CutCopyMode = False一次

【讨论】:

我可能开始学习一些基本的错误。 1. Do 不应该是循环开始的地方吗? 2. 我将其添加到代码中。 3. 也会添加。谢谢。【参考方案2】:

由于我不确切知道什么不起作用,因此很难为您提供帮助。 但这里有一个关于如何编写代码的建议,如果它始终遵循与命名范围相同的模式,如示例所示。 由于我们多次执行相同的操作,因此我将其分解为一个单独的子循环,我们可以从主循环中调用它。 但我会建议运行此代码,因为没有什么可以阻止 ot 永远循环。因此,我暂时将循环注释掉了。

Sub Cir_Reinvestment()
  Dim Rngcashchk As Boolean
  Rngcashchk = Sheets("Fin Statements").Cells(105, "E")

  'Do
      CopyPaste ("Macro.Cashflow.Closing")
      CopyPaste ("MacroRS.Invested.Fund")
      CopyPaste ("MacroRS.REIncome")
  'Loop Until Rngcashchk

End Sub


Sub CopyPaste(rng As String)

  Sheets("Inputs").Range(rng & ".Copy", Range(rng & ".Copy").End(xlToRight)).copy
  Sheets("Inputs").Range(rng & ".Paste").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone

End Sub

【讨论】:

我想添加一个循环限制器,我该怎么做? 我的代码的问题是循环没有停止。如何让 VBA 停止循环?如何让它在“Fin Statements”工作表中读取单元格(105,E)中的 True 语句,以便当单元格变为真时,复制粘贴循环停止。 在代码中结束循环会更容易。您如何控制和更改 E105 中的语句?如果始终为真,则不会出现循环,如果不为真,则将是无限循环。你希望它循环多少次?而且,如果是可变金额,您如何决定? 所以这是一个取决于满足条件的真/假语句。当经过 x 次复制粘贴后,满足条件,它最终将变为 True。因此,当 E105 中的语句从 False 变为 True 时,我需要它停止。 既然我们没有直接影响那个单元格,我猜里面有某种公式可以检查进度?确保在每个循环上正确计算(但应该这样做)。如果只是一个数字,在代码中更容易 pu。【参考方案3】:

圆形

未经测试(希望CashChk 会变成True)。 重新考虑是否真的需要将第一个范围复制两次(在循环的开头和之后)。

守则

Option Explicit

Sub Cir_Reinvestment()
'
' Cir_Reinvestment Macro
    
' For Scenario 1
    
    Dim CopyRanges As Variant
    CopyRanges = Array("Macro.Cashflow.Closing.Copy", _
        "MacroRS.Invested.Fund.Copy", "Macro.Cashflow.Closing.Copy")
    Dim PasteRanges As Variant
    PasteRanges = Array("Macro.Cashflow.Closing.Paste", _
        "MacroRS.Invested.Fund.Paste", "Macro.Cashflow.Closing.Paste")
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim First As Long: First = LBound(CopyRanges)
    Dim Last As Long: Last = UBound(CopyRanges)
    Dim crg As Variant: ReDim crg(First, Last)
    Dim prg As Variant: ReDim prg(First, Last)
    
    Dim n As Long
    With wb.Worksheets("Inputs")
        For n = First To Last
            With .Range(CopyRanges(n))
                Set crg(n) = .Parent.Range(.Offset, .End(xlToRight))
            End With
            With .Range(PasteRanges(n))
                Set prg(n) = .Resize(crg(n).Rows.Count, crg(n).Columns.Count)
            End With
        Next n
    End With
    
    Dim cashRg As Range
    Set cashRg = wb.Worksheets("Fin Statements").Cells(105, "E")
    
    Dim CashChk As Boolean
    Do
        CashChk = cashRg.Value
        For n = First To Last
            prg(n).Value = crg(n).Value
        Next n
        prg(First).Value = crg(First).Value
    Loop Until CashChk = True

End Sub

【讨论】:

我会试试这段代码,看看效果如何。谢谢。刚接触 VBA,因此尝试学习技巧。 是的,相同的粘贴必须在开始和结束时发生,以完全关闭循环并平衡工作表中的内容。 4 我在 Ln27 Set crg(n) = .Parent.Range(.Offset, .End(xlToRight)) 尝试了“脚本超出范围”的代码 您是在一个工作表中复制/粘贴还是有多个工作表?如果有,请将“Inputs”调整为实际名称。如果有多个,请说明清楚。 有多张工作表。 true/false 语句在“Fin 语句”中,当它从 false 变为 True 时需要停止循环。

以上是关于excel VBA'循环时'的问题。似乎无法找到结束循环的布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA在循环内复制和粘贴循环

Excel VBA:宏无法识别循环中的 For

Excel vba:.find 函数返回运行时错误 91

嵌套循环导致Excel崩溃

高分跪求 VBA word中实现循环搜索 并在WORD中找到列表 再根据已有数据自动填写进本行其它列

2010(2013)Excel VBA中无限循环的控制突破