【发布时间】:2022-11-18 08:02:15
【问题描述】:
我需要帮助找出问题所在。我写了一段很长的代码,基本上通过分离和组合不同工作表上的信息来重新格式化工作簿,然后将每张工作表分别保存为 CSV。这是我的代码的开头:
Sub All()
Dim Bottom As Long
Dim Header As Long
> 'A. CHECK DATE
If ThisWorkbook.Sheets("ACH PULL").Range("C1") <> Date Then
MsgBox "ERROR" & Chr(10) & "Date on file is different than today's date" & Chr(13) & "Ask client for corrected file"
Exit Sub
Else
> '1. OUTGOING CHECKS
Sheets("OUTGOING CHECKS").Select
Bottom = WorksheetFunction.Match((Cells(Rows.Count, 1).End(xlUp)), Range("A:A"), 0)
Header = WorksheetFunction.Match("Account*", Range("A:A"), 0)
If Bottom <> Header Then
MsgBox "ERROR" & Chr(10) & "The batch contains outgoing checks" & Chr(13) & "Ask client for corrected file"
Exit Sub
Bottom 和 Header 分别用于查找范围的标题和最后一行。我在单独的工作表上的代码中多次使用它。
当我从需要修改的文件中运行代码时,代码运行良好。但是我需要将它分配给另一个电子表格的按钮,以通过VBA打开要修改的文件,然后应用代码。所以我添加了这个:
Sub All() Dim FileToOpen As Variant Dim NewBatch As Workbook Dim Bottom As Integer Dim Header As Integer FileToOpen = Application.GetOpenFilename(Title:="Find batch file") If FileToOpen <> False Then Set NewBatch = Application.Workbooks.Open(FileToOpen) End If 'A. CHECK DATE If Sheets("ACH PULL").Range("C1") <> Date Then MsgBox "ERROR" & Chr(10) & "Date on file is different than today's date" & Chr(13) & "Ask client for corrected file" Exit Sub Else '1. OUTGOING CHECKS Sheets("OUTGOING CHECKS").Select Bottom = WorksheetFunction.Match((Cells(Rows.Count, 1).End(xlUp)), Range("A:A"), 0) Header = WorksheetFunction.Match("Account*", Range("A:A"), 0) End If If Bottom <> Header Then MsgBox "ERROR" & Chr(10) & "The batch contains outgoing checks" & Chr(13) & "Ask client for corrected file" Exit Sub .. The rest of the code现在,当我尝试运行它时,一切顺利,直到出现以下行:
底部 = WorksheetFunction.Match((Cells(Rows.Count, 1).End(xlUp)), Range("A:A"), 0)
我得到 1004 或 400 错误。我调暗了我需要使用的两个整数,我尝试进行多项更改,包括激活工作簿,但仍然不确定是什么导致了这部分代码中的问题。
我有两个部分(VBA 打开工作簿和重新格式化代码)分开工作,但我不能将它们组合起来!
在使用它们之前,我将需要使用的两个整数调暗。 我尝试进行多项更改,包括
NewBatch.Activate
但这实际上并没有什么不同,因为打开的工作簿已经被激活。我尝试设置 Bottom 和 Header 的值,但这也不起作用。
谢谢!
【问题讨论】:
-
您的目标是永远不要在没有为上下文指定工作表的情况下使用
Range()、Cells()等,否则这两个(在常规代码模块中)都将引用ActiveSheet -
@TimWilliams,我完全同意。但这不是导致本例错误的原因。正确的?
-
Bottom = WorksheetFunction.Match((Cells(Rows.Count, 1).End(xlUp)), Range("A:A"), 0)正在查找 Col A 中第一个单元格的行,该行具有 Col A 中最后一个占用的单元格中的值。这是意图吗?每当您打开多个工作簿时,最好始终使用wbVar.Sheets()而不仅仅是Sheets(),这样您的代码中发生的事情就一目了然,而无需扫描最近的 Activate/Select 语句来获取上下文。 -
@TimWilliams 是的,这是为了查找 A 列具有值的最后一行的编号。我以前从未使用过
wbVar。您能否说明如何使用它来修复我的错误。我试图用它来代替Sheets但我得到了一个 424 对象所需的代码。我必须先定义它吗? -
我引用的行没有找到最后占用的行,除非 ColA 中的值都是唯一的(例如,如果最后使用的单元格 A500 有“hello”并且“hello”也出现在 A10 中,那么
Bottom是 10 而不是 500 )Cells(Rows.Count, 1).End(xlUp).Row将是 ColA 中最后占用的行。
标签: excel vba excel-formula long-integer getopenfilename