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

551
KAREN KENDALL

Некоторое время я использовал следующий код, но мне нужна помощь в внесении одного изменения. Я пытался и пытался, но это не сработает. Если кто-то может посмотреть, мое исследование говорит, что я ищу «цикл изменений, чтобы записывать результаты в дополнительные ячейки». Пожалуйста, смотрите мое изображение Excel ниже.

Прямо сейчас код находит все совпадающие номера, введенные в ячейку A1, и размещает их в соответствующих ячейках L1: l12. Мне нужен код, чтобы также разместить ту же информацию только в одной из следующих ячеек: C17, C18, F17, F18. Кроме того, если код может скопировать и вставить число в ячейке под соответствующим номером (из ячейки A1), см. Пример результата ниже) в ячейку слева от вышеуказанной вставки цикла изменения в следующие ячейки: B17, B18, Е17, Е18.

Пример с ожидаемым результатом в соответствии с образцом Excel. Номер 8 был введен в ячейку А1 и найден 8 в ячейке А34. Таким образом, 8-15 будут скопированы и вставлены в L8 и C17. Также будет скопировано число 7 из ячейки A35 (следующее число) в ячейку B17. Код также сделал бы то же самое для ячейки F20 и E21. После всего копирования и вставки все ячейки B34, C34 и D34 должны быть удалены, и поэтому они будут пустыми. То же самое для F20, G20 и H20. Я надеюсь, что это понятно, если нет, пожалуйста, сообщите, и я уточню.

Мой рабочий код ниже, а моя попытка ниже этого кода.

Excel sheet

Рабочий код:

Sub do_it()  Dim n, sht As Worksheet, cell As Range, num, tmp, rngDest As Range  Set sht = ActiveSheet  n = sht.Range("A1")  For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells  tmp = cell.Offset(0, 1).Value  If cell.Value = n And tmp Like "*#-#*" Then  'get the first number num = CLng(Trim(Split(tmp, "-")(0))) Debug.Print "Found a positive result in " & cell.Address 'find the next empty cell in the appropriate row Set rngDest = sht.Cells(num, sht.Columns.Count).End(xlToLeft).Offset(0, 1) 'make sure not to add before col L If rngDest.Column < 12 Then Set rngDest = sht.Cells(num, 12)  cell.Offset(0, 1).Copy rngDest  End If Next  End Sub 

Моя попытка:

Sub do_it()  Dim n, sht As Worksheet, cell As Range, num, tmp, rngDest As Range  Set sht = ActiveSheet  n = sht.Range("A1")  For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cells  tmp = cell.Offset(0, 1).Value  If cell.Value = n And tmp Like "*#-#*" Then  'get the first number num = CLng(Trim(Split(tmp, "-")(0))) Debug.Print "Found a positive result in " & cell.Address 'find the next empty cell in the appropriate row Set rngDest = (“ C17, C18, F17, F18’) cell.Offset(0, 1).Copy rngDest  End If Next  End Sub 
0

1 ответ на вопрос

0
Christofer Weber

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

Во-первых, строка For Each cell In sht.Range("A20:A34,D20:D34,G20:G34").Cellsне соответствует ячейкам, используемым в вашем примере, поэтому я изменил это на:

For Each cell In sht.Range("A20:A34,E20:E34,I20:I34").Cells 

Затем я перехватил переменную tmp в конце, потому что она больше не используется, и установил ее, чтобы найти последнюю ячейку столбца, в которой было найдено совпадение, например:

Set tmp = sht.Cells(Cells(Rows.Count, cell.Column).End(xlUp).Row, cell.Column) 

Затем нам нужно указать новые поля и убедиться, что мы заполняем их только один раз. Вы можете сделать это, проверив, является ли первый пустым, или со счетчиком. В любом случае, он будет работать правильно только до тех пор, пока вы найдете менее 4 совпадений.

Конечный результат был таким, измените по мере необходимости;

