2014-12-02 2 views
0

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

В принципе, если Условие равно X в столбце C в таблице A, то скопируйте номер из столбца B в таблице A в столбец B в таблице B. Есть 2k + строки. Столбец C в таблице A всегда пуст или равен X, а столбец B в таблице A никогда не будет пустым до конца списка. Столбец B в таблице B пуст, и количество строк будет определяться количеством строк, скопированных на него из таблицы A.

Я уверен, что для этого потребуется цикл, но, будучи новичком в VBA, я не знаю, какой тип цикла мне нужен и как должна выглядеть логика цикла. Я подозреваю, что Do Until будет проще, поскольку в таблице A нет пробелов до конца списка. До сих пор я догадываюсь:

Dim wsPAPS As Range 
Dim wsPAVA As Range 
Dim wsVNPN As Range 
Dim wkATTR As Workbook 

Set wkATTR = Workbooks("PARCEL_ATTR_MACRO-TEST.xlsm") 
Set wsPAPS = Sheets("PARCEL_ATTR_BASE").Range("PARCELSTAT") 
Set wsPAVA = Sheets("PARCEL_ATTR_BASE").Range("APO_VA_Properties_Vacant_Abandoned") 
Set wsVNPN = Sheets("VA_NAME").Range("L1_PARCEL_NBR") 

Do 
    If wsPAVA = "Vacant/Abandoned" Then 
     wsVNPN = wsPAPS 
    End IF 
Loop Until wsPAPS = "" 

Примечание: этот код на самом деле не работает; Мне говорят, что у меня есть Loop без Do, не знаю почему.

Я был бы невероятно благодарен за любую помощь, предлагаемую на этом. Спасибо всем!

UPDATE Целью использования переменных диапазона является попытка упростить ссылку на конкретные столбцы, но для них я получаю определенную или определяемую объектами ошибку.

+0

Вы должны использовать Do While (условие), то в конце говорят "Loop" http://www.excelfunctions.net/VBA-Loops.html – peege

ответ

1

Пожалуйста, следуйте приведенным ниже инструкциям,

  • Определение Desitination рабочего листа/книги его диапазона (cSheetName)
  • Определить источник рабочего листа/книги его диапазона (cFileLocWS)

  • Take количество строк для выполняемой операции может составлять до 1 миллиона строк.

  • Добавить цикл, который не обязательно должен выполняться в то время как простой «For» будет делать.

'дней открытия для - Col: S

' Существующее Logic == $ T $ 1-я (п) +1
«$ T $ 1 - конец дня месяца

lRowCount = Sheets(cSheetName).Cells(Rows.Count, "I").End(xlUp).Row 
For rowIndex = 2 To lRowCount 
    mDate = Sheets(cFileLocWS).Range(cMonthEndDate).Value 
    strtDate = Sheets(cSheetName).Cells(rowIndex, "I").Value 
    lResult = (mDate - strtDate) + 1 
    Sheets(cSheetName).Cells(rowIndex, "S").Value = lResult 
Next rowIndex 

Надеюсь, что это поможет.

1

Попробуйте это:

Если предположить, что имена листов являются: «TableA» и «TableB» и колонка B всегда есть какие-то данные.

Sub Copy() 
    Dim lr As Long, r As Long 
    Set Sh1 = ThisWorkbook.Worksheets("TableA") 
    Set Sh2 = ThisWorkbook.Worksheets("TableB")   

    lr = Sh1.Cells(Rows.Count, "B").End(xlUp).row 
    x = 2 
    For r = 2 To lr 
     If Range("C" & r).Value = "X" Then 'Evaluate the condition. 
      Sh2.Range("B" & x).Value = Sh1.Range("B" & r).Value 'ColumnB 
      x = x + 1 
     End If 
    Next r 
    Sh2.Select 
End Sub 
+0

Почему вы выбираете лист? – peege

+0

Первый выбор не нужен, но второй - только для показа результата. – SkyMaster

+0

Благодарим вас за предложение SkyMaster. У меня есть пара вопросов, если вы: я получаю ошибку времени выполнения (тип несоответствия) на lr = Sh1.Cells (Rows.Count, «B»). End (xlUp) .Row; любые мысли по этому поводу?Кроме того, является ли проблема, что я назвал как листы, так и таблицы одинаковыми (то есть имя листа PARCEL_ATTR_BASE, имя таблицы PARCEL_ATTR_base)? – MattCoats

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