Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CSV导入Excel(可变宽度数据)导致#REF问题_Excel_Vba - Fatal编程技术网

将CSV导入Excel(可变宽度数据)导致#REF问题

将CSV导入Excel(可变宽度数据)导致#REF问题,excel,vba,Excel,Vba,我创建了一个excel工作簿,它将原始数据记录在一张“rawData”表上,并完成一大堆有用的工作。我为用户添加了一个主控表,用户可以点击按钮导入新的数据集;替换“rawData”的内容,并使整个工作簿自动更新。包括图表和其他东西。我已经录制了宏的各个部分,并替换了一些东西,以使它能够正常工作。但有几个问题我就是解决不了 参见代码 一个问题是,如果我删除了原始数据表,所有引用都会中断,即使我随后重新创建了它。如果我删除了工作表中的内容,这也会破坏参考文献,使我能够通过工作簿的其余部分进行#REF

我创建了一个excel工作簿,它将原始数据记录在一张“rawData”表上,并完成一大堆有用的工作。我为用户添加了一个主控表,用户可以点击按钮导入新的数据集;替换“rawData”的内容,并使整个工作簿自动更新。包括图表和其他东西。我已经录制了宏的各个部分,并替换了一些东西,以使它能够正常工作。但有几个问题我就是解决不了

参见代码

一个问题是,如果我删除了原始数据表,所有引用都会中断,即使我随后重新创建了它。如果我删除了工作表中的内容,这也会破坏参考文献,使我能够通过工作簿的其余部分进行#REF传播

下一个问题是,我根据一个数据集记录了导入CSV宏。但最终,用户的数据集可能包含数百列。录制的宏中始终包含硬编码的范围。我如何概括它以适应任何CSV宽度

导入的数据显示为表。当我单步执行时,我无法将新数据粘贴到这上面。错误是:

无法完成操作:表不能与数据透视表重叠 报表、查询结果。表、合并单元格或XML映射

我不知道如何将数据作为文本导入。我真的不明白这张桌子是怎么回事。但很明显,它阻止了我过度加热细胞的内容物。有没有一种方法可以导入而不将数据格式化为表

Sub openReportAndFormat()
'
' openReportAndFormat Macro
'




' Kill all existing queries onthis workbook.
 '   While ActiveWorkbook.Queries.Count
 '       ActiveWorkbook.Queries(1).Delete
 '   Wend


 On Error GoTo Oops




' Open your file.
   ' myReport = "C:\Users\thebi\Downloads\sn_billing.csv"
    myReport = Application.GetOpenFilename("Excel Files,*.csv", , "Browse for Your Billing Report")
    'MsgBox myReport

  '  Dim wb As Workbook
  '  Dim ws As Worksheet
  '  Set wb = ActiveWorkbook
  '  Set ws = wb.Sheets("Sheet1")

' Open the file & format it.
    ActiveWorkbook.Queries.Add Name:="billingQuery", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""" & myReport & """),[Delimiter="","", Columns=5, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Change Type"" = Table.TransformColumnTypes(Source,{{""Column1"", Int64.Type}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}, {""Column5"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Change Type"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=billingQuery;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [billingQuery]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
     '   .ListObject.DisplayName = "Billing"
        .Refresh BackgroundQuery:=False
    End With



    ActiveWorkbook.Queries("billingQuery").Delete

    On Error GoTo forgotToDeleteError
' Put in temp and copy all.
' Delete everything in rawData.
' Paste in everything to A1. Format as table.
' delete temp.
    ActiveSheet.Name = "temp"
    Columns("A:E").Select
    Selection.Copy
    Sheets("rawData").Select
    Columns("A:E").Select
    ActiveSheet.Paste
    Sheets("temp").Select
    Application.CutCopyMode = False
    ActiveWindow.SelectedSheets.Delete


    Exit Sub


Oops:
    ActiveWorkbook.Queries("billingQuery").Delete
    MsgBox "A Previous File Grab Crashed and messed up your query. Try again!"


forgotToDeleteError:
   ' Worksheets("rawData").Delete
    ActiveSheet.Name = "rawData"
End Sub

理想情况下,我希望导入任意宽度的CSV文件,并使其覆盖“rawData”工作表的内容,而不破坏任何正向引用。查询已清理,以便可以再次运行。还有基本的错误检查,这样它就不会陷入混乱并破坏所有的引用。。。我是一个新来的人,所以这一切都是猜测工作到这一点!请施以援手

通过访问CSV生成,您可以做一件事。计算出最大宽度并创建一行,该行的长度充满了空数据。这样你就可以得到一个已知的宽度。问题一已解决(尽管如此)

然后在代码中,不要尝试复制和粘贴整个表:但要执行以下操作:

Sub clearCopyPaste()
'
' clearCopyPaste Macro
'


' Set up sheets
    ActiveSheet.Name = "temp"
    Dim temp As Worksheet, rawData As Worksheet, lr As Long, rng As Range
    Set temp = Sheets("temp")
    Set rawData = Sheets("rawData")

' clear data from rawData.
    Sheets("rawData").Select
    lr = temp.Cells(Rows.Count, 1).End(xlUp).Row

    Rows("2:" & lr).Select
    Application.CutCopyMode = False
    Selection.ClearContents

' copy data & paste from temp!
    Sheets("temp").Select
    lr = temp.Cells(Rows.Count, 1).End(xlUp).Row
    Rows("2:" & lr).Select
    Selection.Copy

    Sheets("rawData").Select
    Range("A2").Select
    ActiveSheet.Paste

End Sub
这应该意味着在活动范围下没有任何垃圾,因为在加载新的CSV源文件之前,您会将其清理干净


有更好的答案。

我想知道两件事1)如果您有一个宽度未知的CSV,那么在添加查询时,您如何知道顺序和数据类型?2) 与1相同的原则,您的“有用的东西的整个堆”如何知道使用哪一列?数据结构是可预测的,但包含未知数量的记录。每个记录包含2列并排的数据。因此,我根据=IFERROR()和IF(“,…)类检查来确定哪些列是有用的。然后执行条件列隐藏。并从图形中排除隐藏列。。。诸如此类的事情。