2013-08-11 3 views
0

Je suis un novice totale avec Excel VBA alors s'il vous plaît ours avec moi. J'essaye d'analyser les valeurs de cellules basées sur le délimiteur ":". La valeur avant le délimiteur et après le délimiteur sera stockée dans un tableau afin que je puisse référencer les valeurs de tableau dans WHERE COL1 = [valeur avant ":" dans tableau] AND COL2 = [valeur correspondante après ":" dans tableau] clause dans une requête SQL.lire le contenu de la cellule dans Excel, analyser en fonction de délimiteur et insérer dans le tableau

Mes données ressemble ci-dessous:

T:NYSE 
ABX:NASDAQ 
V:AIM 
(blank) 
009123:OTDCXE 
(blank) 
xxx:dhgjdg 

et ainsi de suite. Les données sont stockées dans une plage fixe A1: A10 mais peuvent ne pas être contiguës. Je voudrais exécuter l'instruction SQL en utilisant un jeu d'enregistrements .eg

for i=0 to [last element in array] 
'run SELECT statement for each element (excluding nulls) 
next 

Voici ce que je l'ai fait jusqu'à présent et il ne fonctionne pas:

Sub test3() 


Dim MyArray() 
'Dim MyArray() 
Dim MyRange As Range 

Dim RowCount As Long 
Dim ColCount As Long 
Dim R As Long 
Dim C As Long 


Set MyRange = Range("A1:a10") ' <-- Adjust!!! 
RowCount = 10 ' <-- Adjust as necessary 
ColCount = 1 ' <-- Adjust as necessary 

ReDim MyArray(1 To RowCount, 1 To ColCount) 

For R = 1 To RowCount 
    For C = 1 To ColCount 
     MyArray(R, C) = MyRange(R, C).Value 
    Next C 
Next R 

'Following was done only for debugging purpose 
For i = 1 To UBound(MyArray) 
For j = 1 To UBound(MyArray) 
Sheets(1).Cells(i + 20, j).Value = MyArray(i, j).Value 
Next j 
Next i 


End Sub 

Si quelqu'un peut indiquer ce que je fais incorrect et fournir quelques conseils. J'ai passé mes trois derniers jours à trouver une solution afin que je puisse extraire toutes les valeurs non nulles et les utiliser dans l'instruction sql.

Merci beaucoup d'avance pour au moins regarder.

Edit 1:

Enfin, fait quelques recherches autour et est venu avec quelque chose, dont 98% travaille.

entrée de l'échantillon:

LEG:NYSE 
LEG:TAM 
SPCC:AIM 
ONTPC:ZWSESA 
0943292:owndgt 
b:a 

d:ee 

f:aaaaaa 

Sortie finale:

LEG  NYSE 
LEG  :TAM 
SPCC C:AIM 
ONTPC ZWSESA 
0943292 2:owndgt 
b  :a 
d  ee 
f  aa 

Je ne sais pas pourquoi je ne reçois pas la chaîne complète après ":". Ci-dessous mon code complet pour la sortie ci-dessus

Sub test2() 

Set ws = ThisWorkbook.Sheets("Sheet1") 

MyArray = ws.Range("A1:A10") 

Range("A11:A30").ClearContents 


ReDim newarr(LBound(MyArray) To UBound(MyArray)) 
For i = LBound(MyArray) To UBound(MyArray) 
If MyArray(i, 1) <> "" Then 
    j = j + 1 
    newarr(j) = MyArray(i, 1) 
End If 
Next i 
ReDim Preserve newarr(LBound(MyArray) To j) 


For R = 1 To UBound(newarr) ' First array dimension is rows. 
ws.Cells(R + 12, 1).Value = newarr(R) 
Next R 

'Store values preceding and succeeding the delimiter in two arrays 

ReDim lftarray(LBound(newarr) To UBound(newarr)) 
ReDim rtarray(LBound(newarr) To UBound(newarr)) 

For i = LBound(newarr) To UBound(newarr) 
lftarray(i) = Split(newarr(i), ":") 
rtarray(i) = Right(newarr(i), InStr(1, newarr(i), ":")) 
Next i 

ReDim Preserve lftarray(LBound(newarr) To i) 
ReDim Preserve rtarray(LBound(newarr) To i) 

