【问题标题】:Get formatted values from a multi-cell range从多单元格范围获取格式化值
【发布时间】:2015-01-30 22:18:06
【问题描述】:
Dim myText As String
myText= Range("a3").Text

返回单元格 A3 中的格式化值,但是

myText= Range("a3:c7").Text

给我一​​个错误。

如何从多单元格区域获取表示格式化值的字符串,同时保留数字格式?即输出文本的格式与从范围复制粘贴到文本编辑器的格式相同。

【问题讨论】:

  • 注意:您可以使用 .Text 在单元格中获取可见的格式化结果,也可以使用 .Value 从单元格中获取底层的未格式化值

标签: vba excel


【解决方案1】:

使用单个语句(无循环)将多个单元格值放入数组的唯一方法是使用 Variant 数组。

Dim varItemName As Variant
varItemName = Range("a3:c7")

如果您确实需要将名称输入String,那么稍后使用它们时只需CStr

output = FunctionRequiringStringArgument(CStr(varItemName(1,2))

编辑:好的,好的,你想要格式与工作表中相同的字符串。

这是一个完整的工作示例。

Dim strMyFormat1 As String
Dim varItemName As Variant
Dim strItemName() As String
Dim strItemNameBF() As String
Dim iCol As Long
Dim iRow As Long
Dim rngMyRange As Range

Set rngMyRange = Range("A3:C7")
varItemName = rngMyRange
ReDim strItemName(LBound(varItemName, 1) To UBound(varItemName, 1), _
    LBound(varItemName, 2) To UBound(varItemName, 2))

'// Take a sample of the format
strMyFormat1 = Range("A3").NumberFormat

'// Apply format sample to all values
For iRow = LBound(varItemName, 1) To UBound(varItemName, 1)
    For iCol = LBound(varItemName, 2) To UBound(varItemName, 2)
        strItemName(iRow, iCol) = Format(varItemName(iRow, iCol), strMyFormat1)
    Next iCol
Next iRow
'// Can also apply to only some values -- adjust loops.
'// More loops go here if many format samples.

'// If all cells have different formats, must use brute force -- slower.
ReDim strItemNameBF(1 To rngMyRange.Rows.Count, _
    1 To rngMyRange.Columns.Count)
For iRow = 1 To rngMyRange.Rows.Count
    For iCol = 1 To rngMyRange.Columns.Count
        strItemNameBF(iRow, iCol) = rngMyRange.Cells(iRow, iCol).Text
    Next iCol
Next iRow

【讨论】:

  • 输出文本的格式与我们在从范围复制并粘贴到记事本时得到的格式一样。
  • 已编辑答案以解决此问题。我想我被双重“while”弄糊涂了。
【解决方案2】:
For Each c In Range("a3:c7")
    ItemName = c.Text
Next c

这会给你一个接一个的单元格。

【讨论】:

  • 如果你有一个大数据集,那么循环遍历这个范围会非常慢。但它只适用于几个细胞。此外,使用 .Text 可以截断您的一些信息,因为它只返回用户看到的内容。
  • 我投了反对票??????好的,在我看来,这是一个完美的 Excel 内置解决方案,可以访问一个范围内的每个单元格(对于少量单元格)。从 OP 我不知道他想对数据做什么。所以问题中的示例是大约 15 个单元格 ==> 完美解决方案。我知道循环遍历单元格并不快。如果有大量数据集,则将数据加载到内存中(请参阅 Jean-Francois Corbetts 的回答)。我个人使用 Perl 处理我的数据(约 40000 个大型数据集),仅使用 Excel 进行分析和可视化。
【解决方案3】:

这是此处帖子之一的修改版本,它对我有用。

    Function Range2Text(ByVal my_range As Range) As String
        Dim i As Integer, j As Integer
        Dim v1 As Variant
        Dim Txt As String

        v1 = my_range
        For i = 1 To UBound(v1)
            For j = 1 To UBound(v1, 2)
                Txt = Txt & v1(i, j)
            Next j
            Txt = Txt & vbCrLf
        Next i

        Range2Text = Txt
    End Function

【讨论】:

    【解决方案4】:

    创建一个集合并遍历范围的所有区域并将文本收集到 集合。

    【讨论】:

      【解决方案5】:
      dim i as integer, j as integer
      Dim v1 as variant
      
      v1=range("a3:c7")
      
      for i=1 to ubound(v1)
        for j=1 to ubound(v1,2)
          debug.print v1(i,j)
        next j
      next i
      

      【讨论】:

      • 此解决方案不包括有问题所需的格式。这只是提取单元格的值。