【问题标题】:VBA data transfer from one workbook to another, data type mismatch errorVBA 数据从一个工作簿传输到另一个工作簿,数据类型不匹配错误
【发布时间】:2013-12-27 17:58:29
【问题描述】:

我是 VBA 新手,但正在学习。我自己编写了以下大部分代码,其中一些是继承的。我的目标是遍历多个文本文件(每个都包含一组独特的原始数据)并将该数据复制(或以其他方式传输)到我制作的分析模板中,然后将其“另存为”具有与原始数据文本文件相同的文件名。我已经为此工作了好几天,并且已经进行了大量搜索以达到这一点,但是,我目前遇到了“运行时类型'13'错误 - 数据类型不匹配”,我没有'不明白,所以我不知道如何克服它。错误是@"Data.Sheets(Sheet1).Range("A1:G180000").Copy。如果我注释掉上述行及其后面的行并使用上面的行 ("Template.Sheets(Sheet1). Range("A1:G180000").Value...") 我仍然得到同样的错误。我的代码发布在下面,非常感谢任何帮助。谢谢:)

Sub Shift_Load_Data_Plotter_Template()

'Josh Smith
'12/27/2013
'Shift Load Data Plotter Template
'This macro will bring up the Open dialog box so you can open multiple text files and analyze them using the Shift Load Data Plotter Template

'Brings up the Open window so you can select multiple excel files to import
    Dim fn As Variant, f As Integer
    Dim FileName As String
    'Data is the source workbook and Template is the destination workbook
    Dim Data As Workbook
    Dim Template As Workbook

    fn = Application.GetOpenFilename("Text files,*.txt", _
    1, "Select One Or More Files To Open", , True)
    If TypeName(fn) = "Boolean" Then Exit Sub
    'the line below was modified from from just "workbooks.open "Z:\..." to "Set Template = Workbooks.open..."
    'opens the Shift Load Data Analyzer Template workbook and sets the "Template" variable equal to said workbook
    Set Template = Workbooks.Open("Z:\General Reference, Tools\Shift Load Data Analyzer Template.xlsx")


    For f = 1 To UBound(fn)
    'the line below was modified from just "workbooks.open fn(f)" to what it shows now
    'sets the "Data" variable equal to the workbook which contains the data from the text file
    Set Data = Workbooks.Open(fn(f))
    FileName = ActiveWorkbook.Name
    'Data.Activate



    'Template.Sheets(Sheet1).Range("A1:G180000").Value = Data.Sheets(Sheet1).Range("A1:G180000").Value

    Data.Sheets(Sheet1).Range("A1:G180000").Copy
    Template.Sheets(Sheet1).Range("A1").PasteSpecial (xlPasteValues)


    'the line below used to be "ActiveWorkbook.SaveAs..."
    Template.SaveAs FileName:="Z:\" & FileName & ".xlsx"

    Data.Close


    Next f

End Sub

【问题讨论】:

  • 你在哪一行得到错误?
  • 如果您只想复制值而不是格式,则 pior 逻辑会更好,即'Template.Sheets(Sheet1).Range("A1:G180000").Value = Data.Sheets(Sheet1).Range("A1:G180000").Value

标签: excel vba


【解决方案1】:

行:

Data.Sheets(Sheet1).Range("A1:G180000").Copy

应该是这样的:

Data.Sheets("Sheet1").Range("A1:G180000").Copy

如果您指的是工作表名称,则需要在工作表名称周围加上引号(Sheets() 函数正在查找您在 Excel 选项卡上看到的工作表名称,而不是 Sheet1、Sheet2、Sheet3 等。见 VBA 屏幕)。否则你可以这样写:

Data.Sheet1.Range("A1:G180000").Copy

【讨论】:

  • +1 好眼力...错过了那个。您也可以通过索引号来引用它,如下所示:Data.Sheets(1).Range("A1:G180000").Copy
  • Philorube,我尝试了您的建议,但我收到“运行时错误 438:'对象不支持此属性或方法'”。关于引号,据我了解,如果我省略引号,宏将引用 Sheet1,即使我稍后将其重命名为其他名称。如果我错了,请纠正我。
  • 如果您希望引用静态工作表名称,您必须使用以下语法:Data.Sheet1.Range("A1:G180000").Copy OR as PermaNoob 说 Data.Sheets(1).Range ("A1:G180000").复制
  • PermaNoop、philorube 和 mrtgold:谢谢大家的帮助。解决方案是 Data.Sheets(1).Range("A1:G180000").Copy。我不明白为什么这与我所拥有的不同以及为什么它可以解决问题,但在这一点上,我很高兴问题得到解决。非常感谢大家!
  • @user3140168 这是因为在 VBA 中引用工作表只有两种方法:按名称,即Sheets("Sheet1") 带有引号或按索引,即 Sheets(1) 不带引号。您使用引号让它知道您指的是工作表的名称,而不是在创建时分配给它的编号。您这样做的方式省略了引号,让 Excel 知道要查找该索引号。但是,Sheet1 不是数字,因此 Excel 抛出了错误。
【解决方案2】:

尝试将其更改为:

    Data.Sheets(1).Range("A1:G180000").Copy
    Template.Sheets(1).Range("A1").PasteSpecial (xlPasteValues)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2017-02-26
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多