Excel VBA Frage
Geizhals » Forum » Programmierung » Excel VBA Frage (5 Beiträge, 106 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Excel VBA Frage
26.06.2006, 22:33:56
Hallo Leute :-)

Eine VBA-Programmier Frage eines komplett unbedarften in diesem Bereich:

Gegeben ist Office 97, eine Acess97-DB, nennen wir sie Quelle.mdb, mit - der einfachheit halber einer einzigen Tabelle "Produkte". (eine hoehere Access Version bzw. SQL Server - auch MSDE ist derzeit leider keine Option).

Felder in dieser Tabelle sind
Produkt_ID, Produkt_Nr, Bezeichnung, Preis
1               1100          Artikel1         10,-  
2               2201          Artikel2         15,-  
3               2200          Artikel3         20,-
.
Aufgabe: ein Makro, das folgendes leisten kann:

Mit VBA aus einem excel worksheet heraus diese mdb per select statement abfragen (d.h.
veraenderbarer Querystring).

Selektiert werden soll immer nach Kundennummer a la "select * from Produkte where Produkt_Nr like %Variable_fuer_Produkt_Nr%".

wenn ich z.b. im Excel in die Zelle A1 (Produkt_Nr) "100" eintrage sollte
    das  Resultat sollte dann so aussehen in excel:

              Spalte
                A             B              C
Zeile 1       1100        Artikel1      10,-

2) Wenn ich jetzt z.B. in Excel in die Zelle A2 gehe und dort "220" eintrage,werden die 2
    restlichen artikel eingefuegt und der nachfolgende bereich um die anzahl der
    datensaetze nach unten verschoben.

Resultat muesste dann am Ende so aussehen:
      
             Spalte          
              A                  B              C
Zeile  1   1100          Artikel1         10,-  
Zeile  2   2201          Artikel2         15,-  
Zeile  3   2200          Artikel3         20,-

Kann mir bitte wer auf die Spruenge helfen, wie ich sowas angehe ? Ich google schon ewigkeiten und hab auch diverse Codeschnipsel gefunden aus denen man schliessen kann, dass sowas geht, ich kann sie aufgrund mangelnder VBA kenntnisse jedoch auch nach ewigem rumprobieren nicht zum laufen kriegen.

Gegebenenfalls wuerde ich auch die gefundenen teile posten, ev. kanns mir ja wer erklaeren, was das zeug genau tut (und ich lern draus gleich mal ein bisschen VBA *g*)

P.S: Ich hoffe, ich hab mich bei der angabe ausgedrueckt und sie traegt nicht zu verwirrungen bei..ansonsten bitte einfach nachfragen :-)

Herzlichen Dank im Voraus

Dreamer030

Antworten PM Übersicht Chronologisch
 
Melden nicht möglich
..
Re(2): Excel VBA Frage
27.06.2006, 00:23:10
Hallo!

Danke fuer deinen Input, die Idee hatte ich urspruenglich (MS-Query), da kommt allerdings leider nicht das raus, was ich brauche, daher mein posting. MS-Query duerfte zudem recht unflexibel sein.

Es gibt da z.B. diverses ADO-Klump fuer DB-Zugriffe, das mir recht elegant erscheint, nur kenn ich mich damit genau nuesse aus :-( Hier z.B. ein schnipsel das ich im Web unter
http://www.ozgrid.com/forum/archive/index.php/index.php?t-10563.html  gefunden habe und eigentlich nur sehr rudimentaer weiss, was es wo macht, vielleicht kanns mir ja wer erklaeren. Erstes Ziel waere, grundsaetzlich mal eine funktionierende DB-Abfrage zustandezubringen:


Option Explicit                

Sub Import_Filtered_Data()

Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim stDB As String                                                
Dim lnCountField As Long, lnCount As Long
Dim stNumber As String, stSQL As String
Dim dtStartD As Date, dtEndD As Date

stDB = ThisWorkbook.Path & "\" & "XlData1.mdb"            -> hab ich durch meine DB ersetzt

Cells(1, 1).CurrentRegion.Clear                                  

cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & stDB & ";"

' --- nachfolgenden abschnitt habe ich auskommentiert -------
' stNumber = _
' Application.InputBox("Enter number:", "Selection - Step 1", Default:="", Type:=1)

' dtStartD = _
' Application.InputBox("Enter Startdate:", "Selection - Step 2", Default:="", _
' Type:=2)

' dtEndD = _
' Application.InputBox("Enter Enddate:", "Selection - Step 3", Default:="", _
' Type:=2)
' --- weils die felder bei mir eh nicht gibt ----------

---dieses ding habe ich zum testen ----
stSQL = "SELECT [Number],[Model],[Out],[Count]" _
& " FROM tblData" _
--- ersetzt durch --------------------

--- dieses ding ----------------------
stSQL = "SELECT *" _
& "FROM Produkte" _
-------------------------------------


' ------ diesen abschnitt habe ich auskommentiert -----
'& " WHERE [In] >= # " & dtStartD & " # AND" _
'& " [Ut] <= # " & dtEndD & " # AND" _
'& " [Number] = " & stNumber & "" _
'& " ORDER BY [Out], [Model];"

' -------- weil die felder sowieso nicht vorkommen bei mir ---

With rst
.CursorLocation = adUseClient
.Open stSQL, cnt, adOpenDynamic, adLockOptimistic
End With

lnCountField = rst.Fields.Count
For lnCount = 0 To lnCountField - 1
Cells(1, lnCount + 1).Value = rst.Fields(lnCount).Name
Next lnCount

End Sub

Wenn ich den uebrigbleibenden code bis hierher laufen lasse, bekomme ich die Feldnamen in der ersten Zeile des Excel Sheets, allerdings keine weiteren resultate. Keine ahnung, was ich wo aendern muss, vielleicht kanns mir wer zeigen.

Wenn ich den Abschnitt  ab "With rst" (scheint eine art schleife zu sein) mit dem untenstehenden Inhalt "Excel 97" ersetze (keine ahnung, ob das korrekt ist oder ob das zusaetzlich woandershin muesste) bekomme ich eine Fehlermeldung die sich auf die Zeile mit .MoveLast" bezieht und meint "Die methode ist bei geschlossenem Objekt nicht moeglich" oder so aehnlich (ich habe auf dem Rechner an dem ich jetzt sitze kein office97 zum ausprobieren drauf). Anmerkung: die "Dim" zeilen haenge ich an die restlichen Variablendefinitionen dran und den "With rst" abschnitt ersetze ich durch den unter "Excel 97" angefuehrten.

'**************************Excel 97************************
Dim vaData As Variant
Dim rnData As Range
Dim lnRow As Long, lnCol As Long
Dim lnPost As Long, lnField As Long
Dim i As Long

With rst
.MoveLast
i = .RecordCount
.MoveFirst
End With

vaData = rst.GetRows(i)

lnPost = UBound(vaData, 2) + 1
lnField = UBound(vaData, 1) + 1

Set rnData = Range(Cells(2, 1), Cells(lnPost + 1, lnField))
rnData = Application.Transpose(vaData)


Nachfolgendes wird weggelassen, es geht eh nicht um excel 2000/2002

'***********************Excel 2000 / 2002********************
Cells(2, 1).CopyFromRecordset rst

Range(Cells(2, 3), Cells(65536, 3).End(xlUp)).NumberFormat _
= "yyyy/mm/dd"

Set rst = Nothing
Set cnt = Nothing
End Sub

Vielen dank nochmal an alle, die sich meinen Beitrag anschauen, ich hoffe, es ist durch meine Kommentare nicht zu unuebersichtlich geworden!

lg

Dreamer030



Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung