2016-06-13 6 views
0

Я студент-бизнес, который только начал изучать VBA. Я пытаюсь написать макрос для проекта, но только минимальный опыт действительно вступает в код. То, что я пытаюсь сделать, это удалить все записи строк, в которых есть даты в будущем месяце, и я хотел бы, чтобы это обновление было основано на текущем месяце. Надеюсь, что я использую правильные функции, но, возможно, в неправильном порядке.Ошибка ввода данных VBA Excel

Я пытаюсь сравнить данные для каждой строки (в этом случае я смотрю на ячейку 16 в каждом), и я думал, что если цифры месяца для даты в этом столбце больше, чем значение цифры месяца за текущий месяц, затем он должен удалить, но я получаю сообщение об ошибке [Ошибка времени выполнения «5» Неверный вызов или аргумент процедуры].

Так вот часть кода у меня возникли проблемы с:

If DatePart(mm, Cells(iCntr, 16)).Value > DatePart(mm, Date).Value Then 
    Rows(iCntr).Delete 

В коде я только сосредоточившись на месяц часть, потому что файл я использую содержит только текущую информацию года, поэтому мне не пришлось бы беспокоиться о том, чтобы случайно не удалить что-либо в марте следующего года (03/2017) из-за того, что это июнь этого года (например, технически 03/13/2017 не будет удалено с 03 < 06).


(Второй вопрос для моего собственного опыта обучения - кто-то предложил мне использовать iCntr в этом, но что это на самом деле сделать для формулы?)


Update: Пошел обзор кода и они обновили мой код, и теперь проблема, с которой я столкнулся, заключается в том, что друг, который отправил мне файл, оставил несколько строк пробелов, которые содержат одно пространство, что вызывает ошибку при запуске макроса. Может ли кто-нибудь предложить, как использовать функцию trim() для их устранения?

Sub Remove_excess_entries() 
    Application.ScreenUpdating = False 

    Dim lRow As Long 
    Dim iCntr As Long 
    lRow = 10000 
    For iCntr = lRow To 1 Step -1 
     If Cells(iCntr, 12).Value = "Mule" Or Cells(iCntr, 11).Value = "*R1*" Or Cells(iCntr, 11).Value = "*R2*" Or Cells(iCntr, 7).Value = "*Mule*" Or Cells(iCntr, 6).Value = "*Unassigned*" Or Cells(iCntr, 12).Value = "PS" Or Cells(iCntr, 7).Value = "Marketing" Or Cells(iCntr, 12).Value = "V1" Or DatePart("m", Cells(iCntr, 16).Value) > DatePart("m", Date) Then 
      Rows(iCntr).Delete 
     End If 
    Next 

    Application.ScreenUpdating = True 
End Sub 
+0

Также прошу прощения, если я попрошу об этом не в том месте, я новичок в переполнении стека через друга –

+0

'iCntr' будет переменной, содержащей Номер строки. Вам не нужно называть это, это может быть что угодно. Если вы не установите это значение, вы получите сообщение об ошибке. В качестве теста замените 'iCntr' на жестко закодированный номер строки и посмотрите, работает ли ваш код. – Crowcoder

+0

Вы можете облегчить себе и просто использовать функцию «Month()». – Crowcoder

ответ

0

iCntr не является команда VBA, то, скорее всего лишь объявленным переменным (возможно, значение счетчика для перебора в диапазоне строки, которые вы хотите рассмотреть, в зависимости от контекста показанного кода). Предположительно, вы его где-то объявили и определили в цикле For?

Во-вторых, according to MSDN правильный параметр для «месяца» в DatePart является «м», а не мм. Это означает, что ваш код должен читаться как:

If DatePart("m", Cells(iCntr, 16).Value) > DatePart("m", Date) Then Rows(iCntr).Delete 

Вы также имеете .Value вне закрывающих скобок, что означает, что вы пытаетесь присвоить его DatePart объекта, а не Cells один. Не стесняйтесь спрашивать что-нибудь еще, если я не объяснил это достаточно хорошо

+0

Спасибо за информацию! Код теперь работает, но он работает очень медленно. Есть ли причина, по которой требуется некоторое время? Или способ ускорить его/изменить код, чтобы увеличить скорость?Извините, я не слишком много знаю об этих процессах. –

+1

Не могу сказать много об этом, не видя остальной код - одна строка не дает много информации об эффективности. Взгляните на [codereview.se] и разместите там весь код; они скоро ускорят вас, если это возможно – Dave

0

, как и для правильного использования DatePart() функции, типа:

If DatePart("m", Cells(iCntr, 16)) > DatePart("m", Now) Then Rows(iCntr).Delete