2.2k Aufrufe
Gefragt in Datenbanken von
Hi Forum; Ich versuche mich mal richtig auszudrücken. Ich habe auf einem Server ca 650 Excel Dateien. Die immer 2 Tabellenblätter hat. Die auch immer gleich heißen. Ich möchte jetzt mit Hilfe einer Userform mir diese Tabellen mit einer Listbox sehen. Das habe ich auch schon hinbekommen. Wenn ich die einzelne Tabelle in der Listbox markiere, will ich mit einem Commandbutton das er mir die 2 Tabellenblätter in die geöffnete Excel Datei kopiert bekommen.

Danach möchte ich die Tabellen mit Hilfe weiterer Userformen bearbeiten und danach sollen sie wieder im Server abgelegt werden. Wie müsste in VBA sowas aussehen?

Für Hilfe wäre ich sehr Dankbar.

falls was unklar ist bitte fragen.

mfg Andreas

31 Antworten

0 Punkte
Beantwortet von

Hi M.O.

Habe mir mal ne Auszeit genommen wie du sagtest.

Und habe die andere UserForm versucht.

Jetzt wieder ein Problemangry

Ich muss da auf 2 Tabellenblätter zugreifen

das ist die materialliste Mit der will ich die userform befüllen, Schön wäre es wenn ich auch da den -Ist bestand mit Buchen könnte Bei der Materialausgabe.

in der spalte "P" möchte ich mit einem Hyperlink ein Bild auf der Userform sichtbar machen, Wenn zum Beispiel

die Pos.Nr: gezogen wird. Ginge sowas? oder hast du da ne bessere Idee?

Das Tabellenblatt soll mit der Userform gefüllt werden.

Das ist die UserForm

Kannst du mir da Helfen?wink

Das Hab ich mal gemacht.

Private Sub Image1_Click()
 Image1.Picture = CallByName(Tabelle4, "Image1", VbGet).Picture
    Repaint
End Sub

Private Sub CommandButton1_Click()
 'Dim erste_freie_Zeile As Integer
     'erste_freie_Zeile = Worksheets(strTabelle)("Ausgabeprotokoll").Range("B4").End(xlUp).Offset(1, 0).Row + 1
  With wkbdatei
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 3) = Box1.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 10) = TextBox1.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 4) = TextBox2.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 2) = TextBox3.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 9) = TextBox5.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 6) = TextBox8.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 7) = TextBox9.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 5) = TextBox6.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 5) = Box2.Text
       .Worksheets(strTabelle).Cells(erste_freie_Zelle, 5) = Box3.Text
   
     .Close (True)
    
           
End With
'UserForm schliessen
Unload Me
End Sub


Private Sub ToggleButton2_Click()
            Sheets("Deckblatt").Select
            UserForm1.Hide
End Sub

Private Sub MaterialBuchung_Initialize()
    Label13.Caption = "Bearbeiten der Tabelle" & strTabelle
   
            Worksheets(strTabelle)("Inventurliste").Activate
            'Box1 Befehl zum Anzeigen der Versorgungsnummern
            With ComboBox1
            .AddItem wkbdatei.Worksheets(strTabelle)("Inventurliste").RowSource = "G7:G750"
            .ListIndex = 0
            End With
            With Me.ComboBox2
                 .AddItem "Komplett"
                 .AddItem "1"
                 .AddItem "2"
                 .AddItem "3"
                 .AddItem "4"
                 .AddItem "5"
                 .AddItem "6"
                 .AddItem "7"
                 .AddItem "8"
                 .AddItem "9"
                 .AddItem "10"
             End With
           
           
           
            With Me.ComboBox3
                 .AddItem "5233100 (Produktion Systeminst.)"
                 .AddItem "5233220 (Inst.Systeme)"
                 .AddItem "5233500 (Baugruppen Inst.)"
                 .AddItem "5233515 (Instandsetzung Turm)"
                 .AddItem "5233520 (Motor-u. Getriebe Inst.)"
                 .AddItem "5233531 (Elektrik)"
                 .AddItem "5233532 (Optik/Optronik)"
                 .AddItem "5235220 (System Prüfung)"
                 .AddItem "5237100 (op MaWi)"
            End With
  ComboBox1.Value = wkbdatei.Worksheets(strTabelle).Range("C4")
  TextBox1.Value = wkbdatei.Worksheets(strTabelle).Range("J4")
  TextBox2.Value = wkbdatei.Worksheets(strTabelle).Range("D4")
  TextBox3.Value = wkbdatei.Worksheets(strTabelle).Range("B4")
  TextBox8.Value = wkbdatei.Worksheets(strTabelle).Range("F4")
  TextBox9.Value = wkbdatei.Worksheets(strTabelle).Range("G4")
  ComboBox2.Value = wkbdatei.Worksheets(strTabelle).Range("E4")
  ComboBox3.Value = wkbdatei.Worksheets(strTabelle).Range("H4")
  '.TextBox5 = Right(100 & Day(Date), 2) & "." & Right(100 & Month(Date), 2) & "." & Year(Date)
  TextBox5.Value = Date
 
