Создание массива для публикации в теле письма - PullRequest
0 голосов
/ 30 мая 2018

Я совсем новичок в vba и надеялся, что смогу помочь.Мне нужно создать код, который генерирует электронную почту, которая зависит от листа Excel.В настоящее время мне удалось все, кроме следующего, на котором я застрял.Excel содержит список опций, назовем их a, b, c, d ... n.В теле письма я хотел бы сказать:

OPTION1 a
OPTION2 b
OPTION3 c

Поэтому мне нужен код, чтобы также определить номер опции (количество опций может измениться, иногда 8, иногда больше)и добавьте его рядом со словом вариант.Я думаю, что мне нужно было бы создать какой-то цикл, но на самом деле не знаю, как поступить.Любая помощь будет принята с благодарностью.

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

'Getting the xRg

 On Error Resume Next
    xAddress = ActiveWindow.RangeSelection.Address
    Set FirstRange = Range("A12")
    Set LastRange = FirstRange.End(xlDown)
    Set xRg = Range(FirstRange, LastRange).SpecialCells(xlCellTypeVisible)
 If xRg Is Nothing Then Exit Sub
 Application.ScreenUpdating = False
Set xOutApp = CreateObject("Outlook.Application")
Set xMailOut = xOutApp.CreateItem(olMailItem)
For I = 1 To xRg.Rows.Count
    For J = 1 To xRg.Columns.Count
        xEmailBody = xEmailBody & "  " & xRg.Cells(I, J).Value
    Next
    xEmailBody = xEmailBody & "<br/>"
Next
xEmailBody = vbLf & xEmailBody & "<br/>"

'Creating a loop for the legs
Dim a As integer
Dim option() As integer
For a = FirstRange To LastRange
    ReDim Preserve leg(a)
    option(a) = "leg" & a

Далее

это отредактированный код цикла, но он все еще не работает ..., пожалуйста, помогите

Dim leg(0 To 15) As Range

Dim a As Range
For a = FirstRange To LastRange
   leg(a) = "Leg" & "[" & a & "]"
Next a

Я получаю несоответствие типов

, и это просто ничего не возвращает в электронном письме:

Dim leg() As Variant
leg() = Range(FirstRange, LastRange).Value

Dim a As Variant
For a = FirstRange To LastRange
    leg(a) = "Leg" & "[" & a & "]"
Next a

1 Ответ

0 голосов
/ 01 июня 2018

Не очень понятно, что именно вы пытаетесь сделать, поэтому я делаю небольшую догадку, основываясь на том, что можно вывести из вашего кода.

Измените это

Dim leg(0 To 15) As Range

Dim a As Range
For a = FirstRange To LastRange
   leg(a) = "Leg" & "[" & a & "]"
Next a

накак-то так:

Dim leg(0 To 15) As String

Dim a As Long
For a = FirstRange.Row To LastRange.Row
   leg(a) = "Leg" & "[" & a & "]"
Next a

В порядке, проблемы были:

  1. a не может быть Range тип данных, когда вы хотите использовать его каксчетчик в For -цикле (если вы не используете For Each).For a = ... означает, что a должно быть числовым, поэтому на практике Integer или Long.

  2. В контексте вышеизложенного, VBA не понимает, что вы имеете в виду, когда говорите «перейти от первого диапазона ко второму», поскольку объект Range имеетмного свойств (по умолчанию Value, а не Address или Row).

  3. Вы пытались присвоить значения String массиву Range.Массив может содержать только элементы с тем же типом данных, что и он сам (за исключением Variant, который может содержать что угодно).

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

Альтернативное решение (хотя я делаю предположения на основе того, как выглядит ваш набор данных, но я думаю, что, возможно, он ближе к тому, что вам потребуется):

Dim leg(0 To 15) As String
Dim a As Range, b As Long: b = 0

For Each a In xRg
   leg(b) = "Leg[" & a.Value & "]"
   b = b + 1
Next a

Переведено на человеческий язык:

  1. Посмотрите на каждый элемент (ячейку), обозначенный a, в диапазоне xRg (который ваш предыдущий код определил как переход от FirstRange к LastRange).
  2. Добавьте некоторый текст и значение, содержащееся в этом элементе, в массив leg().
  3. После добавления значения в leg() увеличьте счетчик, который отслеживаеткакой части массива мы добавляем значения.

Код не содержит проверки ошибок или изменения размера массива, что означает, что вы получите out of range или аналогичные ошибки, если xRg содержит более 16 ячеек.

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