代码独立工作,但不作为整个程序的一部分

时间:2018-05-17 17:03:33

标签: excel vba excel-vba

我有一个宏:

  1. 创建新工作簿
  2. 导入.csv文件
  3. 格式化数据(将consol数据拆分为单独的工作表和其他操作)
  4. 将各个工作表导出到不同的工作簿中。
  5. 宏运行良好,直到第4步。

    我在第4步得到了编译错误*。

    当我将step4之后的工作簿保存为另一个工作簿,然后仅运行步骤5。它运作良好。

    我在创建新书时尝试了两种格式.xls和.xlsx,但错误仍然存​​在。

    我无法找到错误的根本原因。

    附录:

    用于创建新工作簿的代码

    Sub AddNew()
    Application.DisplayAlerts = False
        Dim thisWb As Workbook
        Set thisWb = ActiveWorkbook
        Workbooks.Add
        ActiveWorkbook.SaveAs Filename:=thisWb.Path & "\FA Registers by Location.xlsx"
    Application.DisplayAlerts = True
    End Sub
    

    用于将单个工作表导出到工作簿的代码(步骤4)

    Sub SplitWorkbook()
    Dim FileExtStr As String
    Dim FileFormatNum As Long
    Dim xWs As Worksheet
    Dim xWb As Workbook
    Dim FolderName As String
    Application.ScreenUpdating = False
    Set xWb = Application.ThisWorkbook
    DateString = Format(Now, "yyyy-mm-dd hh-mm-ss")
    FolderName = xWb.Path & "\" & xWb.Name & " " & DateString
    MkDir FolderName
    For Each xWs In xWb.Worksheets
        xWs.Copy
        If Val(Application.Version) < 12 Then
            FileExtStr = ".xls": FileFormatNum = -4143
        Else
            Select Case xWb.FileFormat
                Case 51:
                    FileExtStr = ".xlsx": FileFormatNum = 51
                Case 52:
                    If Application.ActiveWorkbook.HasVBProject Then
                        FileExtStr = ".xlsm": FileFormatNum = 52
                    Else
                        FileExtStr = ".xlsx": FileFormatNum = 51
                    End If
                Case 56:
                    FileExtStr = ".xls": FileFormatNum = 56
                Case Else:
                    FileExtStr = ".xlsb": FileFormatNum = 50
            End Select
        End If
        xFile = FolderName & "\" & Application.ActiveWorkbook.Sheets(1).Name & FileExtStr
        Application.ActiveWorkbook.SaveAs xFile, FileFormat:=FileFormatNum
        Application.ActiveWorkbook.Close False
    Next
    MsgBox "You can find the files in " & FolderName
    Application.ScreenUpdating = True
    End Sub
    
    1. 在DateString =格式时编译错误(现在,&#34; yyyy-mm-dd hh-mm-ss&#34;)
    2. Compile Error

      请注意,不包含完整的代码。如果您想查看代码的任何部分,请询问。

1 个答案:

答案 0 :(得分:4)

DateString = Format(Now, "yyyy-mm-dd hh-mm-ss")

该行意味着调用VBA.Strings.Format函数,对吧?尝试完全限定它:

DateString = VBA.Strings.Format(Now, "yyyy-mm-dd hh-mm-ss")

如果这样可以解决您的问题,那么您就是标识符阴影的受害者,并且在范围内的某个地方有Format个功能,但它不具备相同的功能争论的数量。

VBA按以下顺序解析标识符:

  1. 在当前范围/程序中
  2. 在当前模块中
  3. 在当前项目中
  4. 在引用的库中,按照它们出现在添加/删除引用对话框中的顺序
  5. 因此,如果项目中某处有Public Sub Format(),那么任何不合格的Format调用都将解析为Format过程以及任何调用{{1}的调用网站抛出你所看到的编译器错误 - 因为提供的参数不会与解析的VBA.Strings.Format签名中定义的参数匹配。

    所以你有两个选择:

    1. 将您的Format宏/功能/其他内容重命名为
    2. 在任何地方使用完全合格的成员电话
    3. 请注意,这是许多事情之一Rubberduck(我管理的开源VBIDE加载项目)可以警告您:

      "Shadowed declaration" Rubberduck inspection result