将CSV导入Excel(可变宽度数据)导致#REF问题
我创建了一个excel工作簿,它将原始数据记录在一张“rawData”表上,并完成一大堆有用的工作。我为用户添加了一个主控表,用户可以点击按钮导入新的数据集;替换“rawData”的内容,并使整个工作簿自动更新。包括图表和其他东西。我已经录制了宏的各个部分,并替换了一些东西,以使它能够正常工作。但有几个问题我就是解决不了 参见代码 一个问题是,如果我删除了原始数据表,所有引用都会中断,即使我随后重新创建了它。如果我删除了工作表中的内容,这也会破坏参考文献,使我能够通过工作簿的其余部分进行#REF传播 下一个问题是,我根据一个数据集记录了导入CSV宏。但最终,用户的数据集可能包含数百列。录制的宏中始终包含硬编码的范围。我如何概括它以适应任何CSV宽度 导入的数据显示为表。当我单步执行时,我无法将新数据粘贴到这上面。错误是: 无法完成操作:表不能与数据透视表重叠 报表、查询结果。表、合并单元格或XML映射 我不知道如何将数据作为文本导入。我真的不明白这张桌子是怎么回事。但很明显,它阻止了我过度加热细胞的内容物。有没有一种方法可以导入而不将数据格式化为表将CSV导入Excel(可变宽度数据)导致#REF问题,excel,vba,Excel,Vba,我创建了一个excel工作簿,它将原始数据记录在一张“rawData”表上,并完成一大堆有用的工作。我为用户添加了一个主控表,用户可以点击按钮导入新的数据集;替换“rawData”的内容,并使整个工作簿自动更新。包括图表和其他东西。我已经录制了宏的各个部分,并替换了一些东西,以使它能够正常工作。但有几个问题我就是解决不了 参见代码 一个问题是,如果我删除了原始数据表,所有引用都会中断,即使我随后重新创建了它。如果我删除了工作表中的内容,这也会破坏参考文献,使我能够通过工作簿的其余部分进行#REF
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(“,…)类检查来确定哪些列是有用的。然后执行条件列隐藏。并从图形中排除隐藏列。。。诸如此类的事情。