Мне нужна помощь. Моя формула Excel Visual Basic не работает

введите здесь описание изображенияМой код работает неправильно. Код все еще нуждается в настройке, чтобы решить некоторые оставшиеся проблемы. Это медленно, и требуется 60 секунд, чтобы разморозить форму после запуска кода VBA ниже.

Если кто-то может помочь с этим кодом, пожалуйста, ответьте.

Sub Crunched(): Dim wb As Worksheet, we As Worksheet, wl As Worksheet, wh As Worksheet
    Dim i As Long, j As Long, k As Long, p As Long, q As Long, r As Long, h As Integer
    Dim Rooms As String, T As Single
    Set wb = Sheets("Materials Budget"): Set we = Sheets("Materials Estimate")
    Set wl = Sheets("Lowes Fax"): Set wl = Sheets("Home Depot Fax"): 'r =      wb.UsedRange.Rows.Count
    For i = 12 To wb.UsedRange.Rows.Count
        If LCase(wb.Range("Q" & i)) = "y" Then
           p = i: Do Until LCase(wb.Range("B" & p)) = "room": p = p - 1: Loop
           If InStr(1, Rooms, wb.Range("B" & p + 1)) = 0 Then
              If h Then
                 T = 0: r = q: Do Until Not IsNumeric(we.Range("I" & r))
                 T = T + we.Range("I" & r): r = r - 1: Loop
                 we.Range("H" & q + 1) = "Total": we.Range("I" & q + 1) = T
              End If
              Rooms = Rooms & " " & wb.Range("B" & p + 1): h = h + 1: q = 10 * h
              wb.Range("B" & p & ":B" & p + 1).Copy we.Range("B" & q)
              wb.Range("K" & p & ":L" & p + 1).Copy we.Range("C" & q)
              wb.Range("O" & p & ":S" & p + 1).Copy we.Range("E" & q): q = q + 1
           End If
           q = q + 1
           wb.Range("B" & i).Copy we.Range("B" & q)
           wb.Range("K" & i & ":L" & i).Copy we.Range("C" & q)
           wb.Range("O" & i & ":S" & i).Copy we.Range("E" & q)
        End If
     Next i
End Sub

17 декабря 2013 г.:

Спасибо за ваши ответы. Код книги — это помощь, которую я получил. Он работает неправильно, и ответы Stackoverflow подтвердили, что он написан неправильно. Я не был уверен, почему код, первоначально предоставленный мне вчера на другом справочном сайте, не использовал диапазоны. Или почему форме требуется 60 секунд, чтобы рабочая книга завершила процесс VBA и зависла.

Текущие проблемы заключаются в следующем: 1. Сметная таблица (лист2) получает информацию из бюджета материалов (лист1), и на комнату допускается только 10 строк. Строки должны автоматически заполняться до пробелов.

  1. В оценочном листе информация о рядах комнат указана несколько раз ниже по листу. Так 14 комнат выросли до 48.

  2. Листы факса (листы 3 и 4) не заполняются. Факс Lowes и факс Home Depot.

Чтобы помочь вам понять содержание рабочей книги: Бюджет материалов (Лист1) представляет собой построчный калькулятор и лист поиска продуктов, в котором используются столбцы A-T. Диапазон номеров указан ниже. Есть два дополнительных диапазона BUY_Order Approval (столбец Q), где для фактического заказа товара требуется ответ «Y», и строка «Промежуточные итоги» (столбец S).

Бюджет материалов (лист 1) имеет в общей сложности 14 отдельных «комнат», сгруппированных в 14 отдельных диапазонов, чтобы не возникало проблем с дифференциацией информации из одного диапазона в другой, который включает только описание продукта (столбец K), номер SKU (столбец L), стоимость (столбец O), количество (столбец P), продавец (столбец R) и баланс строки (столбец S). Соответственно КЛОПРС:

Диапазоны:

  • Расходные материалы_Ванная1 (40 строк)
  • Расходные материалы_Ванная2 (40 строк)
  • Supplies_Bedroom1 (33 строки)
  • Supplies_Bedroom2 (33 строки)
  • Supplies_Bedroom3 (33 строки)
  • Supplies_Bedroom4 (33 строки)
  • Расходные материалы_Кухня (60 строк)
  • Supplies_FrontPorch (33 строки)
  • Расходные материалы_RearPorch
  • Расходные материалы_Прихожая (25 рядов)
  • Расходные материалы_Прачечная
  • Принадлежности_Гараж
  • Supplies_FloridaRoom

Эти строки копируются в Смету материалов (Лист2) только в том случае, если в столбце Q есть ответ «Y» (Купить товар), а также выбор строки в столбце A «x». Столбец A просто меняет цвета строк, чтобы пользователь не забыл о заполнении информации.

