Обновление значения ячейки в соответствии со значениями из другого столбца

моему другу нужна помощь с этим кодом

Sub autoUpdate() Dim R As String Dim A As String Dim G As String Dim myrange As Range Dim givenrng As Range Set myrange = Sheets("Sheet1").Cells(2, 2) Set givenrng = Sheets("Sheet1").Cells(2, 3) 'If Worksheets("Project Details").Range("L") = R And Worksheets("Project Detials").Range("M") = R Then 'Worksheets("Project Details").Range("K") = R If myrange.Value = "F" Then givenrng.Value = "B" End sub 

Вместо того, чтобы использовать myrange как конкретную ячейку, можно изменить ее на диапазон столбцов? Например, если какая-либо из ячеек в столбце A равна F, то соответствующая строка в столбце B будет вводить значение в виде B.

Вы можете использовать метод .Find() , а затем использовать свойство .Offset чтобы ввести значение в столбец ячейки 1 справа.

 Option Explicit Sub findValue() Dim rngCol As Range, rngFound As Range Set rngCol = Columns("A:A") Set rngFound = rngCol.Find(What:="F", LookIn:=xlValues) If Not rngFound Is Nothing Then rngFound.Offset(0, 1).Value = "B" End If End Sub 

Это находит только первую строку, которая соответствует заданному значению в пределах заданного диапазона. Если в пределах диапазона имеется несколько совпадений, вам необходимо включить это в цикл.

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

Вы можете либо ввести значение в ячейку во время цикла.

 Sub arrayFindValue2() Dim rngValues() As Variant Dim lrow As Long, i As Long lrow = Cells(Rows.Count, 1).End(xlUp).Row rngValues = Range(Cells(1, 1), Cells(lrow, 2)) For i = 1 To UBound(rngValues, 1) If rngValues(i, 1) = "F" Then Cells(i, 2).Value = "B" End If Next i End Sub 

На 60 480 строках данных, с 6048 совпадениями, выше было потрачено 0,84 секунды. Даже при отключении обновления экрана это уменьшено до 0,80 секунды.

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

 Sub arrayFindValue() Dim rngValues() As Variant Dim lrow As Long, i As Long lrow = Cells(Rows.Count, 1).End(xlUp).Row rngValues = Range(Cells(1, 1), Cells(lrow, 2)) For i = 1 To UBound(rngValues, 1) If rngValues(i, 1) = "F" Then rngValues(i, 2) = "B" End If Next i Range("A1").Resize(UBound(rngValues, 1), 2).Value = rngValues End Sub 

В соответствии с теми же критериями теста выше было потрачено 0,13 секунды.

EDIT: ОБЪЯСНЕНИЕ

lrow = Cells(Rows.Count, 1).End(xlUp).Row Это найдет последнюю строку в столбце A. Rows.Count узнает, сколько строк находится на листе, а 1 столбец A. .End(xlUp) поднимается в столбце A, начиная с нижней строки, которая была найдена. Выполняя это, мы знаем последнюю строку с данными в столбце A.

Range(Cells(1, 1), Cells(lrow, 2)) Затем мы используем последнюю известную строку для создания массива со значениями. Cells(1,1) представляют Range("A1") а затем Cells(lrow,2) будут представлять последнюю строку, в которой были данные внутри столбца A, но назначая столбец B также массиву (чтобы мы могли заполнить массив со значениями для назначения столбцу B). Он эффективно соответствует Range("A1:B60480") .

Попробуй это?

 Dim lastrow as Long lastrow = Cells(Rows.Count, 2).End(xlUp).Row For i = 1 to lastrow If Cells(i, 2).Value = "F" Then Cells(i, 3).Value = "B" End If Next i 

Поэтому из первой строки листа в последнюю строку листа, содержащего данные, если ячейка в столбце B содержит «F», столбец C покажет «B» (так как это столбцы, в которых в настоящее время отображаются ячейки из кода вашего друга ).

Хотя, если это определенно из столбца A в столбец B, вы можете просто изменить значение «Если:

  If Cells(i, 1).Value = "F" Then Cells(i, 2).Value = "B" End If 

EDIT : Хотя вышеупомянутый ответ был принят, я вернулся и понял, откуда возникла ошибка несоответствия типа. Я забыл проверить, что номер столбца в строке lastrow = Cells(Rows.Count, 2).End(xlUp).Row соответствует столбцу, который просматривается.

Interesting Posts

Использование или () внутри индекса / матча?

Команда VBA Userform Command для копирования строки на лист перед редактированием информации

Запуск SQL по таблице excel

Как динамически ссылаться на объекты vba?

Записывать datatable в excel template и добавлять backcolor в строку в excel

Закрытие открытой книги Excel в C #

Вставка новых строк и перемещение существующих с помощью OpenXML SDK 2.0

Как преобразовать файл excel в базу данных mysql?

Исправить столбцы DataFrame при чтении файла Excel с заголовком с объединенными ячейками

Автоматическое заполнение данных в существующий шаблон Excel

Более простой способ форматирования данных Excel для SQL-запроса

Как использовать результаты поиска Google в Excel VBA?

Excel Macro для импорта текстового файла с фиксированной шириной с помощью VBA

Как добавить 2 значения времени, которые находятся в разных форматах

макрос, который печатает видимую область после фильтра в excel

Давайте будем гением компьютера.