Sub do_it()  Dim sht As Worksheet, n As String, cell, num, tmp, rngDest As Range, i As Integer Set sht = ActiveSheet n = sht.Range("A1").Value i = 0 For Each cell In sht.Range("A20:A34,E20:E34,I20:I34").Cells tmp = cell.Offset(0, 1).Value If cell.Value = n And tmp Like "*#-#*" Then 'get the first number num = CLng(Trim(Split(tmp, "-")(0))) 'find the next empty cell in the appropriate row Set rngDest = sht.Cells(num, sht.Columns.Count).End(xlToLeft).Offset(0, 1) 'make sure not to add before col L If rngDest.Column < 12 Then Set rngDest = sht.Cells(num, 12) cell.Offset(0, 1).Copy rngDest  ' This is getting the next number in A/E/I---- Set tmp = cell.Offset(1, 0)  ' This is filling up B17 - F18 in order until filled If sht.Range("B17").Value = "" Then sht.Range("C17").Value = cell.Offset(0, 1).Value sht.Range("B17").Value = tmp.Value ElseIf sht.Range("B18").Value = "" Then sht.Range("C18").Value = cell.Offset(0, 1).Value sht.Range("B18").Value = tmp.Value ElseIf sht.Range("E17").Value = "" Then sht.Range("F17").Value = cell.Offset(0, 1).Value sht.Range("E17").Value = tmp.Value ElseIf sht.Range("E18").Value = "" Then sht.Range("F18").Value = cell.Offset(0, 1).Value sht.Range("E18").Value = tmp.Value End If '---- This clears the BCD/FGH/JKL columns after using the value ---- 'cell.Offset(0, 1).Resize(, 3).Value = ""   End If Next cell End Sub 
Привет, Кристофер. Большое спасибо за вашу помощь в этом макросе. Я только что проверил сложение, и вот что происходит: - Кажется, что макрос больше не использует введенный номер в ячейке A1. Он копирует все в ячейки L1: L12 - числа в ячейках A20: A34, E20: E34, I20: I34 не копируются, а перемещаются (требуется только часть копирования). Так что, если бы могли помочь по этим двум вопросам, это было бы здорово. KAREN KENDALL 6 лет назад 0
Ой, я испортил линию. 'If n And tmp Like "* # - # *" ​​Then "должно быть" If cell.Value = n And tmp Like "* # - # *" ​​Then "Я обновлю код. Это исправит неправильное использование A1. Я не уверен, что вы подразумеваете под "не копируются, а перемещаются". Я не касаюсь значений в столбцах A, E и I. Если вы имеете в виду значения в «B, C, D» / «F, G, H» / «J, K, L», то я копирую и удаляя их. Вы сказали, что хотите, чтобы они были пустыми? Если вы не хотите удалять значения, закомментируйте часть 'cell.Offset (0, 1) .Resize (, 3) .Value = "" ". Christofer Weber 6 лет назад 0
Извините, есть еще одна ошибка. Я думал, что вы конкретно хотели получить номер «A35», когда запись была найдена в столбце A, и E35, когда он был найден в столбце E. Это можно изменить очень легко, но что должно произойти, если ниже номера нет? Christofer Weber 6 лет назад 0
Извините, я не был так ясен, как следовало бы. Для диапазона: A20: A34, E20: E34, I20: I34 найденное число может находиться в любой из этих ячеек, поэтому всегда используйте следующую ячейку вниз (их всегда будет число). Пожалуйста, посмотрите образец листа Excel. Еще раз спасибо за вашу помощь. KAREN KENDALL 6 лет назад 0
Хорошо, вот как это должно работать сейчас, попробуйте. Christofer Weber 6 лет назад 0
Пара проблем: Если найденный номер был в E20, ячейка E21 использовалась бы как число, которое будет скопировано и отправлено. Таким образом, найденное число может быть в любой одной или двух ячейках в диапазоне ячеек: A20: A34, E20: E34 и I20: I34, и следующая ячейка будет использоваться в качестве числа, которое будет помещено в соответствующую ячейку B17, C17, E17 , E18. Вторая проблема - когда он находит номер из ячейки A1, он должен только копировать и вставлять. Если вы проверите образец листа Excel, который я разместил, у него будет 2 примера с результатом. Это может помочь дать визуальный взгляд. Опять извините за неприятности. KAREN KENDALL 6 лет назад 0
Я не понимаю проблемы. Если первый результат найден в E20, значение E21 копируется в B17. Разве это не то, что вы хотели? Потому что так я выгляжу ... Christofer Weber 6 лет назад 0
На ваш вопрос вы говорите, а я цитирую; «После всего копирования и вставки все ячейки B34, C34 и D34 должны быть удалены, и поэтому они будут пустыми. То же самое для F20, G20 и H20». Так что вы говорите? Вы не хотите их удалять? Затем просто закомментируйте последнюю строку, которая очищает их, как я сказал. Christofer Weber 6 лет назад 0
Привет, есть идея. Если мы посмотрим на образец листа Excel, вы увидите ячейку A1 с цифрой 8. Только в этом примере это номер поиска для ячеек A20: A34, E20: E34, I20: I34. Найденные ячейки A34 и E20 (ячейка справа B34, G20) копируются в ячейки L8 и L1. Ячейка B34 копируется в ячейку C17, а F20 копируется в ячейку C18. Ячейка A35 копируется в B17, а ячейка E21 в B18. Клетки B34, C34, D34 и F20, G20, H20 затем удаляются. Это будет сделано для любого найденного числа А1. Конец. В данный момент найденный номер удаляется, а не копируется. Общение может быть трудным. Еще раз спасибо за вашу помощь. KAREN KENDALL 6 лет назад 0
Исправление: моя строка "Прямо сейчас найденный номер удаляется, а не копируется. Следует прочитать Прямо сейчас найденный номер удаляется. KAREN KENDALL 6 лет назад 0
Да? И я сказал тебе ... не важно, я закомментировал эту последнюю строчку для тебя. Теперь он ничего не удаляет. Лучше? Christofer Weber 6 лет назад 0
Это работает, это работает! Вы были очень терпеливы со мной, и я очень благодарен, но мне было интересно, могу ли я попросить еще одну маленькую услугу. Если у меня был только один диапазон ячеек, скажем, A20: A35, который имеет только один ряд чисел справа от него (в отличие от других диапазонов ячеек, которые имеют в общей сложности 3 строки справа от него), поэтому только ячейки B20: B35 и никаких других строк, какую строку кода я использую и где она размещается? Как всегда, большое спасибо. KAREN KENDALL 6 лет назад 0
Я имею в виду, технически, вы должны иметь возможность использовать точно такой же код. Если вы хотите пропустить другие столбцы, вы можете изменить Для каждой ячейки в sht.Range («A20: A34, E20: E34, I20: I34»). Ячейки для Для каждой ячейки в sht.Range («A20: A34» ) .Cells. Числа в столбцах «C» и «D» никогда не затрагиваются кодом, поэтому, если они не существуют, это ничего не изменит. Если это то, что вы имеете в виду. Christofer Weber 6 лет назад 0
Я играл со строкой «Для каждой ячейки в sht.Range (« A20: A34 »). Ячейки», и она правильно работает только с изменением, но я также хотел бы сохранить остальные 2 строки, но с удаление двух других ячеек. Это как будто мне нужно 2 или более линий пыльника, чтобы сделать это. Одна линия для ячеек A20: A34 и другая для E20: E34, I20: I34. Еще раз спасибо. KAREN KENDALL 6 лет назад 0
Нет проблем разделить их и создать два цикла For или даже сделать цикл, выполняющий разные операции для разных строк. Я просто не уверен, что именно ты хочешь сделать по-другому. Christofer Weber 6 лет назад 0
Привет, я понял. Я действительно ценю всю вашу помощь. Карен KAREN KENDALL 6 лет назад 0

Похожие вопросы