2015-07-10 2 views
0

Впервые работает с VBA с Excel. Я занимаюсь использованием формул и отображением значений, используя как ячейки Excel, так и MsgBoxes.Цикл MsgBox для каждой строки с использованием Excel Visual Basic

Моя текущая проблема, скорее всего, простое решение, но еще предстоит выяснить ее.

Я хочу, чтобы мои MsgBox показывают следующее после каждой строки заполняется:

MSG всплывающее окно

Socks Gross Sale is 56.37 

MSG Popup

Lotion Gross Sale is 59.12 
..etc 

Однако, когда я первый попробовать запустите мою прокомментированную строку кода MsgBox Range("A14:A21").Value & " Gross Sale is " & Range("F14:F21").Value, она дает ошибку Run-time error '13': Type mismatch, поэтому она не работает.

Поэтому до сих пор я работаю с моей кодовой строкой MsgBox Range("A14:A21").Value & " Gross Sale is " & Range("F14:F21").Value , которая непрерывно заполняет линию Sock через цикл. Какие-либо предложения ?

For Each Cell In Worksheets("Sheet1").Range("B14:E21").Cells 

    Range("F14:F21").Formula = "=SUM((B14*D14)-((B14*D14)*E14))" 
    'MsgBox Range("A14:A21").Value & " Gross Sale is " & Range("F14:F21").Value 

    'Gives me first line only and makes pop up show twice as many times as (all)total rows 
    MsgBox Range("A14").Value & " Gross Sale is " & Range("F14").Value 

Next 

enter image description here

ответ

1

Вы не можете отправить диапазон MsgBox .. он ищет строку .. вам нужно построить строковое каждый раз ... Я рекомендую что-то вроде этого:

For i = 14 To 21 

    MsgBox Range("a" & i).Value & " Gross Sale is " & Range("F" & i).Value 

Next i 

Это будет цикл по рядам (ака Lines), которые вы хотите ... и соединить клетки вместе, где вы хотите, чтобы вытащить значения из ...

For Each Cell 

петли через каждый мобильный ... не линия ..

+0

, это действительно близко к тому, как я надеялся сделать это (короткий и простой). Это работало гладко! Я очень ценю это. Я думаю, что отдельный цикл - лучший способ пойти. – narue1992

+0

Да, это основа, очевидно, жестко закодированные «14» и «21», с которыми вам придется играть, если вы хотите/нуждаетесь в более динамическом диапазоне;) – Ditto

+0

Точно. Медленно, но верно, я надеюсь, что этот новый язык кодирования будет опущен. Недавно узнал, что Excel использовал VBA O.o. Еще раз спасибо! Я должен продолжать практиковать – narue1992

1

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

Sub produceMsg() 
    Dim i As Byte 
    Dim arrProductName As Variant 
    Dim arrGrossSale As Variant 
    arrGrossSale = Range("F2:F9").Value 
    arrProductName = Range("A2:A9").Value 

    For i = 1 To UBound(arrGrossSale, 1) 
     MsgBox (arrProductName(i, 1) & " Gross sale is " & arrGrossSale(i, 1)) 
    Next i 
End Sub 

При заполнении массива из рабочего листа, вы всегда дают 2 одномерный массив, независимо от того, если вы только предоставление 1 измерение массива. Вот почему мы должны указывать второе измерение как «1» при прохождении через массив. Надеюсь это поможет.

+0

Это работает очень хорошо тоже. Я выбрал только @Ditto, потому что он был более упрощенным, но мне нравится, что имя объявляется для каждого диапазона. Я так не думал об этом, поэтому я счастлив, что вы показали мне это! Если только я могу «отметить» 2 ответа – narue1992

0

На боковой ноте я де следующее обновление, чтобы показать два знака после запятой на MsgBox:

MsgBox Range("a" & i).Value & " Gross Sale is $" & FormatNumber(Round(Range("F" & i).Value, 2), 2) 

Я добавил FormatNumber, потому что, когда я использую Round удаляет любое число, чей второй знак после запятой является 0. С FormatNumber он держит Сложение 0

к @Ditto

Смежные вопросы