'Print values before ":" 
For i = LBound(lftarray) To UBound(lftarray) ' First array dimension is rows. 
ws.Cells(i + 24, 1).Value = lftarray(i) 
Next i 


'Print values after ":" 

For i = LBound(rtarray) To UBound(rtarray) 
    ws.Cells(i + 24, 2).Value = rtarray(i) 
Next i 


End Sub 

Edit2:

Sub test2() 

Set ws = ThisWorkbook.Sheets("Sheet1") 

MyArray = ws.Range("A1:A10") 

Range("A11:A30").ClearContents 


ReDim newarr(LBound(MyArray) To UBound(MyArray)) 
For i = LBound(MyArray) To UBound(MyArray) 
If MyArray(i, 1) <> "" Then 
    j = j + 1 
    newarr(j) = MyArray(i, 1) 
End If 
Next i 
ReDim Preserve newarr(LBound(MyArray) To j) 


For R = 1 To UBound(newarr) ' First array dimension is rows. 
ws.Cells(R + 12, 1).Value = newarr(R) 
Next R 

'Store values preceding and succeeding the delimiter in two arrays 

ReDim lftarray(LBound(newarr) To UBound(newarr)) 
ReDim rtarray(LBound(newarr) To UBound(newarr)) 

For i = LBound(newarr) To UBound(newarr) 
lftarray(i) = Split(newarr(i), ":") 
rtarray(i) = Right(newarr(i), Len(newarr(i)) - InStr(1, newarr(i), ":")) 
Next i 

ReDim Preserve lftarray(LBound(newarr) To i) 
ReDim Preserve rtarray(LBound(newarr) To i) 

'Print values before ":" 
For i = LBound(lftarray) To UBound(lftarray) ' First array dimension is rows. 
ws.Cells(i + 24, 1).Value = lftarray(i) 
Next i 


'Print values after ":" 

For i = LBound(rtarray) To UBound(rtarray) 
    ws.Cells(i + 24, 2).Value = rtarray(i) 
Next i 


End Sub 
+0

Vous pouvez mettre les valeurs de plage directement dans le tableau avec la déclaration MonTableau = MyRange. Voir l'explication ** [ici] (http://www.cpearson.com/excel/ArraysAndRanges.aspx) **. – chuff

+0

Merci d'avoir regardé mon problème. J'ai fait référence à cette ressource et je suppose que c'est l'un des meilleurs moyens d'avoir des données dans un tableau si aucun traitement sur les données d'entrée n'est requis. Mais j'ai besoin de diviser() les valeurs afin qu'elles soient dans un format utilisable. D'où la question. – vbalite

+0

Donc, le problème que vous avez est avec la scission, pas avec l'obtention des données dans le tableau? – chuff

Répondre

0

Voilà ma réponse

Sub test2() 

Set ws = ThisWorkbook.Sheets("Sheet1") 

MyArray = ws.Range("A1:A10") 

Range("A11:A30").ClearContents 


ReDim newarr(LBound(MyArray) To UBound(MyArray)) 
For i = LBound(MyArray) To UBound(MyArray) 
    If MyArray(i, 1) <> "" Then 
     j = j + 1 
     newarr(j) = MyArray(i, 1) 
    End If 
Next i 
ReDim Preserve newarr(LBound(MyArray) To j) 


For R = 1 To UBound(newarr) ' First array dimension is rows. 
ws.Cells(R + 12, 1).Value = newarr(R) 
Next R 

'Store values preceding and succeeding the delimiter in two arrays 

ReDim lftarray(LBound(newarr) To UBound(newarr)) 
ReDim rtarray(LBound(newarr) To UBound(newarr)) 

For i = LBound(newarr) To UBound(newarr) 
    lftarray(i) = Split(newarr(i), ":") 
    rtarray(i) = Right(newarr(i), Len(newarr(i)) - InStr(1, newarr(i), ":")) 
Next i 

ReDim Preserve lftarray(LBound(newarr) To i) 
ReDim Preserve rtarray(LBound(newarr) To i) 

'Print values before ":" 
For i = LBound(lftarray) To UBound(lftarray) ' First array dimension is rows. 
    ws.Cells(i + 24, 1).Value = lftarray(i) 
Next i 


'Print values after ":" 

For i = LBound(rtarray) To UBound(rtarray) 
ws.Cells(i + 24, 2).Value = rtarray(i) 
Next i 


End Sub 
Questions connexes