#excel #vba
#excel #vba
Вопрос:
Я пытаюсь заставить код перебирать диапазон. Например, он должен принимать значение в ячейке M53, использовать его, затем выполнять код и делать то же самое со значением в ячейке M54. Первая итерация работает, но затем, похоже, она продолжает работать в ячейке M53.
Я изо всех сил пытаюсь разобраться с этим.
Sub TestMacro1()
Dim n As Integer
Dim Strike As Range
Set Strike = Range("M53:M54")
n = 1
Application.ScreenUpdating = False
For Each cell In Strike
cell.Select
Selection.Copy
Range("E19").PasteSpecial xlPasteValues
If Checker = True Then
Range("E26").Select
Selection.Copy
Range("N53").Offset(n).PasteSpecial xlPasteValues
n = n 1
End If
Next cell
Application.ScreenUpdating = True
End Sub
Функция проверки определяется как:
Function Checker() As Boolean
Dim tmp
Dim c As Object
tmp = False
ActiveSheet.Calculate
ActiveSheet.Calculate
With ActiveSheet.UsedRange
Set c = .Find("request", LookIn:=xlValues)
If Not c Is Nothing Then
Application.OnTime Now TimeValue("00:00:06"), "TestMacro1"
tmp = False
Else
tmp = True
End If
End With
Checker = tmp
End Function
Комментарии:
1. что такое
Checker
? Я не вижу, чтобы это было объявлено.2. Я подозреваю, что это связано с побочным эффектом в вашей
Checker()
функции, которая вызываетApplication.OnTime
. Вероятно, вам следует выйти, если он возвращает false, потому что он будет планировать макрос один раз для каждой дополнительной итерации цикла, если вы этого не сделаете. Кажется, все остальное работает нормально, когда я его тестирую.3. @Comintern Извините, я не совсем понимаю, как будет выглядеть функция проверки, если я включу это?
4.
If Checker = True Then ... [existing code] ... Else Exit For
5. В настоящее время у меня есть это (извините, это не красиво), но проблема is…it заполняет первую ячейку нормально и вставляет значение рядом с ней. Затем он пробует следующую ячейку в диапазоне и вводит ее, но не вставляет значение. Затем он снова повторяется с первой ячейкой, и так продолжается? Ссылка
Ответ №1:
Пожалуйста, попробуйте это.
Sub TestMacro2()
Sub TestMacro2()
Dim cell As Range
Dim Strike As Range
Set Strike = Range("M53:M54")
Application.ScreenUpdating = False
For Each cell In Strike
cell.Copy
Range("E19").PasteSpecial xlPasteValues 'fixed range
If Checker = True Then
ActiveSheet.Calculate
Range("E26").Copy
cell.Offset(0, 1).PasteSpecial xlPasteValues
End If
Next cell
Application.ScreenUpdating = True
End Sub
Комментарии:
1. Я не уверен, что я вполне понимаю. Я вставил саму функцию проверки выше
2. пожалуйста, проигнорируйте комментарий «Проверка», который я разместил до того, как вы отредактировали свой пост.
3. попробуйте избежать использования
Select
, вы можете просто использоватьRange("E26").Copy
иRange("N53").Offset(n).PasteSpecial xlPasteValues
4. Спасибо @ShaiRado, я внес эти изменения. Но есть ли какая-либо причина, по которой вы можете понять, почему код не проходит через ячейки должным образом? Похоже, что он просто запускается на M55, и он также продолжает работать, постоянно заполняя N54 снова и снова значением в M55
5. @CuriousStudent чего вы пытаетесь достичь? Код перебирает диапазон, копирует значение ячейки и вставляет его в диапазон («E19»). если проверка истинна, вы вставляете в фиксированном диапазоне («N53») смещение на n.