2016-02-01 5 views
0

Так что я VBA, который предполагают, чтобы скопировать на "data" лист и вставить его на "Internal Use" с помощью поиска ячейки на ячейку в "Internal Use" Я не получаю сообщение об ошибке он просто не делает этого, и после запуска макроса он просто остается на листе данных.VBA Копировать и Вставить

Что мне не хватает?

Sub CommandButton2_Click() 
Worksheets("Internal Use").Activate 
project = Range("C4") 
Worksheets("data").Activate 
nr = Range("A" & Rows.Count).End(xlUp).Row 
For Row = 2 To nr 
If Range("F" & Row) = Worksheets("Internal Use").Range("C4") Then 
Range("Q" & Row) = Worksheets("Internal Use").Range("C7") 
End If 

Next Row 

End Sub 

ответ

0

Трудно сказать, что вы пытаетесь сделать. Дайте мне знать, если вы этого хотите.

Sub CommandButton2_Click() 

Dim ws1 As Worksheet 
Dim ws2 As Worksheet 
Dim nr As Long 
Dim project As Variant 

Set ws1 = ThisWorkbook.WorkSheets("Internal Use") 
Set ws2 = ThisWorkbook.WorkSheets("data") 
project = ws1.Range("C4").Value2 

With ws1 
    nr = .Range("A" & .Rows.Count).End(xlUp).Row 

    For r = 2 To nr 
     If .Range("F" & r) = project Then 
      ws2.Range("Q" & r) = .Range("C7") 
     End If 
    Next 
End With 

End Sub 
0

Ricardo,

Ваш код работает отлично. Вопрос: чего вы пытаетесь достичь? Если вы пытаетесь вставить лист «Внутреннее использование», вам необходимо активировать его. Я добавил строку, чтобы активировать ее. Пожалуйста, уточните, что вы хотите выполнить.

Sub CommandButton2_Click() 
Worksheets("Internal Use").Activate 
project = Range("C4") 
Worksheets("data").Activate 
nr = Range("A" & Rows.Count).End(xlUp).Row 
Worksheets("Internal Use").Activate 
For Row = 2 To nr 
If Range("F" & Row) = Worksheets("Internal Use").Range("C4") Then 
Range("Q" & Row) = Worksheets("Internal Use").Range("C7") 
End If 

Next Row 

End Sub 
0

Вы хотите, чтобы заполнить столбец 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

Смежные вопросы