变量仅在第二次运行宏后获取值

Variable get value only after the second run of the macro

提问人:FoFE 提问时间:9/28/2023 最后编辑:braXFoFE 更新时间:9/29/2023 访问量:80

问:

我的问题是 variable1 没有得到“1”值。我已经多次检查了所调查的单元格是否包含“1111”值。如果我第二次运行宏,变量 1 将获得“1”值,但第一次永远不会。正确的工作簿和工作表已激活(已选中)。Variable1 是整数和公共的。该代码也已经在模块和工作簿中尝试过。

可能是什么问题?谢谢就是进步!

variable1 = 0

Workbooks.Open "workbook1.xlsx"

Workbooks("workbook1.xlsx").Activate

Workbooks("workbook1.xlsx").Worksheets("sheet1").Activate

For i = 1 To 300
    If Cells(i, 2) = "1111" Then
    variable1 = 1
    Else
    End If
Next i

If variable1 = 1 Then
    GoTo xxx
Else
End If

还在for循环中尝试了以下操作,但结果相同:

Workbooks("workbook1.xlsx").Worksheets("sheet1").Cells(i, 2)

如果我手动打开“workbook1.xlsx”,而不是运行宏,结果就可以了。

我还尝试了打开工作簿后等待 5 秒的时间,但结果是挪威克朗。

Excel VBA for 循环 变量

评论

1赞 Shrotter 9/28/2023
单元格是否包含值(数字)或文本?
0赞 Black cat 9/28/2023
也许您后来在查找它的区域中设置了一个单元格值“1111”。
0赞 FoFE 9/28/2023
Shrotter,如果单元格格式是问题所在,我认为第二次运行应该给出相同的结果(variable1=0)。我已经尝试过cells(i,2).value=“1111”,但结果是一样的。黑猫,“Workbook1”已经包含“1111”值,用于打开和运行 macri。
0赞 Shrotter 9/28/2023
您可以尝试 If Cells(i, 2) = 1111 Then .所以你不会与字符串进行比较
0赞 FunThomas 9/28/2023
您应该学习如何在不使用 activate 或 select 的情况下进行编码。也就是说:使用调试器,将断点设置为代码的开头(可能是循环的顶部),然后单步执行代码以观察发生了什么。

答:

0赞 Notus_Panda 9/29/2023 #1

这就是我使用的,稍微清理了你的代码,但保持了大部分的原样,所以很容易理解错误可能出在哪里:

Option Explicit
Public variable1 As Integer
Sub test()
    variable1 = 0
    Dim wb As Workbook
    Set wb = Workbooks.Open(Filename:="Q:\Test\TestFile.xlsx") 'change this to your actual path
    Dim i As Long
    With wb.Worksheets("Sheet1") 'change as needed
        For i = 1 To 300
            'Debug.Print .Cells(i, 2).Value 'for checking the values while testing
            If .Cells(i, 2).Value = "1111" Then
                variable1 = 1
            End If
        Next i
    End With
        
    If variable1 = 1 Then
        GoTo xxx
    End If
    Debug.Print "Alas, no success :c"
    Exit Sub
xxx:
    Debug.Print "Success!"
End Sub

我在 B 列中隐藏了 2 个 1111 作为数字,再往下隐藏一个“1111”(文本),当它找到文本“1111”时,它直接转到了 xxx。希望这能帮助您了解哪里出了问题,但如果这对您不起作用,请告诉我。

评论

0赞 FoFE 9/29/2023
您好,感谢您的帮助!但不幸的是,它不起作用。我总是得到 0 作为变量值。我把以下内容放在 for 循环之后和之前:.cells(7,2)=“test” ->并且它有效(“test”在正确的单元格中),因此 for 循环在正确的 wb 和工作表上工作。我在 for 循环中放置以下内容:msgbox(.cells(i,2)) 并且它有效,并且在 msgbox 中看到了“1111”值,所以它应该没问题。但结果仍然是挪威克朗。当我手动打开工作簿,然后启动宏时,我的代码没问题。如果宏打开工作簿,则结果为 NOK。这很奇怪......
0赞 Notus_Panda 9/29/2023
您的值是在 B 列文本还是数字中?
0赞 FoFE 9/29/2023
发现问题。我将值复制到另一个工作簿,并将格式从常规更改为数字,现在结果没问题。所以这可能是根本原因。但是我仍然不明白,如果我运行宏 2 次,结果怎么会好(使用一般格式)?格式与第一次运行时相同...
0赞 Notus_Panda 9/29/2023
我不知道为什么第二次可以,除了进行某种重新计算之外,例如当您在文本格式的单元格中有一个公式并将格式更改为常规格式但它不会重新计算它时。我提供的代码在第一次运行它时工作正常,它搜索 1111(文本),如果我将其调整为如果我想搜索一个数字,它会正常工作。有时我不得不认输,承认失败,找到根本原因,因为这会占用太多时间。请记住 = 1111 表示数字,=“1111” 表示文本。.Cells(i, 2).Value = 1111
1赞 FoFE 9/29/2023
.单元格 (i,2)。值 = 1111 是解决方案,现在它起作用了!我已经在 cells(i,2).value=“1111” 之前尝试过,但使用“1111”。所以这是错误的。非常感谢!:)