End Sub

Danke schon mal im Vorrausangel

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Andreas,

was mir bei deinem Code auffällt, sind einige Zeilen wie diese:

Worksheets(strTabelle)("Ausgabeprotokoll").Range("B4")

Abgesehen davon, dass die Syntax natürlich falsch ist, welches Arbeitsblatt willst du denn ansprechen?

In der bearbeiteten Beispieldatei siehst du ja, wie eine Userform gefüllt wird. du musst eben nur die Namen der Arbeitsmappe und der Tabelle anpassen. Gerade wenn du mit mehreren offenen Dateien arbeitest, würde ich immer Worbook und Tabelle im Code ansprechen:

TextBox1.Value = ThisWorkbook.Worksheets("Tabelle1").Range("A1")

TextBox1.Value = wkbdatei.Worksheets(strTabelle).Range("J4")

Ein Bild in deine Userform einfügen kannst du z.B. wie folgt:

Image1.Picture = LoadPicture(Range("P3").Hyperlinks(1).Address)

Hier wird aus der aktiven Tabelle aus der Zelle P3, wo in einem Hyperlink der Pfad zu einem Bild hinterlegt ist, der Pfad ausgelesen und das Bild in die Userform eingefügt. Beachte aber, falls das Bild zu groß ist, wird ggf. nur ein Teil des Bildes dargestellt.

Gruß

M.O.

0 Punkte
Beantwortet von

Guten Morgen M.O.

Ich habe es jetzt versucht und ich bekomme es einfach nicht hin,indecision

Die UserForm bleibt einfach leer.

was meinst du mit Syntax?

Ich mache das so zum ersten mal das ich mir von woanders Daten ziehen will.

Ich frag jetzt mal ganz von vorne. Vielleicht hilft das. Combobox 1 = Versorgungsnummer.

Ich möchte da von der Tabelle "Inventurliste" Die Versorgungsnummern anzeigen lassen.

With ComboBox1
            ComboBox1.Value = ThisWorkbook.Worksheets("Inventurliste").Range("G7:G750")
            .ListIndex = 0
            End With

Stimmt das so?

Und das muss ich doch

Private Sub MaterialBuchung_Initialize()

da Einfügen Oder?

Mfg Andreas

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Andreas,

in deinem Code schreibst du öfter

wkbdatei.Worksheets(strTabelle)("Inventurliste").

strTabelle enthält ja eine Variable für den Tabellennamen, den der User vorher ausgewählt hat. Außerdem setzt du in Klammern noch die Tabelle Inventurliste dahinter. Diese Syntax - also zwei Tabellennamen anzusprechen - gibt es so nicht und funktioniert auch nicht.

Willst du die Combobox1 z.B. in einem Rutsch mit RowSource füllen, dann so:

Private Sub UserForm_Initialize()

With ComboBox1
    .RowSource = "Inventurliste!G7:G750"
    .ListIndex = 0
End With

End Sub

Hier wird sich automatisch auf das aktuelle Workbook bezogen.

Natürlich kannst du das auch über eine Schleife machen:

Private Sub UserForm_Initialize()
Dim lngZeile As Long

With ComboBox1
   For lngZeile = 7 To 750
     .AddItem ThisWorkbook.Worksheets("Inventurliste").Cells(lngZeile, 7)
   Next lngZeile
    .ListIndex = 0
End With

End Sub

Hier hast du den Vorteil, dass du ohne große Probleme die Datei und die Tabelle, aus der die Daten eingelesen werden sollen, festlegen kannst.

Wenn du das bei Userform-Initialize machen willst, musst du das natürlich bei der Userform machen, die du aufrufen willst. Am besten öffnest du das VBA-Projekt und machst einen Doppelklick auf deine Userform . Jetzt steht im Eingabebereich

Private Sub UserForm_Click()

End Sub

Im rechten oberen Teil des Fensters kannst du statt Click nun Initialize auswählen und hier deinen Code einfügen.

Aber das ist nicht die einzige Möglichkeit. Du kannst das z.B. auch über einen Command-Button machen. Hier musst du aber den Namen der Userform kennen (der ja in den Eigenschaften steht):

Private Sub CommandButton1_Click()
Dim lngZeile As Long

With UserForm1
  With .ComboBox1
    For lngZeile = 7 To 750
       .AddItem ThisWorkbook.Worksheets("Inventurliste").Cells(lngZeile, 7)
    Next lngZeile
    .ListIndex = 0
  End With
  .Show
