2015-08-24 3 views
2

Я беру свое первое погружение в Excel VBA и многому научился.Устранение ошибок времени выполнения в Excel VBA

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

Sub 1 (индивидуальное определяет их название):

Sub Button1_Click() 
Dim Name As Variant 
Name = InputBox("Enter your name as it appears on the report", "Enter Name") 
Worksheets("Summary").Range("A1").Value = Name 
Application.ScreenUpdating = True 
ActiveWorkbook.Save 
End Sub 

Sub 2 (макрос извлекает данные из отчета на основе введенного имени в подпункте 1):

Sub Report1_Click() 
Dim Name As Variant 
Set Name = Worksheets("Summary").Range("A1").Value 
'check if Name is entered 
If Name = "" Then 
MsgBox ("Your name is not visible, please start from the Reference tab.") 
Exit Sub 
End If 
Dim SourceFile As Workbook 
Set SourceFile = Workbooks("filename.xlsm") 
'check if source file is open 
If SourceFile Is Nothing Then 
'open source file 
Set SourceFile = Workbooks.Open("C:\filename.xlsm") 
SourceFile.Activate 
Else 
'make source file active 
SourceFile.Activate 
End If 

Dim DestFile As Variant 

Set DestFile = ActiveWorkbook.Worksheets("Input").Range("B2") 

Dim ActiveCell As Variant 

Set ActiveCell = Workbooks("filename.xlsm").Worksheets("Group").Range("A1") 

Cells.Find(What:=Name, After:=ActiveCell, LookIn:=xlFormulas _ 
, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
MatchCase:=False).Activate 

ActiveSheet.Range("$A$2:$DQ$11").AutoFilter Field:=1, Criteria1:=Name 
Range("A7:CD7").Select 
Selection.Copy 
DestFile.Activate 
ActiveSheet.Paste 

Application.ScreenUpdating = True 

ActiveWorkbook.Save 

End Sub 

Я получаю сообщение об ошибке выполнения 13 («Тип рассогласования») на этой линии в Суб 2, и я понятия не имею, почему:

Set Name = Worksheets ("Резюме"). Range ("A1"). Value

Я также получил различные ошибки в различных точках (в том числе 91, 1004, и 9), которые могут или не могут снова появятся, если этот фиксируется.

UPDATE я решил ошибку 13 на предыдущей строке, удалив Set (по крайней мере, я думаю, что я сделал), но теперь я получаю ошибку 91 на:

Cells.Find (Что: = Имя, After: = ActiveCell, Lookin: = xlFormulas _ , LookAt: = xlPart, SearchOrder: = xlByRows, SearchDirection: = xlNext, _ MatchCase: = False) .Activate

Опять же, я «Совершенно новый, поэтому любая помощь была бы весьма признательна.

Редактировать Я использую Excel 2011 для Mac, если это имеет значение.

+0

Не нужно ставить имя на рабочий лист. Переменная может держать ее в порядке. – findwindow

+0

Не нужно ли устанавливать переменную, чтобы она извлекала значение из первой подпрограммы? Возможно, я неправильно читаю ваш комментарий (сделайте это для неопытности). – WhalesLarry

+0

Вы не можете «установить» такую ​​переменную как значение для объекта. Короче говоря, «Установить» что-то принимает пустую переменную * object * и выравнивает ее с уже существующим объектом. Таким образом, вы можете использовать Dim xyz как Range и Set xyz = Range («A1»), но вы не можете использовать dim xyz как String и Set xyz = Range («A1»). Текст –

ответ

3

Потому что вы активируете не существующий объект.

Лучше проверить, если Cells.Find() возвращает вам Range (или Nothing вместо), прежде чем пытаться его активировать.

'Create a temporary Range 
Dim temp_range As Range 

'Notice that i removed the activation of the range at the end 
Set temp_range = Cells.Find(What:=Name, After:=activecell, LookIn:=xlFormulas _ 
, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
MatchCase:=False) 

'before anything, test if it's nothing... 
If Not temp_range Is Nothing Then 
    ' if not the you can activate.. 
    temp_range.Activate 
    ' and work on the result... 
    Debug.Print temp_range.Value , temp_range.Address 
End If