Значения не отражаются должным образом

У меня вопрос по 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 текстов и иногда пропускает значения.

Если вы поместите Вариант Явный вверху таблицы с кодами, вы быстро обнаружите, что использовали £1 в £1 = ActiveSheet.Name & f2, а затем пытались найти f1.

user4039065 27.10.2018 06:13

О, это опечатка в посте, в исходном коде я использую f1, а не 1 фунт стерлингов

N R 27.10.2018 06:16

Избавьтесь от On Error Resume Next и попробуйте еще раз.

user4039065 27.10.2018 06:33

Также есть x1Next

Tim Williams 27.10.2018 07:01
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
69
2

Ответы 2

Не тестировалось, но должно работать что-то вроде этого:

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

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

N R 27.10.2018 23:04

Привет, Тим, одна проблема в коде, и я не могу понять, как ее решить. В столбце J у меня есть более одного кода «Сумма текущей активности», скопируйте только первый, но я хочу скопировать значение рядом со вторым «Сумма текущей активности» в столбце. Есть ли у вас какие-либо идеи?

N R 05.11.2018 01:19

просто потому, что задача проста, вы можете использовать оператор 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, и возобновите обработку ошибок по умолчанию, прежде чем переходить к другому коду.

Спасибо всем за помощь! Специально для Тима Вильямса огромное спасибо.

N R 28.10.2018 18:20

Другие вопросы по теме