VBA看不到在循环外创build的对象

所以我在我的代码FindNext问题,它像vba看不到我在循环外创build的对象。

Sub Macro1() 'Dwa skoroszyty Dim ws1, ws2 As Worksheet Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Wynik") Dim NaglowekWiersz, NaglowekKolumna As Integer NaglowekKolumna = 1 NaglowekWiersz = 1 Worksheets("Sheet1").Activate Set LpDoZnalezienia = ws1.Range("A:A").Find("lp.", LookAt:=xlPart) Set RazemDoZnalezienia = ws1.Range("A:A").Find("Razem", LookAt:=xlWhole) 'Petla do szukania pracowników For a = 1 To 3 If (a > 1) Then Set LpDoZnalezienia = ws1.Range("A:A").FindNext(LpDoZnalezienia).Offset(1, 0) Set RazemDoZnalezienia = ws1.Range("A:A").FindNext(RazemDoZnalezienia) End If 'Znalezienie danego pracownika Set Pracownik = ws1.Range(LpDoZnalezienia, RazemDoZnalezienia).Resize(, 12) Worksheets("Wynik").Activate For b = 1 To 35 'Dana Wartość z arkusza wynik aka nagłówek Dim szukanaWartosc As String szukanaWartosc = ws2.Cells(1, NaglowekKolumna).Value 'Znaleziona wartosc w arkuszu Sheet1 Worksheets("Sheet1").Activate Set WartoscDoZnalezienia = Pracownik.Find(szukanaWartosc, LookAt:=xlWhole) If WartoscDoZnalezienia Is Nothing Then GoTo Line Else Set Znalezione = WartoscDoZnalezienia.Offset(0, 2) End If Worksheets("Wynik").Activate ws2.Cells(NaglowekWiersz + 1, NaglowekKolumna) = Znalezione.Value Line: 'Przesuniecie naglowka o 1 w arkuszu wynik aby szukalo kolejnej wartości NaglowekKolumna = NaglowekKolumna + 1 Next b NaglowekKolumna = a NaglowekWiersz = NaglowekWiersz + 1 Next a End Sub 

当我尝试使用FindNext与先前声明find它给我运行时错误91对象或variables未设置在此行中:

代码转到findNext时出错

代码转到findNext时出错

当我将这两行复制到循环外部时,它完美地工作。 有人可以告诉我什么即时通讯代码做错了吗?

Find()FindNext()有点棘手,文档有点混乱。

用于.FindNext.Find()存储在ws1.Range("A:A") ,而不是在LpDoZnalezienia 。 简而言之,您需要在Range保留查找所在Range的实例。

所以你的问题的解决scheme将是:

 With ws1.Range("A:A") Set LpDoZnalezienia = .Find("lp.", LookAt:=xlPart) If Not LpDoZnalezienia Is Nothing Then For a = 1 To 3 If (a > 1) Then Set LpDoZnalezienia = .FindNext(LpDoZnalezienia).Offset(1, 0) End If End If End With With ws1.Range("A:A") Set RazemDoZnalezienia = .Find("Razem", LookAt:=xlWhole) If Not RazemDoZnalezienia Is Nothing Then For a = 1 To 3 If (a > 1) Then Set RazemDoZnalezienia = .FindNext(RazemDoZnalezienia) End If End If End With 

注意:如果您只有1或2次出现“lp”。 或者“Razem”你会第二次获得第一个范围,没有内部处理来检查.FindNext()是否已经给你一个特定的Range 。 你将不得不自己编码这个例子:

 With ws.Cells Set fr = .Find("value", , xlValues, xlWhole) If Not fr Is Nothing Then frAddress = fr.Address Do Set fr = .FindNext(After:=fr) 'Do something with found range here. Debug.print fr.Address Loop While frAddress <> fr.Address End If End With