2016-04-14 3 views
1

я делаю сценарий, где я могу считать данные из столбца, если дубликат данных >3 я пометит его ..VBA - Количество данных в пределах диапазона дат

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

образец входного файла :: (мм/дд/гггг)

Column A | Column B | Column C| Column D 
023  | 1/2/2016 |   | 
023  | 1/3/2016 |   |  
023  | 1/4/2016 |   |  
024  | 2/1/2016 |   | 
024  | 3/1/2016 |   | 
024  | 4/1/2016 |   | 

Пример вывода файла:

Column A | Column B | Column C| Column D 
023  | 1/2/2016 |   | 
023  | 1/3/2016 |   |  
023  | 1/4/2016 | 1  | 3 
024  | 2/1/2016 |   | 
024  | 3/1/2016 |   | 
024  | 4/1/2016 |   | 

Если дубликат данных не в течение месяца диапазон не будет бирка ..

Что я ожидаю код, чтобы сделать это сосчитать данные из Column A если данные> 3 и дата всех этих данных от Column B находится в пределах месяца теге его от Column D и E не все подряд, но в последнее время от даты Column B

Что мой код делать является сосчитать данные из Column A если данные >3 будет тег из Column C и D с самой последней даты из столбца B

Мой код:

Dim i1 As Long, lastRow As Long, countRow As Long 

    lastRow = Sheet2.Range("T" & Rows.Count).End(xlUp).Row 
    'xDate = Sheet2.Range("C" & lastRow) 

    For i1 = 1 To lastRow 

    If countRow > 2 Then 
     countRow = Application.CountIf(Sheet2.Columns(20), Sheet2.Cells(i1, 20)) 
     If countRow > 2 Then 
      If Not CBool(Application.CountIfs(Sheet2.Columns(20), Sheet2.Cells(i1, 20), _ 
            Sheet2.Columns(85), ">" & Sheet2.Cells(i1, 85))) Then _ 
       Sheet2.Cells(i1, 86).Resize(1, 2) = Array("1", "3") 
      End If 
     End If 
    Next i1 

Примечание:

  • В моем коде i did not u SE ColumnABCD вместо это ColumnTCGCHCI

Я не знаю, как ранжировать его на месяц, я попытался коллекцию, но еще новичок в VBA и я не знаком с ним, и я не знаю, если это правильно ..

ответ

1

отредактирован: оставил только код, за спецификации последнего Op и с коррекцией формулы

вы могли бы попробовать это

Sub sbFindDuplicatesInColumn_C3ter() 

With ThisWorkbook.Worksheets("duplicates") '<~~ you should know what workbook and worksheet you are on!! 
    With .Range("T1").Resize(.Range("T" & .Rows.Count).End(xlUp).Row) ' the "base" column is column "T" 
     With .Offset(, 67) ' column "CI" is 67 columns away from column "T" 
      .FormulaR1C1 = "=IF(COUNTIFS(C20, RC20, C72,""<="" & EOMONTH(RC72,0), C72,"">="" & EOMONTH(RC72,-1)+1)>2, IF(COUNTIFS(C20, RC20,C72,"">"" &RC72,C72,""<="" & EOMONTH(RC72,0))=0,     3 , """")  , """")" ' substituted relative references with absolute ones : column "T" has index 20, column "BT" has index 72 
      .Value = .Value '<== if you want to get rid of formulas 
     End With 
     With .Offset(, 66) ' column "CH" is 66 columns away from column "T" 
      .FormulaR1C1 = "=IF(RC[1]>0, 1, """") " ' I left relative references since columnn "CH" is always one left of column "CG" as was for columns "A" and "B" 
      .Value = .Value '<== if you want to get rid of formulas 
     End With 
    End With 
End With 

End Sub 
+0

Благодарим вас за то, что вы избавляетесь от формул, которые вы так любезны! .. из любопытства, если я собираюсь изменить столбцы 'A'' B''''''''''''''''''''' '? – 7A65726F

+0

см. Отредактированный код, чтобы удовлетворить «любопытство». Если я выполнил ваш вопрос, пожалуйста, отметьте мой ответ как принятый. спасибо – user3598756

+0

может ли он читать любой формат даты ??? – 7A65726F

1

Этот вход ...

enter image description here

генерироваться этот выход ...

enter image description here

из этого кода ...

Option Explicit 

Sub main() 
Dim iLoop As Long, jLoop As Long 
Dim lastRow As Long, countRow As Long 
Dim myDate1 As Variant, myDate2 As Variant 

    lastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row 

    For iLoop = 1 To lastRow 
     countRow = Application.CountIf(Sheet1.Range(Sheet1.Cells(iLoop, 1), Sheet1.Cells(lastRow, 1)), Sheet1.Cells(iLoop, 1)) 
     If countRow > 2 Then 
      For jLoop = lastRow To (iLoop + 1) Step -1 
       If Sheet1.Cells(jLoop, 1).Value = Sheet1.Cells(iLoop, 1).Value Then 
        myDate1 = Application.EDate(Sheet1.Cells(iLoop, 2), 3) 
        myDate2 = Sheet1.Cells(jLoop, 2) 
        If myDate2 > myDate1 Then Sheet1.Cells(jLoop, 3).Resize(1, 2) = Array("1", "3") 
        Exit For 
       End If 
      Next jLoop 
     End If 
    Next iLoop 
End Sub 

В частности, с помощью функции рабочего листа EDATE добавить три месяца до даты первого найденного для данного пункта номер.

Также, сокращая размер списка, функция рабочего листа CountIf использует в качестве счетчика цикла iLoop.

Как в стороне, в вашем фрагменте кода вы использовали i1 в качестве счетчика циклов. Это легко путать с il. 8)

+0

еще раз спасибо @OldUgly, позвольте мне проанализировать этот первый :) – 7A65726F

+0

тот, который должен быть тегом, является строкой 4 coz, это диапазон дат 1month ... – 7A65726F

+0

Мне жаль должно быть> 2 right :( – 7A65726F

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