2016-07-13 2 views
-1

EDIT:VBA Excel 2010 - Ошибка выполнения «1004» Application или объекта-deined ошибка

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

Код ниже получит сообщение об ошибке «Ошибка выполнения» 1004 «Определенная приложением или ошибка объекта» на ActiveCell.Offset(1, 0).Select внизу, но при этом запускается код также оленья кожа запускать [C7].Select часть либо (но нет никакого сообщения об ошибке в этой точке)

Я попытался с помощью, Range("C7").select и Cells(7,3).select, которые также не работают. Я также пробовал Application.Wait, чтобы узнать, был ли макрос слишком быстрым, но это также не решает проблему, я удалил Application.ScreenUpdating = False и снова это не работает.

Я пробовал этот макрос на 4 разных ПК и 2 разных версиях excel, и все они имеют одинаковую проблему.

EDIT:

Просто, чтобы очистить вещи, как я думаю, что мой explination выше, может быть немного неясным

Проблема в настоящее время с этим участком кода

[C7].Select 
'Do Until ActiveCell.Row >= Finalrow 
'drop out of loop if no more dates detected in row 3 
Do Until sName = Cells(ActiveCell.Row, 1).Value 
ActiveCell.Offset(1, 0).Select 
Loop 

Что происходит когда я запускаю код в эту часть кода, это сообщение об ошибке выше появится на ActiveCell.Offset(1, 0).Select этой строке, однако [C7].Select также не выбирает ячейку C7 (она остается в ячейке который уже был выбран).

Предполагается, что он пройдет по ячейкам в столбце C, смотрящим на столбец A, до тех пор, пока он не достигнет имени лица (определяется sName), как только он доберется до этого, он будет запускать остальную часть кода (что я нету вывешен на я не могу получить дальше, чем этот момент, я могу отправить все это по желанию)


Option Compare Text 
Public sLeave As Integer, iAnnualLeave As Integer, sLeaveType As String 

Sub LeaveChecker() 

Dim iAnnualLeave As Integer 

bTrackingLeave = False 
bReachedEndOfChart = False 
bStartDateFound = False 

'Set Color with If Statement 



sTypeOfLeave = [D12].Value 

If sTypeOfLeave = "Annual Leave" Then 
sLeaveType = "AL" 
ElseIf sTypeOfLeave = "Flexi Leave" Then 
sLeaveType = "FL" 
sLeaveTypeAmPm = "FL???" 

ElseIf sTypeOfLeave = "Special Leave" Then 
sLeaveType = "SpL" 
ElseIf sTypeOfLeave = "Study Leave" Then 
sLeaveType = "StL" 
ElseIf sTypeOfLeave = "Meeting/Traning" Then 
sLeaveType = "M/T" 
End If 

'Check to see if type of leave is populated 
If sTypeOfLeave = "" Then 
MsgBox ("Please Populate Type Of Leave") 
End If 




Application.ScreenUpdating = False 

'Find last sheet name 
Set ws = Sheets(Sheets.Count) 
sLastSheet = ws.Name 

sName = [M3].Value 

If sName = "" Then 
MsgBox ("Please Enter A Staff Members Name") 
Exit Sub 
End If 

Sheets(ActiveSheet.Index + 1).Activate 

SearchNewSheet: 

If ActiveSheet.Name = sLastSheet Then 
bReachedEndOfChart = True 
GoTo LastStage 
End If 

Do Until ActiveSheet.Name = sLastSheet 'Main LOOP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

If bReachedEndOfChart = True Then GoTo FinalGather 

'Find Person Name 


[C7].Select 
'Do Until ActiveCell.Row >= Finalrow 
'drop out of loop if no more dates detected in row 3 
Do Until sName = Cells(ActiveCell.Row, 1).Value 
ActiveCell.Offset(1, 0).Select 
Loop 
+0

«ошибки из». Что оно делает? Если он выдает ошибку, то какая ошибка? –

+1

Вы должны поставить 'Option Explicit' в верхней части вашего модуля и объявить все свои переменные. Такое интенсивное использование необъявленных переменных является ошибкой, ожидающей своего появления. –

+0

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

