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'循环时'的问题。似乎无法找到结束循环的布尔值的主要内容,如果未能解决你的问题,请参考以下文章