【问题标题】:Excel: Specify table columns in .csv export macroExcel:在 .csv 导出宏中指定表格列
【发布时间】:2018-11-10 22:15:43
【问题描述】:

我有一个包含多个工作表的工作簿,每个工作表都包含一个库存清单。在该工作簿中,我有另一个“生成订单”工作表,其中包含一个表,我已设置该表以合并其他工作表中的数据。我想要该工作表上的一个名为“导出订单”的按钮,它将generateOrder 表的内容导出为 .csv 文件。

要注意的是,为了将订单上传到供应商的系统,.csv 文件必须只包含商品编号和数量,设置为“数量,数量”,每件商品单独一行。

目前我已经设置了这个宏:

Sub export_button()

    Dim tbl As ListObject
    Dim csvFilePath As String
    Dim fNum As Integer
    Dim tblArr
    Dim rowArr
    Dim csvVal

    Set tbl = Worksheets("Generate Order").ListObjects("generateOrder")
    csvFilePath = "C:\Users\username\Desktop\order.csv"
    tblArr = tbl.DataBodyRange.Value

    fNum = FreeFile()
    Open csvFilePath For Output As #fNum
    For i = 1 To UBound(tblArr)
        rowArr = Application.Index(tblArr, i, 0)
        csvVal = VBA.Join(rowArr, ",")
        Print #1, csvVal
    Next
    Close #fNum
    Set tblArr = Nothing
    Set rowArr = Nothing
    Set csvVal = Nothing

End Sub

通过大量谷歌搜索,我设法让它工作,以便它导出 generateOrder 的内容并将其保存为 .csv,但我正在尝试找出以下修改:

  • 我只想导出名为PUBLISHER ITEM #REORDER QTY 的两列(按此顺序)。如果重要的话,第一列标题中的 PUBLISHER 和 ITEM 之间有一个换行符。
  • 我希望将文件命名为value in cell C3-order-current date.csv
  • 如果它们不存在,我希望宏在工作簿所在的同一文件夹中创建一个名为“Orders”的子文件夹,然后在 Orders 中创建一个名为 value in cell C3 的子文件夹,然后保存那里的文件(而不是像现在那样放到桌面上)。

我需要弄清楚所有这些,但如果你至少可以帮助我弄清楚如何只获取两列,我可以尝试弄清楚如何以我想要的方式保存它。非常感谢!

【问题讨论】:

    标签: vba excel csv


    【解决方案1】:

    从 listobject 的标题行中收集两个所需列的列索引号,并使用它们来解析 databodyrange 值的数组。

    dim c1 as long, c2 as long
    
    Set tbl = Worksheets("Generate Order").ListObjects("generateOrder")
    csvFilePath = "C:\Users\username\Desktop\order.csv"
    tblArr = tbl.DataBodyRange.Value
    
    'you should really know where the two columns are but this should fetch their
    'position from the header row. Hard-code the positions if you run into trouble.
    c1 = application.match("publisher" & vblf & "item #", tbl.HeaderRowRange, 0)
    c2 = application.match("reorder qty", tbl.HeaderRowRange, 0)
    
    fNum = FreeFile()
    Open csvFilePath For Output As #fNum
    For i = LBound(tblArr, 1) To UBound(tblArr, 1)
        csvVal = Join(array(tblArr(i, c1), tblArr(i, c2)), ",")
        Print #1, csvVal
    Next
    

    请注意,我正在查找"publisher" & vblf & "item #"publisher 后面没有空格。 excel 单元格中的多行值仅使用换行;不是回车和换行。

    【讨论】:

    • 嗯,这似乎不起作用。我收到“对象不支持此属性或方法”错误,调试器突出显示 c1 行。
    • 啊,发现了问题:如果我删除了ListObject(所以将其更改为application.match("publisher" & vblf & "item #", tbl.HeaderRowRange, 0),那么它就可以工作了。c2 变量还需要针对“重新排序数量”标题而不是“Item. " 谢谢!我会编辑答案并接受。
    • 我的错。我把它写在脑海中,并添加了一个不必要的 ListObject。编辑反映以上。感谢您了解这一点。
    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2017-04-28
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多