#excel #vba
Вопрос:
У меня есть 2 разных файла листов в Excel. Я попытаюсь найти эквивалент значения даты, которое я ввел на первой странице, на второй странице. Я хочу вставить блок из первой ячейки, две ячейки справа от адреса найденного значения.
Поэтому я написал блок кода, как показано ниже
Dim aranan As Date Dim firstAddress As String Dim adres As Range Dim c As Range Private Sub CommandButton2_Click() aranan = Range("B1").Value Range("B2:G6").Select Selection.Copy With Worksheets(3).Range("A1:A500") Set adres = Range("A1:A100").Find(aranan, LookAt:=xlWhole, MatchCase:=True) If Not adres Is Nothing Then firstAddress = adres.Address Do ActiveSheet.Paste Destination:=Worksheets(2).Range("C1:H5") Loop While Not adres Is Nothing End If End With End Sub
Но при отладке я вижу, что значение моей переменной с именем «adres» пустое. Переменная с именем «аранан» содержит название даты. В чем мои ошибки?
Комментарии:
1. Ваш с блоком здесь ничего не делает. В каком диапазоне вы хотите выполнить поиск — A1:A500 или A1:A100 ?
2. на самом деле я хочу найти значение в переменной «aranan» во всем документе @Tim
3. Это звучит как совсем другой вопрос?
4. Я найду, где находится это значение на листе 2, и вставлю ячейку блока с первого листа в несколько ячеек справа от адреса ячейки, который я нашел здесь.
5. Можете ли вы привести примеры того, какие ценности
aranan
вы бы приняли? Даты могут быть сложными в Excel.
Ответ №1:
Логика «найти все совпадения» достаточно сложна, чтобы ее можно было поместить в отдельный метод — это упрощает управление вашей основной логикой.
Например:
Private Sub CommandButton2_Click() Dim dt As Date, col As Collection, c As Range dt = Me.Range("B1").Value 'Me = the worksheet for this code module Set col = FindAll(Worksheets(3).Range("A1:A500"), dt) If col.Count gt; 0 Then For Each c In col Me.Range("B2:G6").Copy c.Offset(0, 2) 'two columns over Next c Else MsgBox "No matches found" End If End Sub 'find all matches for `val` in a range, and return as a collection Public Function FindAll(rng As Range, val) As Collection Dim rv As New Collection, f As Range, addr As String Set f = rng.Find(what:=val, after:=rng.Cells(rng.Cells.CountLarge), _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False) If Not f Is Nothing Then addr = f.Address() 'first cell found Do Until f Is Nothing rv.Add f Set f = rng.FindNext(after:=f) If f.Address() = addr Then Exit Do 'exit if we've wrapped back to the start Loop Set FindAll = rv End Function
Комментарии:
1. Ты очень порадовал меня своим ответом. Огромное спасибо
2. Я подозреваю, что часть вашей проблемы, возможно, была связана с попыткой сопоставить даты, и этот ответ решал эту проблему, используя
LookIn:=xlValues
в качестве параметра inFind()
.