Два факсимильных листа заполняются, если в столбце Q (Товары для покупки) в бюджете материалов (Лист1) есть «Y», «X» в столбце A для выбранной строки и если в столбце R указано «Lowes» или «Home Depot». . Каждый из двух факсимильных листов разделяет товары розничного продавца; факс Lowes содержит только товары, которые можно приобрести у Lowes, а факс Home Depot содержит только товары, которые можно приобрести у HD. Материалы, перечисленные в факсе, расположены в порядке присвоенного номера в столбце T, в котором собраны все необходимые пиломатериалы, все гвозди и шурупы вместе и т. д., чтобы магазину было легче получать товары для заказа.

  1. Смета материалов (лист 2) и Бюджет материалов (лист 1) имеют потенциальную общую сумму от 1 до 500 строк, если проект представляет собой полный снос и замену или просто ремонт. Таким образом, Оценка материалов и Факсы должны выполняться в автоматическом цикле до тех пор, пока не будут скопированы все подходящие строки.

Любая помощь будет оценена по достоинству.

-- Сжато на время


person user3097333    schedule 17.12.2013    source источник
comment
Я настоятельно рекомендую вам использовать осмысленные имена переменных и меньше двоеточий. Такие утверждения, как p = i, почти непонятны. С точки зрения вашей проблемы, мне интересно, должна ли строка If h Then иметь что-то большее, поскольку h является (унифицированным?) integer.   -  person Doug Glancy    schedule 17.12.2013
comment
Что я действительно хочу сказать вам: Господи, чувак, останови это безумие сейчас или будь всегда начеку, чтобы твое будущее я отправилось назад во времени, чтобы выследить тебя за то, что ты создал этот невероятный беспорядок.   -  person Doug Glancy    schedule 17.12.2013
comment
Даг, я получил код от кого-то в сети. Я хочу исправить это, но изо всех сил пытаюсь найти нужные ресурсы, чтобы узнать, как сделать это правильно.   -  person user3097333    schedule 17.12.2013
comment
@ user3097333, понятно. Желаю вам удачи.   -  person Doug Glancy    schedule 17.12.2013


Ответы (1)


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

Ваш код может быть написан структурированным образом, например

Sub Crunched()
    Dim wb As Worksheet, we As Worksheet, wl As Worksheet, wh As Worksheet
    Dim i As Long, j As Long, k As Long, p As Long, q As Long, r As Long, h As Integer
    Dim Rooms As String, T As Single

    Set wb = Sheets("Materials Budget"): Set we = Sheets("Materials Estimate")
    Set wl = Sheets("Lowes Fax"): Set wl = Sheets("Home Depot Fax")

    For i = 12 To wb.UsedRange.Rows.Count
        If LCase(wb.Range("Q" & i)) = "y" Then
            p = i

            Do Until LCase(wb.Range("B" & p)) = "room": p = p - 1: Loop

            If InStr(1, Rooms, wb.Range("B" & p + 1)) = 0 Then
                If h Then
                    T = 0: r = q
                    Do Until Not IsNumeric(we.Range("I" & r))
                        T = T + we.Range("I" & r): r = r - 1
                    Loop
                    we.Range("H" & q + 1) = "Total": we.Range("I" & q + 1) = T
                End If
                Rooms = Rooms & " " & wb.Range("B" & p + 1): h = h + 1: q = 10 * h
                wb.Range("B" & p & ":B" & p + 1).Copy we.Range("B" & q)
                wb.Range("K" & p & ":L" & p + 1).Copy we.Range("C" & q)
                wb.Range("O" & p & ":S" & p + 1).Copy we.Range("E" & q): q = q + 1
            End If
            q = q + 1
            wb.Range("B" & i).Copy we.Range("B" & q)
            wb.Range("K" & i & ":L" & i).Copy we.Range("C" & q)
            wb.Range("O" & i & ":S" & i).Copy we.Range("E" & q)
        End If
    Next i
End Sub

Теперь я вижу пару проблем...

  1. wb.UsedRange.Rows.Count Почему UsedRange.Rows.Count? а не петля только до последнего ряда? Возможно, вы захотите увидеть ЭТО

  2. If LCase(wb.Range("Q" & i)) = "y" Then Вместо зацикливания используйте .Autofilter. Например, wb.Range("Q12:Q" & LastRow)).AutoFilter Field:=1, Criteria1:="=y", а затем снова используйте автофильтр для Col B. ЗДЕСЬ — пример того, как копировать отфильтрованные строки.

  3. Чтобы сделать ваш код быстрым, вы можете захотеть разместить свой код между Application.ScreenUpdating = False и Application.ScreenUpdating = True.

ИНТЕРЕСНО ЧИТАТЬ

person Siddharth Rout    schedule 17.12.2013