2014-01-24 2 views
0

Ниже у меня есть программа, которая будет идти на лист (Inventory), обратите внимание на имя сотрудника, колонка А, если его такой же, как и выше (Последний раз)Excel макрос просматривает ячейку для нескольких значений. и петли

If Cells(i & ",1").Value = Cells(i - 1 & ",1").Value Then

затем посмотреть на описание в столбце B, и если оно не на тех, которые мне нужны, перейдите к следующей строке и повторите. Если это то, что мне нужно, скопируйте строку обратно на лист J и скопируйте туда. Повторите промывку. Однако на данный момент все, что он делает, это добавить другое значение i и двигаться дальше, что означает, что он просто пропускает каждую вторую строку. Какой цикл нужно добавить, чтобы перепроверить следующую строку, т. Е. I = 3 для одной и той же вещи, и, возможно, отбросить это?

Для бонусных очков сканирование столбца A не работает. Помощь в этом будет замечательной.

Dim i As Integer 
Dim j As Integer 
Dim k As Integer 

i = 2 
j = 73 
k = 3 

ActiveCell.FormulaR1C1 = "Inventory" 
Sheets("Inventory").Select 
Do Until i = 4495 
    If Cells(i & ",1").Value = Cells(i - 1 & ",1").Value Then 
     Sheets("Inventory").Select 
     Application.ScreenUpdating = False 
     If Cells(i & ",2").Text <> "CONSUMABLES" _ 
      Or Cells(i & ",2").Text <> "FILTERS - BILLI TRIO" _ 
      Or Cells(i & ",2").Text <> "FILTERS - ZIP GENERIC" _ 
      Or Cells(i & ",2").Text <> "GOODS" _ 
      Or Cells(i & ",2").Text <> "HARDWARE FIXINGS" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - 50W DICHROIC" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - COMPACT BC/ES" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - DICHROIC LAMP" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - FLURO" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - PLC LAMP 840/830" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - PL-L" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - PULSE STARTER" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - STANDARD STARTER" _ 
      Or Cells(i & ",2").Text <> "LIGHTING - T5 FLURO" _ 
      Or Cells(i & ",2").Text <> "NITROGEN CHARGE" _ 
      Or Cells(i & ",2").Text <> "OXYGEN/ACETYLENE WELDING" _ 
      Or Cells(i & ",2").Text <> "R-134A" _ 
      Or Cells(i & ",2").Text <> "R-22" _ 
      Or Cells(i & ",2").Text <> "R-407C" _ 
      Or Cells(i & ",2").Text <> "R-410A" = 0 Then 
       i = i + 1 
     Exit If 
    Rows(i).Select 
    Selection.Copy 
    Sheets("Sheet" & j).Select 
    Rows(k).Select 
    ActiveSheet.Paste 
    i = i + 1 
    k = k + 1 
Else 
+0

Вы увеличиваете 'i' дважды за цикл. Один раз в выражении if и один раз после этого. Я не уверен, что вы хотите, чтобы ваш код делал, поэтому я не могу сказать вам, что нужно удалить/изменить. – jmstoker

+0

Я хочу проверить значение в coloum B с помощью Big If. Если он передает нам колу (все ниже End if), если он терпит неудачу, повторите на следующей строке вниз (i = i + 1) –

+0

Можете ли вы показать остальную часть цикла 'Do Until'? Или дать простой пример, который показывает вашу проблему? – jmstoker

ответ

0

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

Option Explicit 

Sub Sample() 

Dim myarray 
Dim wsInv As Worksheet 
Dim rngDes As Range, rng As Range, cel As Range 
Dim k As Long 

Set wsInv = Thisworkbook.Sheets("Inventory") 

'~~>Assign all cell in Column A with value 
Set rng = wsInv.Range("A2", wsInv.Range("A" & Rows.Count).End(xlup).Address) 

'~~> you identified j = 73 so I assign it directly 
Set rngDes = Thisworkbook.Sheets("Sheet73").Range("A3") 

'~~> assign all the compare values in an array 
myarray = Array("CONSUMABLES", "FILTERS - BILLI TRIO", "FILTERS - ZIP GENERIC", _ 
    "GOODS", "HARDWARE FIXINGS", "LIGHTING - 50W DICHROIC", "LIGHTING - COMPACT BC/ES", _ 
    "LIGHTING - DICHROIC LAMP", "LIGHTING - FLURO", "LIGHTING - PLC LAMP 840/830", _ 
    "LIGHTING - PL-L", "LIGHTING - PULSE STARTER", "LIGHTING - STANDARD STARTER", _ 
    "LIGHTING - T5 FLURO", "NITROGEN CHARGE", "OXYGEN/ACETYLENE WELDING", _ 
    "R-134A", "R-22", "R-407C", "R-410A") 

'~~> Initialize k to 0 to used in offet 
k = 0 
For Each cel in rng 
    If cel.Value = cel.Offset(-1,0).Value Then 
     If Not IsError(Application.Match(cel.Offset(0,1).value, myarray, 0)) Then 
      cel.EntireRow.Copy rngDes.Offset(k,0) 
      k = k + 1 
     End If 
    End If 
Next cel 

End Sub 

Что выше делает это проверить каждое значение в Inventory лист колонок А если есть последовательные значения.
Если есть, я проверю его смежную ячейку (столбец B), если значение находится в пределах myarray.
Если да, то он скопирует весь ряд до Sheet73.
Это то, что вам нужно?

+0

Это кажется мне пригодным для использования, как бы то ни было, когда я его запускаю, он приходит в 'Set rng = wsInv.Range (« A2 », ws.Range (« A »и Rows.Count) .End (xlUp))' и появляется ошибка времени выполнения, требующая объекта. любой шанс вы можете мне помочь здесь? –

+0

уже исправил код. это должно быть «Set rng = wsInv.Range (« A2 », ws.Range (« A »& Rows.Count) .End (xlUp) .Address). – L42

+0

Ive пробовал ваш обновленный, однако он сталкивается с той же проблемой. Я даже не знаком с этим кодом, но может быть, потому что ws не установлен как диапазон вверху? –

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