Всем привет! Возникла задача по поиску значения из одного листа и вставкой другого значения из найденной строки в другом листе в другую ячейку первого листа. Начал я конечно с формул, так как их я знаю, практикую, но формула мне не подходит, так как если значение не найдено, то в эту ячейку мне нужно вписать всё вручную.
То есть: 1. Я ввожу номер телефона в ячейке B1, макрос ищет это значение на соседнем листе и если находит его в столбце C:C, то берёт значение из ячейки E этой же строки и вставляет в ячейку B2 и на этом завершает цикл. 2. Если макрос не находит это значение, то в ячейке B2 остаётся всё пусто и я в неё вписываю данные вручную
Файлик примера во вложении
Всем привет! Возникла задача по поиску значения из одного листа и вставкой другого значения из найденной строки в другом листе в другую ячейку первого листа. Начал я конечно с формул, так как их я знаю, практикую, но формула мне не подходит, так как если значение не найдено, то в эту ячейку мне нужно вписать всё вручную.
То есть: 1. Я ввожу номер телефона в ячейке B1, макрос ищет это значение на соседнем листе и если находит его в столбце C:C, то берёт значение из ячейки E этой же строки и вставляет в ячейку B2 и на этом завершает цикл. 2. Если макрос не находит это значение, то в ячейке B2 остаётся всё пусто и я в неё вписываю данные вручную
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address(0, 0) <> "B1" Then Exit Sub
Dim r As Range Set r = Sheets("Данные").Columns(3).Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then Range("B2").Value = "fone nicht" Else Range("B2").Value = r(1, 3).Value End If End Sub
[/vba]
Narahon, привет попробуйте [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address(0, 0) <> "B1" Then Exit Sub
Dim r As Range Set r = Sheets("Данные").Columns(3).Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then Range("B2").Value = "fone nicht" Else Range("B2").Value = r(1, 3).Value End If End Sub
В отдельном файле всё работает отлично, но у меня есть сделанная таблица и в ней, к сожалению, не работает этот макрос, чувствую, что мешает другой код:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub ad_ = Target.Address(0, 0) With Sheets("Данные") r0_ = 3 c0_ = 1 r1_ = .Cells(.Rows.Count, c0_).End(3).Row c1_ = 16 nr_ = r1_ - r0_ + 1 nc_ = c1_ - c0_ + 1 ar = .Cells(r0_, c0_).Resize(nr_, nc_) End With Select Case ad_ Case "B4" c_ = 4 ' Case "B6" ' c_ = 6 Case "B7" c_ = 7 cñ_ = 6 Case "E7" c_ = 15 Case Else Exit Sub End Select ReDim ar1(1 To 8, 1 To 1) ReDim ar2(1 To 8, 1 To 1) Set slov = CreateObject("Scripting.Dictionary") With slov If cñ_ Then z_ = Target.Offset(-1).Value & Target.Value For i = 1 To nr_ .Item(ar(i, cñ_) & ar(i, c_)) = i Next i Else z_ = Target.Value For i = 1 To nr_ .Item(ar(i, c_)) = i Next i End If If .Exists(z_) Then str_ = .Item(z_) For j = 1 To 8 ar1(j, 1) = ar(str_, j) ar2(j, 1) = ar(str_, j + 8) Next j Application.EnableEvents = 0 Range("B1").Resize(8) = ar1 Range("E1").Resize(7) = ar2 Application.EnableEvents = 1 End If End With
End Sub
[/vba]
Значение для поиска находится всегда в ячейке B4, а значение для подстановки в 18 столбце, я ячейка для заполнения E20? я немного переделывал Ваш код под себя, но код не работает((
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address(0, 0) <> "B4" Then Exit Sub
Dim r As Range Set r = Sheets("Данные").Columns(4).Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then Range("E20").Value = "fone nicht" Else Range("E20").Value = r(1, 17).Value End If End Sub
В отдельном файле всё работает отлично, но у меня есть сделанная таблица и в ней, к сожалению, не работает этот макрос, чувствую, что мешает другой код:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub ad_ = Target.Address(0, 0) With Sheets("Данные") r0_ = 3 c0_ = 1 r1_ = .Cells(.Rows.Count, c0_).End(3).Row c1_ = 16 nr_ = r1_ - r0_ + 1 nc_ = c1_ - c0_ + 1 ar = .Cells(r0_, c0_).Resize(nr_, nc_) End With Select Case ad_ Case "B4" c_ = 4 ' Case "B6" ' c_ = 6 Case "B7" c_ = 7 cñ_ = 6 Case "E7" c_ = 15 Case Else Exit Sub End Select ReDim ar1(1 To 8, 1 To 1) ReDim ar2(1 To 8, 1 To 1) Set slov = CreateObject("Scripting.Dictionary") With slov If cñ_ Then z_ = Target.Offset(-1).Value & Target.Value For i = 1 To nr_ .Item(ar(i, cñ_) & ar(i, c_)) = i Next i Else z_ = Target.Value For i = 1 To nr_ .Item(ar(i, c_)) = i Next i End If If .Exists(z_) Then str_ = .Item(z_) For j = 1 To 8 ar1(j, 1) = ar(str_, j) ar2(j, 1) = ar(str_, j + 8) Next j Application.EnableEvents = 0 Range("B1").Resize(8) = ar1 Range("E1").Resize(7) = ar2 Application.EnableEvents = 1 End If End With
End Sub
[/vba]
Значение для поиска находится всегда в ячейке B4, а значение для подстановки в 18 столбце, я ячейка для заполнения E20? я немного переделывал Ваш код под себя, но код не работает((
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address(0, 0) <> "B4" Then Exit Sub
Dim r As Range Set r = Sheets("Данные").Columns(4).Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then Range("E20").Value = "fone nicht" Else Range("E20").Value = r(1, 17).Value End If End Sub
Narahon, на основании макроса nilem подправил ваш Worksheet_Change
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'Не обрабатывать события. Dim r As Range On Error Resume Next If Target.Count > 1 Then Exit Sub ad_ = Target.Address(0, 0) With Sheets("База клиентов") r0_ = 3 c0_ = 1 r1_ = .Cells(.Rows.Count, c0_).End(3).Row c1_ = 16 nr_ = r1_ - r0_ + 1 nc_ = c1_ - c0_ + 1 ar = .Cells(r0_, c0_).Resize(nr_, nc_) End With Select Case ad_ Case "B4" c_ = 4 ' Case "B6" ' c_ = 6 Set r = Sheets("База клиентов").Columns(4).Find(Target.Value, LookIn:=xlFormulas, LookAt:=xlWhole) If r Is Nothing Then Range("E20").Value = "phone not found" Else Range("E20").Value = r(1, 15).Value End If
Case "B7" c_ = 7 cс_ = 6 Case "E7" c_ = 15 Case Else Exit Sub End Select ReDim ar1(1 To 8, 1 To 1) ReDim ar2(1 To 8, 1 To 1) Set slov = CreateObject("Scripting.Dictionary") With slov If cс_ Then z_ = Target.Offset(-1).Value & Target.Value For i = 1 To nr_ .Item(ar(i, cс_) & ar(i, c_)) = i Next i Else z_ = Target.Value For i = 1 To nr_ .Item(ar(i, c_)) = i Next i End If If .Exists(z_) Then str_ = .Item(z_) For j = 1 To 8 ar1(j, 1) = ar(str_, j) ar2(j, 1) = ar(str_, j + 8) Next j Application.EnableEvents = 0 Range("B1").Resize(8) = ar1 Range("E1").Resize(7) = ar2 Application.EnableEvents = 1 End If End With Application.EnableEvents = True End Sub
[/vba]
обратите внимание, что надо или [vba]
Код
...Find(Target.Value, LookIn:=xlFormulas,...
[/vba] или [vba]
Код
...Find(Target.Text, LookIn:=xlValues,...
[/vba] т.к. значение ячейки(Value) у вас изменено форматированием.
Narahon, на основании макроса nilem подправил ваш Worksheet_Change
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'Не обрабатывать события. Dim r As Range On Error Resume Next If Target.Count > 1 Then Exit Sub ad_ = Target.Address(0, 0) With Sheets("База клиентов") r0_ = 3 c0_ = 1 r1_ = .Cells(.Rows.Count, c0_).End(3).Row c1_ = 16 nr_ = r1_ - r0_ + 1 nc_ = c1_ - c0_ + 1 ar = .Cells(r0_, c0_).Resize(nr_, nc_) End With Select Case ad_ Case "B4" c_ = 4 ' Case "B6" ' c_ = 6 Set r = Sheets("База клиентов").Columns(4).Find(Target.Value, LookIn:=xlFormulas, LookAt:=xlWhole) If r Is Nothing Then Range("E20").Value = "phone not found" Else Range("E20").Value = r(1, 15).Value End If
Case "B7" c_ = 7 cс_ = 6 Case "E7" c_ = 15 Case Else Exit Sub End Select ReDim ar1(1 To 8, 1 To 1) ReDim ar2(1 To 8, 1 To 1) Set slov = CreateObject("Scripting.Dictionary") With slov If cс_ Then z_ = Target.Offset(-1).Value & Target.Value For i = 1 To nr_ .Item(ar(i, cс_) & ar(i, c_)) = i Next i Else z_ = Target.Value For i = 1 To nr_ .Item(ar(i, c_)) = i Next i End If If .Exists(z_) Then str_ = .Item(z_) For j = 1 To 8 ar1(j, 1) = ar(str_, j) ar2(j, 1) = ar(str_, j + 8) Next j Application.EnableEvents = 0 Range("B1").Resize(8) = ar1 Range("E1").Resize(7) = ar2 Application.EnableEvents = 1 End If End With Application.EnableEvents = True End Sub
[/vba]
обратите внимание, что надо или [vba]
Код
...Find(Target.Value, LookIn:=xlFormulas,...
[/vba] или [vba]
Код
...Find(Target.Text, LookIn:=xlValues,...
[/vba] т.к. значение ячейки(Value) у вас изменено форматированием.boa
Сообщение отредактировал boa - Среда, 05.12.2018, 22:04
на основании макроса nilem подправил ваш Worksheet_Change
Спасибо, всё работает просто замечательно) Премного благодарен.
Если не сложо, могли бы ещё с одним помочь?
Создал лист Анкета с кнопкой, при нажатии на которую, должны с этого листа вставляться именно значения, в лист "Ввод данных", пытался создать простой макрос, на примерах из интернета, но простое копирование и вставка - не работает, так как вставляются формулы, а не значения. Еще и в добавок к этому, в столбик B не вставляется ничего, так как это объединённый столбик.
на основании макроса nilem подправил ваш Worksheet_Change
Спасибо, всё работает просто замечательно) Премного благодарен.
Если не сложо, могли бы ещё с одним помочь?
Создал лист Анкета с кнопкой, при нажатии на которую, должны с этого листа вставляться именно значения, в лист "Ввод данных", пытался создать простой макрос, на примерах из интернета, но простое копирование и вставка - не работает, так как вставляются формулы, а не значения. Еще и в добавок к этому, в столбик B не вставляется ничего, так как это объединённый столбик.