2013-01-23 1 views
0

Je suis en train de faire rapport de bord de fichier Excel qui sont organisés en rangées,comment ajuster le code pour une meilleure performance

A, B, C,

D, E

le but est à créer des relations de chaque ligne:

A, B

A, C

B, C

I ont les codes suivants, le problème est le code est efficace lorsque les lignes sont de longueur égale, mais par exemple pour les lignes qui précèdent, il créent également des bords suivante (relation):

D « ,"

E ""

qui créent gros problème pour les grands ensembles de données. Je me demandais si un corps peut m'aider à ajuster le code de la façon de créer la liste des arêtes seulement jusqu'aux cellules remplies dans chaque rangée. S'il y a un autre moyen de le faire, plus efficace l'appréciera.

Merci beaucoup, Sera une aide précieuse.

Mon code:

Sub Transform() 

Dim targetRowNumber As Long 
targetRowNumber = Selection.Rows(Selection.Rows.Count).Row + 2 

Dim col1 As Variant 
Dim cell As Range 
Dim colCounter As Long 
Dim colCounter2 As Long 

Dim sourceRow As Range: For Each sourceRow In Selection.Rows 

    For colCounter = 1 To Selection.Columns.Count - 1 


     col1 = sourceRow.Cells(colCounter).Value 
     For colCounter2 = colCounter + 1 To Selection.Columns.Count 
      Set cell = sourceRow.Cells(, colCounter2) 

      If Not cell.Column = Selection.Column Then 
       Selection.Worksheet.Cells(targetRowNumber, 1) = col1 
       Selection.Worksheet.Cells(targetRowNumber, 2) = cell.Value 
       targetRowNumber = targetRowNumber + 1 
      End If 

     Next colCounter2 

    Next colCounter 

Next sourceRow 

End Sub 
+1

Une solution simple serait de changer 'Pour colCounter = 1 Pour Selection.Columns.Count - 1' à 'Pour colCounter = 1 à WorksheetFunction.CountA (SourceRow)' - qui renvoie le nombre de cellules utilisées dans chaque ligne. Vous feriez mieux de ne pas compter sur 'Selection' si possible ... – MattCrum

+0

Merci. Mais je l'ai essayé, le résultat ne change pas du tout, j'obtiens toujours la relation entre une cellule remplie et une cellule vide, pour des rangées qui sont plus courtes que la rangée la plus longue. –

+0

L'avez-vous déjà fait pour la ligne 'Pour colCounter2 = colCounter + 1 To Selection.Columns.Count'? Désolé, je devrais avoir mentionné que ci-dessus – MattCrum

Répondre

0

J'ai joué avec elle - ce qui devrait faire l'affaire. Nous pouvons probablement accélérer en sortie vers un autre tableau de variante si nécessaire, mais cela m'a couru assez rapidement pour:

Sub Transform_New() 

Dim rngSource As Range, rngDest As Range 
Dim varArray As Variant 
Dim i As Integer, j As Integer, k As Integer 

Set rngSource = Sheet1.Range("A1", Sheet1.Cells(WorksheetFunction.CountA(Sheet1.Columns(1)), 1)) 'Put all used rows into range 
Set rngDest = Sheet1.Cells(WorksheetFunction.CountA(Sheet1.Columns(1)), 1).Offset(2, 0) 'Set target range to start 2 below source range 

varArray = Range(rngSource, rngSource.Offset(0, Range("A1").SpecialCells(xlCellTypeLastCell).Column)).Value 

For i = LBound(varArray, 1) To UBound(varArray, 1) 'Loop vertically through array 
    For j = LBound(varArray, 2) To UBound(varArray, 2) 'Loop horizontally through each line apart from last cell 
     k = j 
     Do Until varArray(i, k) = "" 
       k = k + 1 
       If varArray(i, k) <> "" Then 
        rngDest.Value = varArray(i, j) 
        rngDest.Offset(0, 1).Value = varArray(i, k) 
        Set rngDest = rngDest.Offset(1, 0) 
       End If 
     Loop 
    Next 
Next 

End Sub 
+0

Salut Matt thanx, mais mes données ont comme 38000 lignes, quand je cours le code il donne sur l'erreur de flux, quand j'ai essayé est avec un échantillon plus petit cela fonctionne parfaitement. –

+0

OK modifiez Dim i As Integer à Dim i as Long. Combien de colonnes y a-t-il? – MattCrum

+0

Il y a un maximum de 50 lignes. –

Questions connexes