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

наилучший способ преобразования диапазона ячеек в строку? У меня есть функция, которая принимает только строку в качестве входных данных, поэтому мне нужно преобразовать диапазон в строку, сохраняя при этом как можно большую часть форматирования (т.е. она должна выглядеть как таблица или список, а не просто строка символов) , Я пытался работать с CStr (), а также преобразовывать диапазон в массив, а затем в строку, но я просто получаю ошибки.

Изменить: Попытка кода

Dim email_answer As Integer
email_answer = MsgBox("Do you want to be emailled a copy of this schedule?", vbYesNo)
If email_answer = vbYes Then

    Dim wb As Workbook
    Dim to_send As Range
    to_send = Range("D3", "D10")

    If Val(Application.Version) < 14 Then Exit Sub

    Set wb = ActiveWorkbook
    With wb
        MailFromMacWithMail body content:=CStr(to_send), _
                    mailsubject:="Schedule", _
                    toaddress:="email address", _
                    ccaddress:="", _
                    bccaddress:="", _
                    attachment:=.FullName, _
                    displaymail:=False
    End With
    Set wb = Nothing
End If
 Wolfie21 янв. 2017 г., 11:04
Как вы ожидаете, что строка будет выглядеть как таблица?
 Shai Rado21 янв. 2017 г., 11:03
поделитесь своим кодом attmept
 193782721 янв. 2017 г., 12:08
Извините, попытка кода @ShaiRado добавлена (это была последняя попытка, также пробовал range-> array-> string метод).

Ответы на вопрос(6)

Function Rang2String(rng As Range) As String
    Dim strng As String
    Dim myRow As Range
    With rng
        For Each myRow In .Rows
            strng = strng & Join(Application.Transpose(Application.Transpose(myRow.value)), "|") & vbLf
        Next
    End With
    Rang2String = Left(strng, Len(strng) - 1)
End Function

которая будет возвращать строку с символом перевода строки в качестве разделителя строк диапазона и каналы ("|") в качестве разделителя столбцов

 user359875621 янв. 2017 г., 15:33
@SMeaden, он необходим для диапазонов «строк», а для «столбцов» вам нужна только одна транспонирование
 S Meaden21 янв. 2017 г., 15:29
Удачное использование Transpose дважды для преобразования 2d массива в 1d массив (что я только что узнал из SO)!

Любая из этих функций сделает это за вас.

Function ConCatRange2(CellBlock As Range) As String
'for non-contiguous cells =ccr((a1:a10,c4,c6,e1:e5))
Dim Cell As Range
Dim sbuf As String
For Each Cell In CellBlock
If Len(Cell.Text) > 0 Then sbuf = sbuf & Cell.Text & ","
Next
ConCatRange2 = Left(sbuf, Len(sbuf) - 1)
End Function

ИЛИ ЖЕ

Function mergem(r As Range) As String
mergem = r.Cells(1, 1).Value
k = 1
For Each rr In r
    If k <> 1 Then
        mergem = mergem & "," & rr.Value
    End If
    k = 2
Next
End Function

ИЛИ ЖЕ

Function spliceUm(r As Range) As String
spliceUm = ""
For Each rr In r
spliceUm = spliceUm & rr.Value & ";"
Next
End Function

в строку в VBA:

Sub convert()

Dim rng As Range, cell As Range

Dim filter As String

filter = ""

Set rng = Selection

For Each cell In rng

    If Not cell Is Nothing Then
        filter = """" & cell & """" & "," & filter
    End If

Next cell

End Sub
 mischva1130 авг. 2018 г., 21:40
пожалуйста, объясните в ответах, что вы делаете и почему это хороший подход
Решение Вопроса

Function RangeToString(ByVal myRange as Range) as String
    RangeToString = ""
    If Not myRange Is Nothing Then
        Dim myCell as Range
        For Each myCell in myRange
            RangeToString = RangeToString & "," & myCell.Value
        Next myCell
        'Remove extra comma
        RangeToString = Right(RangeToString, Len(RangeToString) - 1)
    End If
End Function

Вы можете добавить дополнительные функции, такие как вставка точки с запятой вместо запятой, если номер строки увеличивается.

Чтобы использовать эту функцию:

Sub AnySubNameHere()
    Dim rng As Range
    Set rng = ActiveSheet.Range("A3:A10")

    Dim myString as String
    myString = RangeToString(rng)
End Sub
 Wolfie21 янв. 2017 г., 14:50
Вы можете перебрать столбцыFor Each rowRange in myRange.Rows затем перебрать клетки в каждомrowRange вместо всегоmyRange, Обратите внимание, вы должныDim Диапазон объектаmyRow первый
 193782721 янв. 2017 г., 12:00
Извините за вопрос новичка. Я добавил ваш код, а затем позвонил с помощьюDim to_send As Range to_send = Range("D3", "D10") Call RangeToString(to_send) Будет ли это изменить to_send на строку? Мой код все еще возвращал ошибку несоответствия аргумента byref, когда я делал это
 193782721 янв. 2017 г., 12:48
Вы удивительны, большое спасибо! Есть ли способ заставить его бежать вниз по каждому столбцу, прежде чем перейти к следующему ряду? В данный момент он, кажется, читает A1, B1, C1, A2, B2, C2 и т. Д. Вместо A1, A2, A3, B1, B2, B3 и т. Д.
 Wolfie21 янв. 2017 г., 12:13
Я отредактировал свой ответ, чтобы показать вам, как использовать эту функцию. Функция возвращает строковый объект, так что вы можете просто присвоить его переменной :)
 193782721 янв. 2017 г., 16:34
Спасибо, но теперь он дал мне ошибку времени выполнения 13 несоответствие типов. Правильно ли я реализовал ваше решение?Dim myCell As Range Dim RowRange As Range For Each RowRange In myRange.Rows For Each myCell In RowRange RangeToString = RangeToString & Chr(13) & myCell.Value Next myCell Next RowRange

что этому вопросу уже почти год, но я нашел быстрое решение, которое работает для меня: вам нужно создать ссылку на библиотеку объектов Microsoft Forms 2.0, чтобы использовать DataObject.

Public Function GetStringFromRange(RNG As Range) As String
    Dim DOB As New MSForms.DataObject
    RNG.Copy
    DOB.GetFromClipboard
    GetStringFromRange = DOB.GetText
End Function

что переменная rng является диапазоном, тогда пишем:

рнг = левый (рнг, лен (рнг))

чудесным образом превратит РНГ в струну.

 Wolfie29 мая 2018 г., 11:00
Нет, это не так ... что входrng Вот? Как вы думаете, выходrng является? Речь идет о преобразовании содержимого диапазона (по нескольким ячейкам) в строковую переменную, а не о форматировании содержимого одной ячейки в виде строки ...

Ваш ответ на вопрос