У меня вопрос по VBA.
У меня есть код для выполнения простой задачи, но я не знаю, в чем причина, но иногда этот код работает отлично, иногда это не так.
Перейти к активным (не скрытым) листам в рабочей книге.
Найдите конкретный текст в столбце назначения, в данном случае это «Сумма текущей активности».
Скопируйте ячейку перед текстом.
Перейдите на лист рецензента и найдите в таблице имя листа.
Вставьте скопированную ячейку в качестве значения ссылки рядом с ячейкой, в которой у нас есть имя листа в таблице.
Продолжайте тот же процесс, пока не будут найдены все активные листы.
КОД
Sub Sum of_Current_activity()
Dim sht As Worksheet
Sheets("Reviewer Sheet").Select
For Each sht In ActiveWorkbook.Worksheets
If sht.Name <> "Reviewer Sheet" And Left(sht.Name, 1) = 0 Then
On Error Resume Next
sht.Select
f2 = " Total"
£1 = ActiveSheet.Name & f2
Sheets(sht).Select
Columns("J:J").Select
Selection.Find(What: = "Sum of Current Activity", _
After:=ActiveCell,_
LookIn:=xlValues,_
LookAt:=xlPart,_
SearchOrder:=xlByRows,_
SearchDirection:=x1Next,_
MatchCase:=False).Activate
ActiveCell.Offset(0, 1).Select
Selection.Copy
Sheets("Reviewer Sheet").Select
Columns("C:C").Select
Selection.Find(What:=f1, _
After:=ActiveCell,_
LookIn:=xlValues,_
LookAt:=xlPart,_
SearchOrder:=xlByRows,_
SearchDirection:=xlNext,_
MatchCase:=False).Activate
ActiveCell.Offset(0, 14).Select
ActiveSheet. Paste Link:=True
Else
End If
Next sht
End Sub
P.S, у меня есть 10 разных конкретных текстов для поиска на 25 листе. этот код иногда работает для всех 10 текстов и иногда пропускает значения.
О, это опечатка в посте, в исходном коде я использую f1, а не 1 фунт стерлингов
Избавьтесь от On Error Resume Next и попробуйте еще раз.
Также есть x1Next


Не тестировалось, но должно работать что-то вроде этого:
Sub Sum of_Current_activity()
Dim sht As Worksheet, c1 As Range, c2 As range
For Each sht In ActiveWorkbook.Worksheets
If sht.Name Like "0*" Then
Set c1 = sht.Columns("J:J").Find(What: = "Sum of Current Activity", _
LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
Set c2 = Sheets("Reviewer Sheet").Columns("C:C").Find( _
What:= sht.Name & " Total", _
LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
If not c1 is nothing and not c2 is nothing then
'edit: create link instead of copy value
c2.offset(0, 14).Formula = _
"='" & c1.parent.Name & "'!" & c1.offset(0,1).Address(true, true)
End if
End If
Next sht
End Sub
в этом коде, как я могу вставить значения как ссылку, прямо сейчас он вставляется как значение без ссылки.
Привет, Тим, одна проблема в коде, и я не могу понять, как ее решить. В столбце J у меня есть более одного кода «Сумма текущей активности», скопируйте только первый, но я хочу скопировать значение рядом со вторым «Сумма текущей активности» в столбце. Есть ли у вас какие-либо идеи?
просто потому, что задача проста, вы можете использовать оператор On Error Resume Next и выполнить прямую вставку Value между диапазонами:
Sub main()
Dim sht As Worksheet
On Error Resume Next ' prevent any subsequent 'Find()' method failure fro stopping the code
For Each sht In Worksheets
If Left(sht.Name, 1) = "0" Then _
Sheets("Reviewer Sheet").Columns("C:C").Find( _
What:=sht.Name & " Total", _
LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False).Offset(0, 14).Value = sht.Columns("J:J").Find(What: = "Sum of Current Activity", _
LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False).Offset(0, 1).Value
Next
End Sub
Я еще раз подчеркиваю, что On Error Resume Next здесь используется только потому, что это случай, когда вы можете полностью контролировать его побочные эффекты, которые могут возникнуть из-за игнорирования ошибок и продолжения.
если вы используете этот фрагмент в более крупном коде, чем близко фрагмент с оператором On Error GoTo 0, и возобновите обработку ошибок по умолчанию, прежде чем переходить к другому коду.
Спасибо всем за помощь! Специально для Тима Вильямса огромное спасибо.
Если вы поместите Вариант Явный вверху таблицы с кодами, вы быстро обнаружите, что использовали
£1в£1 = ActiveSheet.Name & f2, а затем пытались найтиf1.