ответ

0

тем, которые help,

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

Поскольку это было исправлено (Перенести все в новый документ Excel) мой оригинальный код теперь работает нормально

Спасибо всем тем, что помогает

1

Надежда теперь я понимаю, код ниже найти номер строки в колонке C, где имя совпадает с именем в ячейке A7.

' find last row in Column C 
last_row = Cells(Rows.count, "C").End(xlUp).Row 

' find row number in column C where the name is identical to cell A7 
row_found = Application.WorksheetFunction.Match(Range("A7"), Range("C1:C" & last_row), 0) 
MsgBox " Name found at Cell C" & last_row 
+0

Я думаю, что у вас есть столбцы и строки неправильным образом для «Ячейки», это должно быть «Ячейки (RowNum, ColNum)», поэтому «Ячейки (7,3)» это '[C7]'. Я также хочу перемещаться по строкам и не перемещаться по столбцам –

+0

, вы правы, всегда ошибаетесь при переходе с ячеек на строки. Итак, теперь я действительно смущен необходимостью искать строку 3, когда он выбирает «Range (« C7 »). Выберите', который находится в строке 7, вы поняли, где он ищет даты? –

+0

Я думаю, что было немного недопонимания, когда начиналось с '[C7] .select' Я проверяю A7 (' sName = Cells (ActiveCell.Row, 1) .Value') для имени человека, тогда ему нужно сбрасывать ячейки до тех пор, пока не достигнет этого имени. Проблема заключается в том, что '[C7] .select' (или любой другой вариант .select) фактически не работает (он проходит мимо кода, но не выполняет его, поэтому нет сообщения об ошибке) –

1

Я беру этот вопрос быть: -

Он должен бежать вниз ячейки в столбце С, глядя на колонке А до тех пор, пока не достигнет имена людей (определяется SNAME) после того, как он попадает в то есть выйдет из цикла и продолжит работу с остальной частью кода.

(Выше перефразировать из Вашего вопроса)

код я предлагаю заменить это: -

[C7].Select 
'Do Until ActiveCell.Row >= Finalrow 
'drop out of loop if no more dates detected in row 3 
Do Until sName = Cells(ActiveCell.Row, 1).Value 
ActiveCell.Offset(1, 0).Select 
Loop 

Замена его ниже будет решить проблему с минимальными изменениями: -

ActiveSheet.Cells(7, 3).Select 
Do Until sName = Cells(ActiveCell.Row, 1).Value 
    ActiveCell.Offset(1, 0).Select 
Loop 

Однако, использование select не рекомендуется, и если sName не найден, это будет продолжаться до конца листа, где будет выбрасываться erro r, что означает превышение максимального размера листа.

Я хотел бы предложить ниже как лучшая замена: -

Dim LngRow As Long 
LngRow = 7 
Do Until (ActiveSheet.Cells(LngRow, 1) = sName) Or (ActiveSheet.Cells(LngRow, 1) = "") 
    LngRow = LngRow + 1 
Loop 
If ActiveSheet.Cells(LngRow, 1) = "" Then 
    MsgBox "Pearson not found" 
    Exit Sub 
Else 
    ActiveSheet.Cells(LngRow, 3).Select 
End If 

(я поставил ActiveSheet.Cells(LngRow, 3).Select в конце в качестве оставшегося кода может полагаться на клетки выбирают)

+0

Я пробовал вам код, но такая же проблема возникает в 'Do Until (ActiveSheet.Cells (LngRow, 1) = sName) Или (ActiveSheet.Cells (LngRow, 1) =" ")' однако это, похоже, не является ошибкой другого чем мой собственный, после разговора с несколькими другими коллегами было высказано предположение, что я пытаюсь сделать то же самое в другом документе excel, оказалось, что мой документ excel с кодом был поврежден в меньшей степени. ваш код отправлен - отличный пример того, как работать через ячейки, не используя .select, хотя –

+0

Как только вы исправляете коррупцию, исправление проблемы устраняет проблему, или это означает, что ошибка исправления означает, что у вас нет проблемы? –

+1

Поскольку коррупция исправлена, мой исходный код работает отлично. –

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