首页 > 解决方案 > Excel VBA - 声明为整数的变量不保存整数值(运行时错误 1004)

问题描述

我一直在尝试调试几个小时,出现运行时错误“1004”:应用程序定义或对象定义错误。我已经找到了导致我认为错误的原因,但无法找出原因。

我正在处理两张具有相同代码的工作表。
bSheet1 = True '如果代码从 sheet1 运行)
bSheet2 = True '如果代码从 sheet2 运行)

两个布尔变量的初始值都为 False。

如果 bSheet1 = True then iRowYear = iRowYear_Sheet1 '在代码中赋值,irowYear_Sheet1 =4
if bSheet2 = True then iRowYear = c1.Row-2

iRowYear 被声明为与常规变量一样的整数。Sheet1 将是相同的行号。我已将 iRowYear_Sheet1 声明为一个整数,并在代码前面为其分配了值 4 ("iRowYear_Sheet1=4)。"c1" 是单元格范围,声明为范围。代码使用它从第一个项目名称到最后一个项目名称循环遍历每个单元格。
年份总是在 Sheet2 中的项目名称上方两行。

调试时计算和布尔值都正确显示...当我将鼠标悬停在“c1.Row-1”上时,行号显示正确,但 iRowYear 继续显示“0”。尽管“If”语句成立,并且在单步执行时会读取代码。

处理 Sheet1 时代码工作正常,但对于工作表 2,计算值“c1.Row-1”根本不会保存在 iRowYear 变量中,并且稍后会在代码中引发错误。

有时,通常是第一次运行时它实际处理Sheet2的数据,但随机卡住,一旦卡住它继续抛出错误,每次指示iRowYear为“0”。

----------附加信息------------ 有很多带有各种调用的代码,所以不能粘贴所有内容......我也在此处简化变量名称。这是立即循环开始的地方。代码继续关闭循环并结束 If 语句......并且对于 sheet1 运行良好。这是针对 Sheet2 的,其中下面的最后一条语句有错误。随机错误有时会出现在同一变量(iRowYear)的代码中,显示为零:

选项显式

Global c1 as range
Global iRowYear As Integer
Global Const iRowYear_Sheet1 = 4 'Row# 对于 sheet1 相同,对于 sheet2 不同

.....'在此之前有循环和条件...仅粘贴立即循环的开始...循环和条件正常

对于 wsSchedule.Range(Cells(iRowFirst, iCol_Status), Cells(iRowLast, iCol_Status)) 中的每个 c1

如果 c1.Value2 = "GO" 那么

    If bSheet1 = True Then iRowYear = iRowYear_Sheet1    
    If bSheet2 = True Then iRowYear = (c1.Row - 2)    

    iColLast = wsSchedule.Cells(iRowYear, 130).End(xlToLeft).Column    

'ETC...

最后一行显示 iRowYear 为零时出错,即使“c1.Row-2”在鼠标悬停时显示正确的整数值。bSheet1 显示为假,bSheet2 显示为真,鼠标悬停。代码正确执行,但 iRowYear 没有存储“c1.Row-2”的输出......它仍然为零。

标签: excelvbavariablesintegersave

解决方案


通过修改“If”语句解决了问题。
在我的实际代码中,我在 If 语句中为两个变量赋值:

If bSheet2 = True Then iRowYear = (c1.Row-2) AND (iRowMonth=c1.Row-1)

我愚蠢地在我的问题中省略了 iRowMonth 以节省时间。将 If 语句更改为:

If bSheet2 = True Then  
    iRowYear = c1.Row-2  
    iRowMonth = c1.Row-1  
End If

仍然有点困惑,因为有时代码对于 Sheet1 仍然可以正常运行。

感谢大家的投入,对于不完整的问题,我深表歉意。


推荐阅读