2010-11-15 18 views
0

J'ai une feuille Excel qui contient, disons, 10 colonnes différentes, avec quelques centaines d'enregistrements.Reformatage des données Excel d'une manière spécifique

par exemple.

column1|column2|column3|column4 

data data data data 

J'ai une autre feuille, un modèle, qui a les en-têtes disposés d'une certaine manière, par ex. Donc, le bloc de gabarit dans ma deuxième feuille doit être copié et rempli pour chaque enregistrement.

Existe-t-il un moyen de faire cela avec VBA?

Je suis conscient que c'est une façon horrible de faire les choses, mais je ne peux pas convaincre mon supérieur de cela, et c'est tout ce que je peux essayer et faire. Si ce n'est pas possible, cela sera fait à la main, donc j'espère qu'une automatisation est possible.

Répondre

0

Vous pouvez lire la plage dans un tableau, puis l'analyse syntaxique via des éléments individuels:

Dim dataArray As Variant 
Dim i As Integer 

dataArray = Range("B1:B4").Value 

For i = 1 to Ubound(dataArray)/2 
    Range("B2").Offset(2 * (Ceiling(i/2)-1), Ceiling((i-1)/2)) = dataArray(1, i) 
Next i 

Cette fonction:

Public Function Ceiling(ByVal X As Double) As Integer 

    Ceiling = Int(X) - (X - Int(X) > 0) 

End Function 
+0

Le modèle un fichier séparé ... aussi je ne suis pas sûr au sujet des gammes ... est-il juste un moyen de le faire pour chaque ligne? –

+0

@Donald, vous pouvez simplement adresser l'autre classeur si c'est dans un fichier séparé. Je ne sais pas ce que tu veux dire par "fais-le pour chaque ligne", mon code le fait pour chaque ligne. Vous avez juste à définir les gammes correctement, Mes gammes d'exemples ont été basées sur votre échantillon inclus, il suffit de les changer pour ce dont vous avez besoin. –

1

Essayez ceci:

Sub Tester() 

    Const SHT_SRC As String = "Sheet1" 'sheet w source data 
    Const SHT_DEST As String = "Sheet2" 'sheet w template 
    Const RNG_COPY As String = "A1:E6" 'your template area 

    Dim rngDest As Range, rngSrc As Range, rngCopy As Range 

    Set rngCopy = ThisWorkbook.Sheets(SHT_DEST).Range(RNG_COPY) 
    Set rngDest = rngCopy.Cells(1) 
    Set rngSrc = ThisWorkbook.Sheets(SHT_SRC).Rows(2) 

    Do While rngSrc.Cells(1).Value <> "" 

     rngCopy.Copy rngDest 'copy template area 
     With rngDest 
      'adjust offsets to fit your template layout 
      .Offset(1, 0).Value = rngSrc.Cells(1).Value 
      .Offset(1, 1).Value = rngSrc.Cells(2).Value 
      '...etc etc 
      .Offset(5, 5) = rngSrc.Cells(10).Value 
     End With 

     Set rngDest = rngDest.Offset(rngCopy.Rows.Count + 1, 0) 
     Set rngSrc = rngSrc.Offset(1, 0) 
    Loop 

End Sub 
+0

Hmm, merci d'avoir regardé ça maintenant. Le modèle est en fait dans un fichier différent ... cela fait-il une grande différence? Je peux importer une feuille, donc les deux sont dans un fichier je suppose. Je ne sais pas non plus comment cela fonctionne avec différents noms de champs et tel ... devrais-je télécharger un échantillon pour montrer ce que je veux dire? –

+0

Si le modèle se trouve dans un fichier différent, souhaitez-vous également que les données reformatées soient dans ce fichier? Essayez: Définir rngCopy = Classeurs ("otherworkbook"). Sheets (SHT_DEST) .Range (RNG_COPY) Tim –