2016-05-17 2 views
0

Я работаю в VBA, чтобы автоматизировать отчет. У меня есть числа, проходящие, когда я запускаю макрос, но числа вставляются вертикально вниз по листу, а не по горизонтали, как мне нужно. Вот код, который у меня есть до сих пор (включая код для переноса его, который не работает). Что я могу сделать, чтобы зафиксировать его для транспонирования?Транспонирование SQL-результата в Excel

FromDatex = Range("W39").Value 
ToDatex = Range("X39").Value 

Range("S7:AD9").ClearContents 

     SQLStr = "SELECT SUM(VAL) FROM OPSAHISTM " & _ 
     "WHERE trunc(DATED) >=to_date('" & FromDatex & "','mm/dd/yyyy') " & _ 
     "AND trunc(DATED) <=to_date('" & ToDatex & "','mm/dd/yyyy') " & _ 
     "AND CUSTOMER = '03BA17'" & _ 
     "GROUP BY TRUNC(DATED,'MM') ORDER BY TRUNC(DATED,'MM')" 


rs.Open SQLStr, Cn, adOpenStatic 

With Range("S9:AD9") 
    .ClearContents 
    .CopyFromRecordset rs 
    Application.WorksheetFunction.Transpose ("S9:S11") 


End With 
rs.Close 


    Cn.Close 
Set rs = Nothing 
Set Cn = Nothing 
+0

Что такое определение 'rs'? –

+0

Это то, что я положил; это то, что вы имеете в виду: Set rs = New ADODB.Recordset – lucky123

+0

Пожалуйста, улучшите вопрос. Не забудьте также добавить определение 'Cn'. –

ответ

0

Вы можете сделать это двумя способами:

Вариант 1: Использование PasteSpecial >> транспозиции (который отличается от worksheetfunction.transpose ... не реально уверен, что эта формула делает, честно)

Range("S9:S11").Copy 
Range("S8").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ 
    False, Transpose:=True 

это будет копировать из S9:S11 и вставить его в S8:U8

Вариант 2:: Прокрутите свой набор записей и вставьте его по горизонтали. Вместо того чтобы использовать range.copyFromRecordset, вы скопировать значения из объекта поля вашего набора записей вручную во время цикла по каждой записи в наборе записей:

Dim writeCol as integer 'the column we are going to write to 
writeCol = 19 'Starting at column S 

'loop through the Recordset stopping at the last record 
Do until rs.EOF 
    'Drop into row 9, column writeCol, the value in the first field of your recordset for this record 
    Sheet1.Cells(9, writecol).value = rs.Fields(1).value 

    'Go to the next record in your record set 
    rs.MoveNext 
Loop 

Лично мне нравится второй вариант, поскольку это дает вам больше контроля, и вы не полагаетесь в буфере обмена. Неважно, сколько результатов будет возвращено, оно просто будет отбрасывать их в столбцах, пока оно не достигнет конца вашего набора записей. Единственным недостатком этой опции является то, что она будет медленнее, если у вас будет много возвращенных записей, хотя, я уверен, если бы у вас было много возвращенных записей, вы, вероятно, не захотели бы вставлять их в столбцы.

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