Получить отформатированные значения из диапазона нескольких ячеек - PullRequest
11 голосов
/ 08 апреля 2011
Dim myText As String
myText= Range("a3").Text

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

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

выдает ошибку.

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

Ответы [ 5 ]

9 голосов
/ 08 апреля 2011

Единственный способ получить несколько значений ячеек в массиве с помощью одного оператора (без циклов) - использовать массив 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
6 голосов
/ 08 апреля 2011
For Each c In Range("a3:c7")
    ItemName = c.Text
Next c

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

5 голосов
/ 27 августа 2012

Это модифицированная версия одного из постов здесь, и у меня это сработало.

    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
1 голос
/ 08 апреля 2011
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
1 голос
/ 08 апреля 2011

Создайте коллекцию и пройдите все Области диапазона и соберите текст в коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...