【问题标题】:VBA Print #1 select range (for exporting from Excel to a file)?VBA Print #1 选择范围(用于从 Excel 导出到文件)?
【发布时间】:2013-02-28 01:00:18
【问题描述】:

我有一个简单的宏,可以将所需的单元格导出到 txt 文件。我是否可以不单独告诉宏我要导出哪些单元格,而是选择一个单元格范围?

这是我拥有的非常简单的代码:

Sub TEST()
    Open "C:\text.txt" For Output As #1
        Print #1, Cells(1, 1) & Cells(1, 2)
        Close
End Sub

这样我可以导出 Excel 工作表单元格 A1、A2。但是如果我想导出大范围的单元格,这种方法就不太方便了。那么有没有办法,比如说轻松导出单元格 A1:A100?

谢谢!

【问题讨论】:

    标签: excel vba export


    【解决方案1】:

    我看到 joseph4tw 已经回复了,但我的回答有点不同,可能会给你另一个想法,所以我还是把它放在这里。

    Sub TEST()
        Dim c As Range, r As Range
        Dim output As String
        For Each r In Range("A1:C3").Rows
            For Each c In r.Cells
                output = output & c.Value & ","
            Next c
            output = output & vbNewLine
        Next r
        Open "H:\My Documents\text.txt" For Output As #1
        Print #1, output
        Close
    End Sub
    

    【讨论】:

    • 感谢您提出这个解决方案。我正要改变我的答案,但我意识到这对于 OP 来说是完美的 :)
    • 输出文本文件有一个前导逗号“,”分隔符。我们如何通过相同的脚本摆脱它?
    • 见这里:stackoverflow.com/a/25431598(感谢作者!)。我将编辑我的答案,因为我认为这对任何人来说都是不受欢迎的行为。
    【解决方案2】:

    您可以使用InputBox 并将类型设置为8,这将允许用户在Excel 中单击并选择一个范围。

    这是一个例子:

    Sub test()
        Dim r As Excel.Range, cell As Excel.Range
        On Error Resume Next
        Set r = Application.InputBox("Select Range", "Select Range", Type:=8)
        On Error GoTo 0
        If r Is Nothing Then Exit Sub
    
        Open "C:\text.txt" For Output As #1
        For Each cell In r
            Print #1, cell.Value
        Next
        Close
    End Sub
    

    【讨论】:

    • 有没有办法在宏本身中输入范围?这是一个不错的解决方案,但就我而言,我要导出数百个带有此类宏的 txt 文件,因此我不得不多次选择范围。
    • 我很好奇,你为什么指定 Excel.Range 而不仅仅是 Range?我认为这是非常明智的,但想知道你的推理:)
    • @user2084296 您只需将范围分配给@joseph4tw 示例中的r 变量即可。
    • @mkingston,我前段时间读到如果您完全限定对象并且我刚刚习惯了它,代码实际上将如何更快地编译/运行。报价是:If you declare variables and arguments with a generic Object data type, Visual Basic may have to resolve references to their properties and methods when it encounters them at run time, resulting in a significantly slower process.
    • @mkingston 我同意将代码从一种 Office 产品移动到另一种产品会更容易。一般来说,我在编写代码时喜欢非常明确(甚至到了For i = 1 to 10 ... Next i,您不必输入i,只需Next)。我也发现以后维护起来更容易。
    【解决方案3】:

    我注意到 mkingston 的示例将逗号放在首位。这将导致一切从 .csv 的第二列开始(第一列为空白)。更好的办法是将逗号放在语句的末尾。您可以使用 REPLACE() 删除最后一个“,”,但这不是必需的。

       Dim c As range, r As range
            Dim output As String
            For Each r In range(DataRange).Rows
                For Each c In r.Cells
                    output = output & c.Value & ","
                Next c
                output = output & vbNewLine
    
            Next r
    

    【讨论】:

      【解决方案4】:

      如果您想选择所有非空单元格(contigouos),请使用:

      Range("A1").CurrentRegion.Select
      

      然后你可以用任何你喜欢的方式导出它;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 2015-04-28
        • 2017-11-09
        • 2021-09-24
        • 1970-01-01
        相关资源
        最近更新 更多