Вы хотите, чтобы заполнить столбец Q на листе данных со значением из листа внутреннего использования ячейки C7, всякий раз, когда столбец Р на той же самой строке равно ячейки С4. Я должен сказать, что это легко разрешимо с помощью формулы с использованием совпадения индексов или условной формулы, такой как =If(F2='Internal Use'!$C$4,'Internal Use'!$C$7,"")
(просто вставьте столбец F). По крайней мере, это то, что ваш код в настоящее время более или менее делает или, кажется, хочет достичь.
Это, пожалуйста, давайте посмотрим на ваш код: Прежде всего, избегайте .Activate
, это лишние накладные расходы. Это активирует рабочий лист. (Кстати, последний используемый вами .activate
находится на листе данных, поэтому он остается там). Затем вы храните C4 в необъявленной переменной, называемой проектом, которую вы никогда не используете. Далее вы снова ссылаетесь на ячейки всюду в цикле. Это означает, что при доступе к этим ячейкам и чтении этих ячеек есть огромные накладные расходы. Наконец, вы делаете это в цикле; Я предполагаю, что это нужно, чтобы не заполнить ни одну из других строк.
Чтобы сделать код работы, вы можете использовать:
Sub CommandButton2_Click()
Dim project as string
Dim writeValue as string
Dim lr as long
Dim wr as long
project = Worksheets("Internal Use").Range("C4").value
writeValue = Worksheets("data").Range("C7").value
lr = Range("A" & Rows.Count).End(xlUp).Row
With Worksheets("data")
For wr = 2 To lr
If .Range("F" & wr).value = project Then
.Range("Q" & rw).value = writeValue
End If
Next wr
End With
End Sub
Это будет делать трюк.
Neater будет избегать цикла for и тестирования всех ячеек. Два варианта помещают все столбцы F и Q в массивы и циклически перебирают их, изменяя Q-массив, прежде чем выгружать значения обратно на листе или используют алгоритм поиска, такой как Chip Pearons FindAll: http://www.cpearson.com/excel/findall.aspx