Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA: Blatt-Name in Variable setzen durch manuelle Auswahl
#1
Hallo,
mit folgendem Code öffne ich eine Datei, wenn ein Blatt "BOM" enthalten ist und verwende dann Daten aus diesem Blatt.

Wenn das Blatt nicht vorhanden ist, kommt eine Fehlermeldung. Ich will nun stattdessen, daß ich das gewünschte Blatt aus einer Namensliste auswählen kann.
Also:
  1. öffne eine Datei mit Dateiauswahl-Dialog
  2. Auswahlmöglichkeit eines Blattes aus einer Liste der enthaltenen Arbeitsblätter
  3. setze den ausgewählten Namen in die Variable strBOM
Wie geht das?

Auswählen_Datei_1:
   
   OQOneu = Application.GetOpenFilename("Excel-Dateien, *.xl*", , "Auswählen der ersten Datei zum Datenabgleich!")
   Set WB = Workbooks.Open(OQOneu)
   Set strBOM = "BOM"
   bolIstDa = False
   
   For i = 1 To WB.Sheets.Count
      If WB.Sheets(i).Name = strBOM Then
         bolIstDa = True
         Exit For
      End If
      If Not bolIstDa Then
         MsgBox ("Keine BOM enthalten, falsche Datei, bitte die richtige auswählen!")
         WB.Close savechanges:=False
         GoTo Auswählen_Datei_1
      End If
   Next
   
   With WB.Sheets(strBOM)         'Filter rücksetzen 
      If .AutoFilterMode Then
         If .FilterMode Then
            .ShowAllData
         End If
      End If
   End With
Antworten Top
#2
Hallo Ralf,

ich würde dann eine Userform mit einer Listbox einsetzen.

Du müsstest dann mit einer Public Variablen in einem Modul den Namen übergeben..

Dein Code könnte so abgeändert werden:


Code:
Option Explicit

Public strgTab As String
Sub mach()
Dim OQOneu
Dim WB As Workbook
Dim bolIstDa As Boolean
Dim i As Long
   OQOneu = Application.GetOpenFilename("Excel-Dateien, *.xl*", , "Auswählen der ersten Datei zum Datenabgleich!")
  Set WB = Workbooks.Open(OQOneu)
  bolIstDa = False
 
  For i = 1 To WB.Sheets.Count
     If WB.Sheets(i).Name = "BOM" Then
       bolIstDa = True
       strgTab = "BOM"
       Exit For
     End If
     If Not bolIstDa Then
        MsgBox ("Keine BOM enthalten, falsche Datei, bitte die richtige auswählen!")
        bolIstDa = True
        UserForm1.Show
'        GoTo Auswählen_Datei_1
     End If
  Next
  If strgTab <> "" Then
    With WB.Sheets(strgTab)         'Filter rücksetzen
       If .AutoFilterMode Then
          If .FilterMode Then
             .ShowAllData
          End If
       End If
    End With
  Else
    MsgBox "Keine Tabelle ausgewählt!, Datei wird geschlossen"
    WB.Close savechanges:=False
  End If
End Sub

Ich habe zum Testen Variablen deklariert und den Code Teilweise auskommentiert.
Wichtig ist hier die Public Variable ganz am Anfang.

Und hinter der Userform folgenden Code:

Code:
Option Explicit

Private Sub ListBox1_Click()
If Me.ListBox1.ListIndex > -1 Then strgTab = Me.ListBox1
Unload Me
End Sub

Private Sub UserForm_Initialize()
 Dim i As Long
 For i = 1 To Sheets.Count
   Me.ListBox1.AddItem Sheets(i).Name
 Next i
End Sub


Ich weiß jetzt nicht, ob in Deinem Code geprüft wird, ob eine Datei ausgewählt wurde.
Gruß Atilla
Antworten Top
#3
Hi atilla,

(13.01.2016, 11:47)atilla schrieb: ich würde dann eine Userform mit einer Listbox einsetzen.

danke, ich habe es jetzt folgendermaßen gemacht.
Es kommt auf jeden Fall die Arbeitsblattauswahl.
Die Variablen sind in einem extra Variablen-Modul definiert, statt strgTab heißt sie strBOM:
Option Explicit

Public Sub Datei_auswaehlen_importieren()
 
  Application.ScreenUpdating = False
 
Auswählen_Datei_1:
  OQOneu = Application.GetOpenFilename("Excel-Dateien, *.xl*", , "Auswählen der ersten Datei zum Datenabgleich!")
  Set WB = Workbooks.Open(OQOneu)
 
  UserForm1.Show
 
  If strBOM <> "" Then
     With WB.Sheets(strBOM)         'Filter rücksetzen
        If .AutoFilterMode Then
           If .FilterMode Then
              .ShowAllData
           End If
        End If
     End With
  Else
     MsgBox "Keine Tabelle ausgewählt!, Datei wird geschlossen"
     WB.Close savechanges:=False
  End If
 
  ' Werte in Zeilen trennen
  Call WerteTrennen(WB.Sheets(strBOM), ThisWorkbook.Worksheets("Tabelle1"), ThisWorkbook.Worksheets("Gesamt").Range("A7"))
 
  WB.Close savechanges:=False
  Set WB = Nothing
 
  'zweite Stückliste auswählen und einlesen
Auswählen_Datei_2:
  OQOneu = Application.GetOpenFilename("Excel-Dateien, *.xl*", , "Auswählen der zweiten Datei zum Datenabgleich!")
  Set WB = Workbooks.Open(OQOneu)
 
  UserForm1.Show
 
  If strBOM <> "" Then
     With WB.Sheets(strBOM)         'Filter rücksetzen
        If .AutoFilterMode Then
           If .FilterMode Then
              .ShowAllData
           End If
        End If
     End With
  Else
     MsgBox "Keine Tabelle ausgewählt!, Datei wird geschlossen"
     WB.Close savechanges:=False
  End If
 
  ' Werte in Zeilen trennen
  Call WerteTrennen(WB.Sheets(strBOM), ThisWorkbook.Worksheets("Tabelle2"), ThisWorkbook.Worksheets("Gesamt").Range("E7"))
 
  WB.Close savechanges:=False
  Set WB = Nothing
 
  Call Differenzliste
 
  ThisWorkbook.Worksheets("Differenzliste").Activate
  Application.ScreenUpdating = True
 
End Sub

Dialog UserForm1
Option Explicit 

Private Sub UserForm_Initialize()
  Dim i As Long
  For i = 1 To Sheets.Count
     Me.ListBox1.AddItem Sheets(i).Name
  Next i
End Sub

Private Sub ListBox1_Click()
  If Me.ListBox1.ListIndex > -1 Then strBOM = Me.ListBox1
  Unload Me
End Sub

Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste