2016-05-27 4 views
0

Meine Datensatz mit wie folgt aussehen:Konvertieren von Daten in Hochformat forloops vba-excel

AUS, UK, USA, GERMANY, FRANCE, MEXICO, DATE 
R1, R1, R1, R1 , R1 , R1 , 1 
R2, R2, R2, R2 , R2 , R2 , 2 
... 

Und so weiter. Ich möchte es konvertieren, so dass es wie

COUNTRY, RETURNS, DATE, 
AUS,  R1,  1 
AUS,  R2,  2 
..., ...,  ..., 
UK,  R1,  1, 
UK,  R2,  2, 
...  ...  ..., 
MEXICO, R1,  1, 
MEXICO, R2,  2, 
...  ...  ... 

sieht Ich fühle mich wie dies mit einem einfachen verschachtelten forloop möglich sein sollte.

Ich habe versucht:

sub panel() 
'dim variables 
Dim i As Integer 
Dim j As Integer 
Dim reps As Integer 
Dim country As String 
Dim strfind As String 
Dim obs As Integer 

'count the number of countries 
reps = Range("D1:AL1").Columns.Count 

'count the number of observations per country 
obs = Range("C4:C5493").Rows.Count 

'copy and paste country into panel format 
For i = 1 To reps 
    'set country name 
    country =Range("D1").Cells(1, i) 
    For j = 1 To obs 
    'copy and paste country values 
    Range("AS2").Cells(j, 1) = country 
    Next j 
Next i 

aber nach dem j beendet Schleifen, und der neue Name des Landes festgelegt ist, ersetzen die neuen Werte die alten Werte in der ersten Charge von Zellen.

Antwort

1

Betrachten Sie eine SQL-Lösung, die UNION-Abfragen verwendet, um jede Spalte für das Langformat auszuwählen. Bei Verwendung von Excel für PC kann Excel eine Verbindung zur Jet/ACE-SQL-Engine (Windows-DLL-Dateien) über ADO herstellen und SQL-Abfragen in Arbeitsblättern der aktuellen Arbeitsmappe ausführen.

Mit diesem Ansatz vermeiden Sie for Schleife, verschachtelte if/then Logik und andere Daten Manipulation benötigt für die gewünschte Ausgabe. Im folgenden Beispiel wird davon ausgegangen, dass sich die Daten in der Registerkarte DATA befinden und eine leere Registerkarte namens RESULTATE.

Sub RunSQL()  
    Dim conn As Object, rst As Object 
    Dim strConnection As String, strSQL As String 
    Dim i As Integer 

    Set conn = CreateObject("ADODB.Connection") 
    Set rst = CreateObject("ADODB.Recordset") 

    ' CONNECTION STRINGS (TWO VERSIONS) 
' strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _ 
'      & "DBQ=C:\Path\To\Workbook.xlsm;" 
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
         & "Data Source='C:\Path\To\Workbook.xlsm';" _ 
         & "Extended Properties=""Excel 8.0;HDR=YES;"";"   
    strSQL = " SELECT 'AUS' AS COUNTRY, AUS AS RETURNS, [DATE] FROM [DATA$]" _ 
      & " UNION ALL SELECT 'UK', UK AS Country, [DATE] FROM [DATA$]" _ 
      & " UNION ALL SELECT 'USA', USA AS Country, [DATE] FROM [DATA$]" _ 
      & " UNION ALL SELECT 'GERMANY', GERMANY AS Country, [DATE] FROM [DATA$]" _ 
      & " UNION ALL SELECT 'FRANCE', FRANCE AS Country, [DATE] FROM [DATA$]" _ 
      & " UNION ALL SELECT 'MEXICO', MEXICO AS Country, [DATE] FROM [DATA$];" 

    ' OPEN CONNECTION & RECORDSET 
    conn.Open strConnection 
    rst.Open strSQL, conn 

    ' COLUMN HEADERS 
    For i = 1 To rst.Fields.Count 
     Worksheets("RESULTS").Cells(1, i) = rst.Fields(i - 1).Name 
    Next i   
    ' DATA ROWS 
    Worksheets("RESULTS").Range("A2").CopyFromRecordset rst 

    rst.Close: conn.Close  
    Set rst = Nothing: Set conn = Nothing  
End Sub 

Ausgabe

COUNTRY  RETURNS  DATE 
AUS   R1   1 
AUS   R2   2 
UK   R1   1 
UK   R2   2 
USA   R1   1 
USA   R2   2 
GERMANY  R1   1 
GERMANY  R2   2 
FRANCE  R1   1 
FRANCE  R2   2 
MEXICO  R1   1 
MEXICO  R2   2 
0

Okay, ich habe es behoben. Wahrscheinlich nicht der beste Code, aber es funktioniert :).

Sub replicate_dates() 
'declare variables 
Dim i As Double 
Dim j As Double 
Dim reps As Integer 
Dim country As String 
Dim strfind As String 
Dim obs As Integer 
'set strfind value 
strfind = "-DS Market" 

'count the number of countries 
reps = Range("D1:AL1").Columns.Count 

'count the number of observations per country 
obs = Range("C4:C5493").Rows.Count 

i = 0 
'copy and paste country into panel format 
For k = 1 To reps 
    'set country name and clean string 
    country = Replace(Range("D1").Cells(1, k), strfind, "") 
    For j = i + 1 To obs + i 
    'copy and paste country values 
    Range("AS5").Cells(i, 1) = country 
    i = 1 + i 
    Next j 

Next k 

End Sub

Edit: Nvm, dies nicht außerhalb einer ganz bestimmten Fall zu arbeiten.