2017-03-30 2 views
0

AKTUALISIERT 3/30VBA: Array Zellenreferenz Mismatch Fehler

So stellte ich den Code und es läuft fehlerfrei jetzt aber das Problem ist, dass es nicht die richtigen Daten nicht ziehen. X beginnt im Grunde mit Zelle (X, 1) und geht von dort weiter. Wie verknüpfe ich X mit den ausgewählten Listbox-Optionen im Array?

OLD Nachricht: Ich habe eine Userform, die für die Mehrfachauswahl der Länder und auch Fragen zu diesem bestimmten Land erlaubt. Diese sind in arrCountries & arrQuestion jeweils gespeichert. Dies führt dann zu meinem Haupt-Sub, das einen Web-Query-Import von der CIA World Factbook-Site erfordert. Ich halte jedoch einen Fehlanpassungsfehler bekommen, die ich nicht zu klären, scheine wie zu umgehen:

Mismatch Error in Yellow

Wenn ich es zu erraten, da ist, wenn ich aus der Listbox ist das Array ausfülle ist es nur eine Zugabe string und nicht die Zellreferenz, auf der sich der String befindet (oder ich liege völlig falsch).

Mein Arbeitsblatt hat beim Start nur 1 Blatt namens Länder und die Spalte A ist die URL und Spalte B ist der Name des Landes. Ich habe Public arrCountry(), Public ArrQuestion() und Public X als Variante definiert.

-Code hier:

Userform-Code, wenn in Ordnung klicken:

'Handles when the user clicks okay 
Private Sub cbOkay_Click() 
    'Me.Hide 
'Capture ticker selection(s) from list box. 
Dim cI As Long 
Dim cX As Long 
Dim qI As Long 
Dim qX As Long 

'Stores the Countries selected into an array 
If lbCountries.ListIndex <> -1 Then 
    For cI = 0 To lbCountries.ListCount - 1 
     If lbCountries.Selected(cI) Then 
      ReDim Preserve arrCountry(cX) 
      arrCountry(cX) = lbCountries.List(cI) 
      cX = cX + 1 
     End If 
    Next cI 
End If 

If cX = 0 Then MsgBox "Please select at least one country to analyse." 
'MsgBox Join(arrCountry, vbCrLf) 

'Stores the Questions selected into an array 
If lbQuestions.ListIndex <> -1 Then 
    For qI = 0 To lbQuestions.ListCount - 1 
     If lbQuestions.Selected(qI) Then 
      ReDim Preserve arrQuestion(qX) 
      arrQuestion(qX) = lbQuestions.List(qI) 
      qX = qX + 1 
     End If 
    Next qI 
End If 

If qX = 0 Then MsgBox "Please select at least one question to analyse." 

'MsgBox Join(arrQuestion, vbCrLf) 

'Unload the form 
Unload Me 

cancel = False 
End Sub 

Die Meldungsfelder geben die richtig ausgewählt Listbox Elemente so weiß ich sie richtig gespeichert werden.

Der WebQuery-Code erhalte ich den Fehler auf:

AKTUALISIERT Code:

Sub webQueryimport(arrCountry()) 

Dim mystr As String 
Dim X As Integer 
Dim selected As Variant 

For Each selected In arrCountry 
    X = X + 1 
Worksheets("Countries").Select 
Worksheets("Countries").Activate 
    mystr = Cells(X, 1) 
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = selected 

     With ActiveSheet.QueryTables.Add(Connection:=mystr, Destination:=Range("$A$1")) 
      .WebSelectionType = xlEntirePage 'this tells VBA what to select and import 
      .WebFormatting = xlWebFormattingNone 'this turns off web formatting, otherwise text is various sizes 
      .Refresh BackgroundQuery:=False 'if commented out, doesn't add any data 
     End With 
Next selected 

End Sub 

Auch jetzt, dass die Schleife arbeitet und importieren:

Also habe ich einen Schleifenzähler hinzugefügt aber es beginnt immer mit dem A1, egal was in der Listbox und in arr ausgewählt wird. Länder

Irgendwelche Gedanken/Hilfe wäre großartig!

+1

versuchen Sie, das gesamte 'X'-Array als eine Zeilennummer in' Cells (X, 1) 'zuzuordnen? Ich denke, du wolltest 'Cells (X (I), 1)' –

+0

@Shairado verwenden - Ich dachte ursprünglich, dass du recht hast, aber ich bezweifle, dass 'X (I)' ein numerischer Wert ist - also vermute ich, dass der OP wird wirklich ein 'Find' oder so etwas tun müssen. Nicht sicher. Zu spät am Nachmittag, um klar zu denken. – YowE3K

+0

oder wenn Sie nur auf das Array verweisen nicht 'X (I)' oder 'X (I, 1)' wenn es mehr als eine Dimension gibt.Sie haben auch Probleme bei der Benennung des Arbeitsblatts, wenn Sie wieder versuchen, den Namen auf das gesamte Array zu setzen. – Tom

Antwort

0

Verstanden:

Sub webQueryimport(arrCountry()) 

Dim mystr As String 
Dim X As Integer 
Dim rng As Range 
Dim selected As Variant 

Set rng = Range("B1") 

For Each selected In arrCountry() 
    For X = 1 To 5 'rng.Offset(0, 0).End(xlDown).Rows.count 
     Worksheets("Countries").Select 
     Worksheets("Countries").Activate 

     If Cells(X, 2).Value = selected Then 
      mystr = Cells(X, 1).Value 
      Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = selected 

      With ActiveSheet.QueryTables.Add(Connection:=mystr, Destination:=Range("$A$1")) 
       .WebSelectionType = xlEntirePage 'this tells VBA what to select and import 
       .WebFormatting = xlWebFormattingNone 'this turns off web formatting, otherwise text is various sizes 
       .Refresh BackgroundQuery:=False 'if commented out, doesn't add any data 
      End With 
     End If 
     Next X 
    Next selected 
End Sub 

ich in einem Zähler hinzuzufügen benötigt und die IF-Anweisung zu überprüfen, um zu sehen, ob der Wert in dem Feld des Zellenwert in dem Blatt angepasst und dann auf die entsprechende Zelle für die Rückkehr einführen.