Проблема с циклом while в Excel VBA - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь написать макрос VBA, который принимает значения ячеек в заданном столбце, строка за строкой, и собирает SQL-запрос для копирования.Он в основном объединяет фрагменты текста и переменные в ячейке.Для запроса требуются номера карт и порядковые номера, следовательно, переменные.

Макрос почти готов, но он застревает в бесконечном цикле while.

Sub Query()

Dim Row As Integer
Row = 8

Dim Cardnumber As String
Cardnumber = Range("D" & Row)

Dim Number As Integer
Number = 1

Range("E30").Select
ActiveCell.Value = "SELECT cardnumber, first_name || ' ' || last_name FROM ( SELECT cardnumber, first_name, last_name, c.OrderNo FROM ag_cardholder ch, (SELECT '%" & Cardnumber & "%' cardmask, " & Number & " OrderNo from dual "

While IsNull(Cardnumber) = False

    Row = Row + 1
    Number = Number + 1
    Cardnumber = Range("D" & Row)

    ActiveCell.Value = ActiveCell.Value & "UNION ALL SELECT '%" & Cardnumber & "%', " & Number & " OrderNo from dual "

Wend

ActiveCell.Value = ActiveCell.Value & ") c WHERE ch.cardnumber LIKE c.cardmask ORDER BY c.OrderNo ) t"

End Sub

Я пробовал IsEmpty() вместо IsNull (), результат тот же.Пожалуйста, дайте мне знать, что мне здесь не хватает.Кроме того, не стесняйтесь давать мне советы, как сделать код более элегантным, так как это моя первая попытка в VBA.Заранее благодарим вас за ваши усилия.

1 Ответ

3 голосов
/ 24 июня 2011

Будучи String, Cardnumber никогда не будет Null или Empty.Он может иметь только нулевую длину, Len(Cardnumber) = 0.

Если Cardnumber было Variant, вы можете использовать IsEmpty, чтобы проверить, является ли значение ячейки пустым.
Нет смысла использоватьIsNull, поскольку значение ячейки в Excel никогда не равно Null.Даже если Null извлекается из базы данных, Excel заменит его на Empty.


Отвечая на ваш следующий вопрос: я бы реорганизовал этот код в:

Sub Query()

  Dim InnerSelect As String
  Dim CurCell As Range: Set CurCell = ActiveSheet.Range("D8")
  Dim Number As Long: Number = 1

  Do
    Dim Cardnumber As String
    Cardnumber = CurCell.Value

    If Len(Cardnumber) = 0 Then Exit Do

    If Len(InnerSelect) = 0 Then
      InnerSelect = "SELECT '%" & Cardnumber & "%' cardmask, " & Number & " OrderNo from dual "
    Else
      InnerSelect = InnerSelect & "UNION ALL SELECT '%" & Cardnumber & "%', " & Number & " OrderNo from dual "
    End If

    Number = Number + 1
    Set CurCell = CurCell.Offset(1, 0)
  Loop

  Range("E30").Value = _
    "SELECT cardnumber, first_name || ' ' || last_name FROM ( SELECT cardnumber, first_name, last_name, c.OrderNo FROM ag_cardholder ch, (" & _
    InnerSelect & _
    ") c WHERE ch.cardnumber LIKE c.cardmask ORDER BY c.OrderNo ) t"

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