2016-08-22 7 views
0

Начальный вопрос: Excel VBA sumifs sort and setExcel VBA смещение

Так у меня есть:

int001, int001, ..... int024

и 29 unique_data.

Я думаю, что здесь i'am делать что-то неправильно:

) * 24 + 1) ...24 times....* 24 + 24) 

, но я не знаю, что.

Dim iDate As Long 
    With Range("C1") 
    For iDate = 1 To nr_unique_dates - 1 
     .Offset((iDate - 1) * 24 + 1) = Application.WorksheetFunction.SumIfs(INT001, dates, unique_dates(iDate), INT001, ">0") 
     .Offset((iDate - 1) * 24 + 2) = Application.WorksheetFunction.SumIfs(INT002, dates, unique_dates(iDate), INT002, ">0") 

             |  

             | 

             | 

             | 

     .Offset((iDate - 1) * 24 + 22) = Application.WorksheetFunction.SumIfs(INT022, dates, unique_dates(iDate), INT022, ">0") 
     .Offset((iDate - 1) * 24 + 23) = Application.WorksheetFunction.SumIfs(INT023, dates, unique_dates(iDate), INT023, ">0") 
     .Offset((iDate - 1) * 24 + 24) = Application.WorksheetFunction.SumIfs(INT024, dates, unique_dates(iDate), INT024, ">0") 




    Next iDate 
+5

Не могли бы вы быть более ясными? Что не так с вашим кодом? Любые ошибки? Что не работает? – Siva

+0

"int001, int001, ..... int024"? Вы знакомы с массивами? –

ответ

2

отредактирован после OP запроса о выходе нулей

edited2 после OP пояснениями о выходных нулей

Если остальная часть кода остается такой же, как в связанном один, то вам 're messing вещи с With Range("C1") вместо оригиналWith Range("H1"), так как C1 находится прямо внутри вашего intXXX данные

С 24 колонкам intXXX диапазоне от столбца «B» в колонке «Y» вы должны использовать With Range("Z1") (или, чтобы остаться две колонки от данных, With Range("AA1"))

Вы должны быть сделаны с такой модификация, но я хотел бы предложить вам следовать @JohnColeman совет о «подходе массива»

Далее следует «диапазон подход» для открытого числа intXXX:

Option Explicit 

Sub Tsum2() 
    Dim unique_dates As Range, outputRng As Range 
    Dim nr_unique_dates As Long 
    Dim iDate As Long, nr_Cols As Long, iCol As Long 

    With Worksheets("TSums") '<-- change "TSums" with your actual sheet name 
     Set outputRng = Cells(1, .Columns.Count).End(xlToLeft).Offset(, 2) '<--| set output range as tow columns right of the last non empty cell in row 1 
     With .Range("G1", .Cells(.Rows.Count, 1).End(xlUp)) '<-- reference the range from cell "A1" to cell in column "G" corresponding to last non empty row in column "A" 
      nr_Cols = .Columns.Count '<--| store data columns 
      .Columns(1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=outputRng, Unique:=True '<-- call AdvancedFilter on first column of the referenced range 
      Set unique_dates = Range(outputRng.Offset(1), outputRng.End(xlDown)) '<--| set unique dates range 
      nr_unique_dates = unique_dates.Count '<--| store unique dates number 
      With .Offset(1).Resize(.Rows.Count - 1) '<--| skip headers of reference range 
       For iDate = 1 To nr_unique_dates '<--| outer loop through unique dates 
        For iCol = 2 To nr_Cols '<--| inner loop through "int" columns (from column 2 rightwards) 
         outputRng.Offset((iDate - 1) * (nr_Cols - 1) + iCol - 1, 2) = Application.WorksheetFunction.SumIfs(.Columns(iCol), .Columns(1), unique_dates(iDate), .Columns(iCol), ">0") 
        Next iCol 
       Next iDate 
      End With 
     End With 
    End With 
    With outputRng.Offset(, 2) 
     .SpecialCells(xlCellTypeConstants).Replace 0, "" '<--| substitute all output "zeros" with a blank value 
     .SpecialCells(xlCellTypeBlanks).Delete '<--| delete all blanks 
    End With 
End Sub 
+0

@Marius: вы прошли через это? – user3598756

+0

Спасибо, он работает. Но когда у меня в столбце только отрицательные значения, сумма устанавливается со значением 0, и в этом случае мне не нужны никакие значения для установки. – BOB

+0

'2/1/2016'' 10 6 4'
'2/2/2016'' -5 3 2'
'2/3/2016'' 3 7 3'
'2/1/2016 '' 1 2 5'
'2/2/2016'' -4 3 7'
' 2/3/2016'' 6 4 2'
Как в этом случае, когда в столбце int 1 с датой 2/2/2016 имеют только отрицательные – BOB

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