【问题标题】:Copy columns to new workbook and save as csv将列复制到新工作簿并另存为 csv
【发布时间】:2019-06-21 11:18:07
【问题描述】:

我正在尝试:

  • 从一个工作簿 (data.xlsx) 复制数据(A 列和 B 列)。
  • 粘贴到新工作簿中(作为值)。
  • 另存为 CSV,文件名取自第三个工作簿 (URLs.xlsx) 中的 A 列。
  • 流程重复,从 data.xlsx 中获取相同的数据(每次粘贴时都是随机的)并粘贴到新的 CSV - URLs.xlsx 中有 200 行,因此我们最终应该有 200 个文件。

我已经阅读了很多主题,以下是我找到的两个:

Excel VBA Copy a Range into a New Workbook
https://www.excelcampus.com/vba/copy-paste-another-workbook/

我的尝试

复制代码并替换网络上各种不同文章中的相关组件。其中一些有效,但是当我添加缺失的位时,我遇到了我不理解的错误。

【问题讨论】:

  • 每次粘贴时数据如何随机化?
  • data.xlsx 文件中有一些 =RANDBETWEEN 函数,用于随机化列 A 和 B 的数字。谢谢
  • 再次感谢您的回复。当我尝试手动执行此操作时,每次我粘贴到新工作簿时,它都会自动刷新 data.xlsx 文件中的随机数生成。这种情况不会继续发生吗?

标签: excel vba


【解决方案1】:

这是一个避免在新工作簿中复制粘贴的示例:

预期输入:

Data.xlsx 范围 A1:B200RANDBETWEEN() 函数:

URLs.xlsx 范围为 A1:A200,其中一些 URL 如下所示:

运行此代码(在我的机器上大约需要 1 秒,用计时器测试):

Dim wbData As Workbook, WBurls As Workbook
Dim CSVFileDir As String, CSVVal As String
Dim A As Long, X As Long, Y As Long, Z As Long

Option Explicit

Sub Transfer2CSV()

Set wbData = Workbooks("data.xlsx") 'Make sure it is open upon running macro
Set WBurls = Workbooks("URLs.xlsx") 'Make sure it is open upon running macro

For X = 1 To 200 'Looping through the 200 rows of WBurls
    CSVFileDir = "C:\YourDrive\" & WBurls.Sheets(1).Cells(X, 1).Value & ".csv"
    CSVVal = ""
    A = FreeFile
    Open CSVFileDir For Output As #A
    With wbData.Sheets(1).Range("A1:B200") ' or whichever range you using here
        .Calculate 'Randomize your range again
        For Y = 1 To 200 'or however many rows you have in column A and B.
            For Z = 1 To 2
                CSVVal = CSVVal & .Cells(Y, Z).Value & ","
            Next Z
            Print #A, Left(CSVVal, Len(CSVVal) - 2)
            CSVVal = ""
        Next Y
    End With
    Close #A
Next X

End Sub

输出:

每个文件看起来像:

【讨论】:

  • 非常感谢 JvdV - 我可以看到它正在根据需要创建文件并且其中填充了数据。但是,它存在问题,因此将花一些时间对其进行审查,看看我是否可以自己解决。再次感谢 - 非常感谢您的帮助!
  • @Tjm92,有什么问题?
  • 此解决方案正确创建了 200 个文档,但是文档中的数据位于水平运行的单行中。 data.xlsx 文件中的数据为 2 列和 200 行。使用此代码的其他一切似乎都完美无缺。
  • @Tjm92,我无法重现该事故,事实上,我重新运行了所有内容并且输出符合预期。请检查数据设置是否相同。
  • @JvdV,是输出文件中连接的 A 列和 B 列; B 列好像是空的
【解决方案2】:

这应该可行。确保您的数据和 URLS 工作簿已打开。

Sub Macro1()

Dim wsData As Worksheet, wsUrl As Worksheet, wbNew as Workbook
Dim CSVDir as String, rngU As Range

Set wsData = Workbooks("data.xlsx").Worksheets(1)
Set wsUrl = Workbooks("URLs.xlsx").Worksheets(1)
Set rngU = wsUrl.Range("A1", wsUrl.Range("A" & wsUrl.Rows.Count).End(xlUp))
CSVDir = "C:\Users\thomas.mcerlean\Desktop\Work\" 'you gave this as your dir
Set wbNew = Workbooks.Add

For Each cell In rngU
    wsData.Range("A1", wsData.Range("B" & wsData.Rows.Count).End(xlUp)).Copy Destination:= wbNew.Worksheets(1).Range("A1")
    wbNew.SaveAs Filename:= CSVDir & cell.Value & ".csv", FileFormat:=xlCSV
Next cell

wbNew.Close SaveChanges:=False
End Sub

【讨论】:

  • 感谢您在这里发表评论 AAA,不胜感激!我为驱动器位置插入了以下内容: CSVDir = "Drive:C:\Users\thomas.mcerlean\Desktop\Work\" 当我通过 F8 逐步执行此操作时,它给了我以下错误:运行时错误“1004”:应用程序定义的或对象定义的错误。在此之前的行打开一个空白文档。这是我做错了吗?
  • 我使用 Drive 来指示您的驱动器号。这可能是 C 或其他字母。在您的情况下,它是 C。因此,设置 CSVDir = "C:\Users\thomas.mcerlean\Desktop\Work\"
  • 我已经修改了答案并尝试了它。效果很好。
  • 非常感谢 - 我有什么办法可以在这里给你评分,还是只是通过投票?这非常有效,您为我节省了很长的时间。现在很高兴 - 谢谢!
  • 啊,我刚刚注意到随机数生成位不起作用 - 正如您在原始 cmets 中所说的那样。 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
相关资源
最近更新 更多