【问题标题】:How to calculate formula with data in file opened with GetOpenFilename?添加 GetOpenFilename 后 VBA 代码不起作用
【发布时间】: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


【解决方案1】:

通过定义工作表和引用而不是依赖选择或活动表,我发现了更可靠的性能。尝试在 range() 和 cells() 引用之前定义正在执行此行并引用的工作表,看看是否有帮助。

将 ws 调暗为工作表 设置 ws = Sheets("外出支票")

底部 = WorksheetFunction.Match((ws.Cells(Rows.Count, 1).End(xlUp)), ws.Range("A:A"), 0)

【讨论】:

  • 谢谢你。但我仍然收到“应用程序定义或对象定义”错误。有什么建议么?
【解决方案2】:

可能是这样的:

Sub All()
    
    Dim FileToOpen As Variant
    Dim NewBatch As Workbook
    Dim Bottom As Long, Header As Variant 'not Long
    
    FileToOpen = Application.GetOpenFilename(Title:="Find batch file")
    If FileToOpen = False Then Exit Sub 'user cancelled open
    
    Set NewBatch = Application.Workbooks.Open(FileToOpen)
    
    'A. CHECK DATE
    If NewBatch.Sheets("ACH PULL").Range("C1").Value <> Date Then
        ProblemMsg "Date on file is different than today's date." & _
                    vbLf & "Ask client for corrected file"
        Exit Sub
    End If
    
    '1. OUTGOING CHECKS
    With NewBatch.Sheets("OUTGOING CHECKS")
        Bottom = .Cells(.Rows.Count, 1).End(xlUp).Row 'last entry in Col A
        Header = Application.Match("Account*", .Range("A:A"), 0) 'not WorksheetFunction.Match

        If IsError(Header) Then 'make sure we located "Account*"
            ProblemMsg "'Account*' not found in ColA on sheet '" & .Name & "'"
        Else
            If Bottom <> Header Then
                ProblemMsg "The batch contains outgoing checks." & vbLf & _
                           "Ask client for corrected file."
                Exit Sub
            End If
        End If
    End With
    
    '...
    '...
End Sub

'Utility sub for displaying error messages
Sub ProblemMsg(msg As String)
    MsgBox "ERROR" & vbLf & msg, vbExclamation, "Please review"
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多