试图将一个 excel 工作表变成一个只有我需要的数据的 csv。基本上我只需要导出包含数据的列。我对使用 vba 宏很陌生。我制作了一个工作表,其中的单元格链接到 A:AF 列中第一行的组合框。问题是,当我尝试将工作表直接另存为 csv 或使用下面的宏导出时,这些组合框链接的单元格似乎被视为数据。第一个(列标题/变量名称)行的示例,然后是我理想情况下在导出的 csv 中看到的一个观察的示例第一行:
Author,Year,Yield,Treatment
Smith,1999,2.6,notill
Author...Treatment 行最初来自链接到组合框的验证列表受限单元格中的选择,Smith...notill 观察是我粘贴的内容。我看到的示例:
Author,Year,Yield,Treatment,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Smith,1999,2.6,notill,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
然后下面的所有观察行的列数相同。这会产生问题,因为如果我在 SAS 中执行 getnames,我现在有新的变量会搞乱合并。我无法指定列,因为每次创建然后导出时,都有不同数量的列。如果您想要的列是已知的,则有办法解决这个问题,例如这个答案。但我希望能够说理想情况下“仅复制非空列”,或者“仅复制第一行中具有以下特定文本之一的列”,因为 A2:AF2 只能包含如果它们不是空的,则是 32 种特定事物之一。这是我将所有这些空白列复制到新工作簿并保存的代码。
Sub CopyToCSV()
Dim MyPath As String
Dim MyFileName As String
'The path and file names:
MyPath = "C:\Users\Data\TxY\"
MyFileName = "TxY_" & Sheets("ValidationHeadings").Range("D3").Value & "_" & Format(Date, "ddmmyy")
'Makes sure the path name ends with "\":
If Not Right(MyPath, 1) = "\" Then MyPath = MyPath & "\"
'Makes sure the filename ends with ".csv"
If Not Right(MyFileName, 4) = ".csv" Then MyFileName = MyFileName & ".csv"
'Copies the sheet to a new workbook:
Sheets("TxYdata").Copy
'The new workbook becomes Activeworkbook:
With ActiveWorkbook
'Saves the new workbook to given folder / filename:
.SaveAs Filename:= _
MyPath & MyFileName, _
FileFormat:=xlCSV, _
CreateBackup:=False
'Closes the file
.Close False
End With
End Sub
我知道这必须非常简单(一个没有任何内容的专栏应该以某种方式脱颖而出,对吧?)但我昨天搜索了大约 4 个小时来了解如何做到这一点。我宁愿不在我变成 csv 的每个工作表中以某种方式划分空列。有什么我可以补充的吗
Sheets("TxYdata").Copy
当我在每个工作表中没有一致的列数时,让它只复制我实际输入数据的列?或者其他可以完成工作的东西。非常感谢!
测试此代码。
Sub TransToCSV()
Dim vDB, vR() As String, vTxt()
Dim i As Long, n As Long, j As Integer
Dim objStream
Dim strTxt As String
Dim rngDB As Range, Ws As Worksheet
Dim MyPath As String, myFileName As String
Dim FullName As String
MyPath = "C:\Users\Data\TxY\"
myFileName = "TxY_" & Sheets("ValidationHeadings").Range("D3").Value & "_" & Format(Date, "ddmmyy")
If Not Right(MyPath, 1) = "\" Then MyPath = MyPath & "\"
If Not Right(myFileName, 4) = ".csv" Then myFileName = myFileName & ".csv"
FullName = MyPath & myFileName
Set Ws = Sheets("TxYdata")
Set objStream = CreateObject("ADODB.Stream")
With Ws
Set rngDB = .Range("a1", "d" & .Range("a" & Rows.Count).End(xlUp).Row)
'Set rngDB = .Range("a1").CurrentRegion <~~ Else use this codle
End With
vDB = rngDB
For i = 1 To UBound(vDB, 1)
n = n + 1
ReDim vR(1 To UBound(vDB, 2))
For j = 1 To UBound(vDB, 2)
vR(j) = vDB(i, j)
Next j
ReDim Preserve vTxt(1 To n)
vTxt(n) = Join(vR, ",")
Next i
strTxt = Join(vTxt, vbCrLf)
With objStream
'.Charset = "utf-8"
.Open
.WriteText strTxt
.SaveToFile FullName, 2
.Close
End With
Set objStream = Nothing
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句