2014-02-13 3 views
2

Раскрытие информации: Я довольно неопытным в кодировании большинства видов, но есть разумное понимание логики позади него, и довольно часто просто нужен небольшой толчок с получением синтаксиса Праворежущий т.д.VBA Excel - компилировать Object Error Обязательный

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

Цель: Что я пытаюсь сделать, это создать таблица, в которой в верхней строке находится список последовательных да тес. В первых нескольких столбцах приведены данные для счетов и т. Д. Я хочу, чтобы мой макрос делал, это посмотреть сумму счета, дату начала и конца и частоту счета (еженедельно/ежемесячно и т. Д.), А затем заполнить ячейки в эта же строка в столбцах дат, в которые должен быть выставлен счет. Я провел последний день с этим кодом, и я был очень доволен этим, пока не пошел, чтобы запустить его. Я уже избавился от нескольких ошибок, когда я использовал переменную. Значение, которое, по-видимому, не существует, и я испортил синтаксис для ячеек (строка, столбец).

Проблема, что я иду против теперь Compile Error: Object Обязательный на этой линии:

Set dateAddress = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address 
'find the current date within the range of dates in row 1 

Что эта линия должна делать это поиск по всем датам в первом ряду для это 'currentDate', а затем сохранить это как dateAddress, чтобы затем я мог использовать dateAddress.Column в следующей строке кода вместе с currentRow, чтобы найти нужную ячейку, которая должна быть заполнена суммой счета.

Я достаточно ясно? Мой код ниже.

Мой код:

Private Sub CommandButton1_Click() 
Dim currentDate As Date 
Dim currentRow As Integer 
Dim repeatuntilDate As Date 
Dim repeatuntilRow As Integer 
Dim dateAddress As Date 
currentRow = 3 'First row of entries 
repeatuntilRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 'Last row of entries 
While currentRow < repeatuntilRow 'Loop from first row until last row of entries 
currentDate = Cells(currentRow, "G").Value 'Set Start Date 
repeatuntilDate = Cells(currentRow, "H").Value 'Set End Date 
    While currentDate <= repeatuntilDate 'Loop from Start Date until End Date 
     Set dateAddress = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address 'find the current date within the range of dates in row 1 
     Cells("dateAddress.Column,currentRow").Value = Cells("D,currentRow").Value 'Populate cell with amount 
     'Increment the currentDate by the chosen frequency 
     If Cells(currentRow, "E").Value = "Weekly" Then 
      currentDate = DateAdd("ww", 1, currentDate) 
     ElseIf Cells(currentRow, "E").Value = "Fortnightly" Then 
      currentDate = DateAdd("ww", 2, currentDate) 
     ElseIf Cells(currentRow, "E").Value = "Monthly" Then 
      currentDate = DateAdd("m", 1, currentDate) 
     ElseIf Cells(currentRow, "E").Value = "Quarterly" Then 
      currentDate = DateAdd("q", 1, currentDatee) 
     ElseIf Cells(currentRow, "E").Value = "6 Monthly" Then 
      currentDate = DateAdd("m", 6, currentDate) 
     ElseIf Cells(currentRow, "E").Value = "Annually" Then 
      currentDate = DateAdd("y", 1, currentDate) 
     ' ElseIf Cells(currentRow,"E").Value = "Once off" Then 
      ' Exit While 
     End If 
    Wend 
    currentRow = currentRow + 1 'Once row is complete, increment to next row down 
Wend 
End Sub 

ответ

3

1)

Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address возвратит Address в виде строки (напр .: "$ A $ 1") поэтому вы должны объявить dateAddress как String вместо Date.


2)

Так как переменная объявлена ​​как String (как в Dim dateAddress as String) не является объектом, не следует использовать Set для его инициализации.Следовательно,

Set dateAddress = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address 

становится

dateAddress = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address 

Вы должны проверить THIS.


3)

После публикуемую логики связи, вы могли бы объявили переменную как:

Dim dateRange as Range 'Range is an object 
'And then Set your Range like: 
Set dateRange = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues) 'Because "Find" returns a range object 

'And then with your dateAddress: 
Dim dateAddress as String 
dateAddress = dateRange.Address 
+0

Спасибо simpLE MAn. Оказывается, было несколько вещей, которые я делал неправильно. мой окончательный код (который работает) теперь: 'С Range ("J1: AAI1") Set lastDate = .Cells (.Cells.Count)«Настройка приближающейся поиск начать в lastDate End С Set dateRange = Range ("J1: AAI1"). Найти (что: = currentDate, After: = lastDate) ' – Bzmek

0

Свойство address не является объектом, так что вам не нужно использовать set.

Вместо

Set dateAddress = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address 

Использование

dateAddress = Range("J1:AAI1").Find(currentDate, LookIn:=xlValues).Address 
+0

Спасибо за ответ Floris. Вначале у меня не было 'Set', но я получал ошибку времени выполнения '91': Object Variable или With block variable not set message. Ошибка Google в том, что привело к тому, что я включил «Set». Это помогает сделать проблему более ясной? – Bzmek

+0

Если ваш 'Find' ничего не возвращает, вы не можете получить адрес (диапазона, который не был найден). Лучше разделить на две части - найти находку, подтвердить, что это не «Ничего», а затем получить адрес и т. Д. – Floris

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