Получать форматированные значения из диапазона с несколькими ячейками

Dim myText As String
myText= Range("a3").Text

Возвращает форматированное значение в ячейке A3, но

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

дает мне ошибку.

Как получить строки, представляющие отформатированные значения из диапазона нескольких ячеек, сохраняя формат числа? то есть формат выходного текста будет таким же, как если бы копирование было скопировано из диапазона в текстовый редактор.

Ответ 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

Ответ 2

For Each c In Range("a3:c7")
    ItemName = c.Text
Next c

Это даст вам каждую ячейку один за другим.

Ответ 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