End With

End Sub

Das alles gilt natürlich sinngemäß für sämtlich andere Steuerelemente, die du in deiner Userform hast. Und natürlich solltest du auch wissen, wie du die einzelnen Steuerelemente ansprechen kannst. Dazu kannst du dir z.B. mal das hier anschauen: Tutorial Steuerlemente

Gruß

M.O.


 

+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Andreas,

obwohl du einen anderen Thread aufgemacht hast antworte ich hier, da es sich ja immer noch um das selbe Problem handelt.

Deine bearbeitete Beispieltabelle findest du hier: Klick

Ich habe dir einige Kommentare in die verschiedenen Codes geschrieben. Die Codes habe ich nach meinem Verständnis geschrieben. So werden z.B. aus der Inventurliste nur Einträge in die Userform5 übernommen, bei denen es eine Versorgungsnummer gibt. Schau dir mal alles in Ruhe an.

Gruß

M.O.

0 Punkte
Beantwortet von

Erst mal Vielen Dank M.O.

Ich hatte einen neuen Thread auf gemacht weil das antwort fenster gestern nicht mehr da war.

jetzt geht es wieder, dachte vielleicht man kann nur eine gewisse Anzahl antworten vielleicht.

Ich habe mir Tabelle angeschaut. und was soll ich sagen da hab ich mir was aufgehalstangry

Soweit hast du alles super beschrieben, aber muss ich da jetzt noch Änderungen vornehmen?

weil es hat sich nichts geändert. UserForm geht auf aber es werden keine Daten angezeigt.cryingcryingcrying

bei dieser Art der Makros bin ich raus. Im mom jedenfalls. Aber ich will ja auch was Lernen.

Hut ab an M.O.

Mfg Andreas

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Andreas,

bei mir funktioniert das Füllen der Userformen aus deiner Testtabelle 001037.xlsx mit der geposteten und bearbeiteten Tabelle ohne Probleme. Warum das bei dir jetzt nicht klappt, kann ich von hier aus natürlich nicht sagen? Hat die geöffnete Tabellen Daten? Hast du das mit meiner geposteten Datei probiert oder mit einer von dir angepassten Datei?

Gruß

M.O.
0 Punkte
Beantwortet von andreas-b Einsteiger_in (16 Punkte)

So,

Hi M.O.

Ich habe das Skript jetzt nochmal komplett neu geschrieben.

jetzt funzt zwar die UserForm5 aber die 4er nicht.

ich bekomme einen Fehler der vorher bei der 5er war und zwar in der UserForm 3

Wenn ich dann auf depuggen gehe macht er UserForm3 auf und zeigt das an:

Vorher war das Problem mit der 5er jetzt die 4er.

Ich schicke dir nochmal die Datei

Wir sind fast auf der Zielgeradeangel

Ich hoffe ich konnte den Fehler so gut es Ging ausfindig machen.

Bin gespannt ob es bei dir geht.

Mfg Andreas


 

+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Andreas,

bei der Initialize-Routine für deine Userform4 schreibst du u.a.

 With ComboBox
            .AddItem wkbdatei.Worksheets(strTabelle).Range("F35")
            .ListIndex = 0
       End With

Welche Combobox ist hier gemeint (es müsste Combobox2 sein)? Du versuchst außerdem das aktuelle Datum in die Textbox10 zu schreiben. Diese gibt es in der Userform4 jedoch nicht. Das Datum muss wohl in die Textbox8 (die du aber zweimal ansprichst).

Außerdem sprichst du auch die Combobox6 zweimal an (was zwar unschädlich für den Code ist, aber das ist ja wohl so nicht gewollt).

Wenn du die Fehler beseitigst, dann öffnet sich deine Userform4 und wird wie gewünscht gefüllt.

Ich würde dir vorschlagen die Comboboxen und die Textboxen in der Reihenfolge der Nummierung im Code zu füllen. Dies erleichert den Überblick, gerade wenn du so viele Steuerelemente in einer Userform hast.

Gruß

M.O.

0 Punkte
Beantwortet von andreas-b Einsteiger_in (16 Punkte)
Bearbeitet von halfstone
Super funzt.

Ich danke Dir sehr.

Ich mach jetzt erst mal 2 Tage Pause,

Kleinigkeiten hätte ich noch darf ich mich wieder an Dich wenden?

Bild Anpassung habe ich auch hinbekommen, also das man das ganze Bild sieht und nicht nur ein Ausschnitt

Ich danke Dir für dein Geduld und bin begeistert von Deiner, will schon sagen Ehrenamtlichen Tätigkeit hier.

Nochmal Danke,Danke,Danke
...