Помещение всех элементов переменной массива в отдельную строку в окне сообщения

Приведенный ниже код является фрагментом макроса, который я пишу, чтобы предупредить пользователей о том, что у них может не быть достаточного количества совместимого установочного оборудования в заказе. n недостатков (т. е. каждый экземпляр элемента оборудования, не имеющего совместимого установочного оборудования, сохраняется в массиве yankees() в элементах с 1 по n. Что я хочу сделать, так это предложить пользователям окно сообщения, в котором говорится: «Пожалуйста, просмотрите свой заказ, чтобы убедиться, что у вас есть достаточно совместимого установочного оборудования - мы обнаружили следующие недостатки"

и ниже этого

включите все элементы янки (от 1 до n) в отдельные строки в окне сообщения с двумя вариантами ниже: «Все в порядке, я отправлю свой заказ сейчас» и «Позвольте мне вернуться, я хочу изменить свой заказ».

Как я могу создать такое окно сообщения?

У меня есть:

 MsgBox "Please review your order to ensure you have you sufficient compatible     installation equipment- we detected the following concerns" & yankee(1), vbOKCancel

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

Этот вопрос на самом деле сводится к следующему: «Как мне поместить все непустые элементы переменной массива в свои собственные строки в подсказке окна сообщения»?

Do
If rip(qbert) < k(qbert) Then
yankee(jets) = "Your order for" & s(qbert) & " contains " & k(qbert) - rip(qbert) & " too     few " & g(qbert)
jets = jets + 1
qbert = qbert + 1
Else
qbert = qbert + 1
End If
Loop Until qbert > echo

person Richard Pullman    schedule 03.09.2013    source источник
comment
кстати, yankees() имеет пустые элементы, но заполняются первые n элементов, где n — количество недостающих элементов.   -  person Richard Pullman    schedule 03.09.2013
comment
Подождите секунду, не будет ли исправление yankees(), включающее только первые n элементов, минимизировать требования к ресурсам?   -  person Richard Pullman    schedule 04.09.2013


Ответы (2)


Вы можете использовать функцию Join:

Sub Test()
    Dim var As Variant

    'Populate a dummy vector array from a comma-separated list:
    var = Split("Alpha,Beta,Gamma,Delta,Epsilon", ",")

    'Display the contents of the array as delimited list, use the Carriage Return to delimit:
    MsgBox Join(var, vbCR)

End Sub

введите здесь описание изображения

Вышеприведенное не игнорирует пробелы. Чтобы игнорировать пробелы, по вашему конкретному вопросу вы можете перебирать массив и проверять пустые значения. Я бы сделал это в Function:

Как поместить все непустые элементы переменной массива в отдельные строки в окне сообщения

В вашем подразделе просто передайте yankees этой функции, например:

MsgBox = GetMessageText(yankees)

Вот функция:

Function GetMessageText(var As Variant) As String
    'Assumes a vector array
    On Error GoTo EarlyExit

    Dim sMsg As String
    Dim v As Variant

    For Each v In var
        If Not v = vbNullString Then
            sMsg = sMsg & v & vbCr
        End If
    Next

EarlyExit:
    If Err.Number = 0 Then
        GetMessageText = sMsg
    Else:
        GetMessageText = "invalid array"
    End If

End Function
person David Zemens    schedule 03.09.2013
comment
Спасибо, это довольно хорошо, но есть ли способ, которым я могу быть, скажем, у янки есть 4 элемента, тогда функция var=split(yankees(1), yankees(2), yankees(3), yankees(4 ),,) ? Я пытался что-то сделать с циклами, но застрял, так как компилятор ожидает, что правильный синтаксис завершит выражение. - person Richard Pullman; 03.09.2013
comment
Вам не нужно использовать var = Split(yankees(1),...etc. Вы должны быть в состоянии просто сделать Join(yankees, vbCR). Если вам нужно больше нюансов (например, игнорирование пустых элементов), дайте мне знать. - person David Zemens; 03.09.2013
comment
Спасибо, также, когда вы говорите использовать возврат каретки, что вы имеете в виду? - person Richard Pullman; 03.09.2013
comment
Вы запросили каждый элемент в новой строке, поэтому вместо разделения строки запятой (например) я разделяю ее с помощью ссылки возврат каретки. Если этот ответ решил вашу проблему, отметьте его как принятый. - person David Zemens; 03.09.2013
comment
Chr$(13) - это синтаксис, который вызывает возврат каретки в строке... Ваш подход, безусловно, работает, и я извлек из него уроки, но подход Тигра более лаконичен, поэтому мне пришлось присудить ему балл. Я, безусловно, буду использовать разделение и присоединиться в ближайшем будущем. - person Richard Pullman; 04.09.2013
comment
Вы понимаете, что Chr(13) и vbCR эквивалентны, верно? В остальном подход Тигра аккуратен. Мне не нравится двойная замена, особенно если вы работаете с очень большими массивами, вы определенно увидите прирост производительности по сравнению с циклическим методом. Ваше здоровье. - person David Zemens; 04.09.2013
comment
Отличный момент. Я не могу проверить это утверждение, учитывая мое ограниченное понимание того, как два подхода работают во времени с учетом определенного набора ресурсов, но, похоже, было больше случаев чтения и записи в память для выполнения двойной замены по всему массиву, а не ваш подход, который сканирует пустые элементы массива для критериев (vbnullstring). Однако, поскольку я занимаюсь математикой, я предпочитаю элегантные письменные решения. - person Richard Pullman; 04.09.2013

Альтернативный:

Sub tgr()

    Dim yankee(1 To 5) As String
    Dim strMsg As String

    yankee(1) = "Did this"
    yankee(3) = "experiment"
    yankee(5) = "really work?"

    'yankee => ["Did this", , "experiment", , "really work?"] _
     the yankee array has two blanks at positions 2 and 4 _
     and it also has spaces in some of the element strings

    strMsg = Replace(Replace(WorksheetFunction.Trim(Replace(Replace(Join(yankee, "|"), " ", "_"), "|", " ")), " ", vbCrLf), "_", " ")

    'strMsg => "Did this _
                experiment _
                really work?"

    'Yes it did, see result
    MsgBox strMsg

End Sub
person tigeravatar    schedule 03.09.2013
comment
Буквально уронил свои strMsg = Replace(Replace(WorksheetFunction.Trim(Replace(Replace(Join(yankee, "|"), " ", "_"), "|", " ")), " ", vbCrLf), "_", " ") и msgBox strMsg, и все заработало именно так, как я и надеялся. @Tigeravatar: Зачем нужны эти функции замены? Элементы массива разделены символом | в памяти? - person Richard Pullman; 03.09.2013
comment
Нет, | просто заполнитель. Я использовал функции замены, чтобы сохранить существующие пробелы с помощью _, а затем заменил | (это то, что я указал в методе Join) с пробелами, использовал функцию обрезки рабочего листа, которая удаляет лишние пробелы, даже если они находятся в середине строки. Это гарантирует, что пустые элементы в массиве не будут отображаться как дополнительные без использования цикла. Затем я превратил все оставшиеся пробелы (которые теперь являются разделителями элементов массива) в символы перевода строки, а затем заменил символы подчеркивания обратно пробелами. - person tigeravatar; 03.09.2013