excelvba随机显示用户表单
我刚刚开始编程VBA,几乎没有其他编程经验 我将首先描述宏的意图: 因此,有x个excel文件,其中包含数据。所有这些文件都遵循相同的基本设计: 列A包含我想要的数据的“名称”。有十行不同的名字。 列M包含与列A的名称对应的数据,以及介于两者之间的列的平均值 此平均数据必须传输到“主”excel文件 我制作了一个userform来选择需要导入的文件,至少在选择文件时效果不错 我使用excelvba随机显示用户表单,vba,excel,Vba,Excel,我刚刚开始编程VBA,几乎没有其他编程经验 我将首先描述宏的意图: 因此,有x个excel文件,其中包含数据。所有这些文件都遵循相同的基本设计: 列A包含我想要的数据的“名称”。有十行不同的名字。 列M包含与列A的名称对应的数据,以及介于两者之间的列的平均值 此平均数据必须传输到“主”excel文件 我制作了一个userform来选择需要导入的文件,至少在选择文件时效果不错 我使用 usrform.show 如前所述,我能够运行userform。当我在userform中单击apply时,它会停
usrform.show
如前所述,我能够运行userform。当我在userform中单击apply时,它会停止代码并打开excelvba编辑器并显示图形userform。
不知道是什么原因造成的。你们有什么意见吗
Public strListe_selected() As String
Public booDatenAbbrechen As Boolean
Sub Ergebnisse_einlesen()
Dim datei As String
Dim liste As String
Dim test As Variant
Dim name As String
Dim nPh As Integer
Dim Suche As String
Dim Excel_Daten() As Variant
Dim rngFound As Range
Dim rngFound1 As Range
Dim Komponente() As String
Dim startreihe As Integer
Dim SMK As String
Dim dateinr As Integer
Dim strdatumformatiert As String
Dim strerstellungsdatum() As String
Dim intantwort As Integer
Dim strdatum As String
Dim Phase As String
'*************************************Zeit messen um Einlesezeit zu optimieren
Dim t
t = Now
'*************************************Zeile controlieren, somit kein daten in die falsche zeile kommt
startreihe = ActiveCell.Row
If startreihe < 10 Then
MsgBox "Bitte markieren sie die Zeile in der die neuen Testdaten eingetragen werden sollen und führen sie das Makro erneut aus"
Exit Sub
ElseIf Cells(startreihe, 3) <> "" Then
antwort = MsgBox("Die markierte Zeile enthält bereits Daten, wollen sie diese überschreiben?", vbOKCancel)
If antwort = vbCancel Then Exit Sub
End If
'************************************Sammeln von Informationen über diese Arbeitsmappe
liste = ThisWorkbook.ActiveSheet.name
letztespalte = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
name = ThisWorkbook.name
'************************************Dialogfenster öffnen
xls_suchen.Show
If booDatenAbbrechen = True Then Exit Sub
For dateinr = 0 To UBound(strListe_selected) 'Schleife über die gewählten xls-Dateien
Application.ScreenUpdating = False 'Bildschirmanzeige unterdrücken
Workbooks.Open Filename:=Element & strListe_selected(dateinr) 'öffnen der xls-Datei
'**********************************************************************************************************************
'neudimensionieren des ARRAYs
c = 4
emdat = anzkomp * (c + 1)
ReDim Excel_Daten(24 + emdat, 3)
'Spaltenüberschrift des Arrays "Excel_Daten" festlegen
Excel_Daten(0, 0) = "Name"
Excel_Daten(0, 1) = "Reihe"
Excel_Daten(0, 2) = "Spalte"
Excel_Daten(0, 3) = "Wert"
'**********************************************************************************************************************
'******************************** Daten aus der Excel-Datei lesen *******************************************************
i = 2
For k = 1 To anzkomp
Suche = Komponente(k)
Excel_Daten(i, 0) = Komponente(k)
Set rngFound = Cells.Find(What:="Bemerkung:")
test = Cells(rngFound.Row, rngFound.Column).Value
If test = "Bemerkung:" Then
anzkomp = 11
nPh = 1
ReDim Komponente(anzkomp)
Testergebnis = "Phase"
Komponente(1) = "F_eth"
Komponente(2) = "F_Lakor_m"
Komponente(3) = "F_lradap1c[0]"
Komponente(4) = "F_lradap1c[1]"
Komponente(5) = "F_lradap1c[2]"
Komponente(6) = "F_lradap1c[3]"
Komponente(7) = "F_lradap1c[4]"
Komponente(8) = "F_lradap1c[5]"
Komponente(9) = "F_lradap1c[6]"
Komponente(10) = "F_lradap1c[7]"
Komponente(11) = "Km_st_1"
Else
MsgBox "Der test ist nicht bekannt. Ist der Datei ein EDR Messdatei?"
End If
Set rngFound1 = Cells.Find(What:="Phase")
If rngFound1 Is Nothing Then
MsgBox Testergebnis & "nicht gefunden"
Else
Set rngFound = Cells.Find(What:=Suche, After:=Cells(rngFound1.Row, rngFound1.Column))
If rngFound Is Nothing Then
If Suche = "F_eth" Then n = 2
If Suche = "F_Lakor_m" Then n = 5
If Suche = "F_lradap1c[0]" Then n = 8
If Suche = "F_lradap1c[1]" Then n = 11
If Suche = "F_lradap1c[2]" Then n = 14
If Suche = "F_lradap1c[3]" Then n = 17
If Suche = "F_lradap1c[4]" Then n = 20
If Suche = "F_lradap1c[5]" Then n = 23
If Suche = "F_lradap1c[6]" Then n = 26
If Suche = "F_lradap1c[7]" Then n = 29
If Suche = "Km_st_1" Then n = 32
For i = n To n + 4
If i <> n Then Excel_Daten(i, 0) = Suche & "_PH" & i - n
Excel_Daten(1, 3) = ""
Next i
Else
Excel_Daten(i, 1) = rngFound.Row
Excel_Daten(i, 2) = rngFound.Column
Excel_Daten(i, 3) = Cells(rngFound.Row, rngFound.Column + 12).Value
i = i + 1
For j = 1 To c
If j > nPh Then
If Suche = "F_eth" Then n = 2
If Suche = "F_Lakor_m" Then n = 5
If Suche = "F_lradap1c[0]" Then n = 8
If Suche = "F_lradap1c[1]" Then n = 11
If Suche = "F_lradap1c[2]" Then n = 14
If Suche = "F_lradap1c[3]" Then n = 17
If Suche = "F_lradap1c[4]" Then n = 20
If Suche = "F_lradap1c[5]" Then n = 23
If Suche = "F_lradap1c[6]" Then n = 26
If Suche = "F_lradap1c[7]" Then n = 29
If Suche = "Km_st_1" Then n = 32
Excel_Daten(n + j, 0) = Suche & "_PH" & j
Excel_Daten(n + j, 3) = ""
i = i + 1
End If
Next j
End If
End If
Next k
'Einlesen der Ergebnisse abgeschlossen --> schließen der VTS-Datei
ActiveWorkbook.Close
'**********************************************************************************************
'**********************************************************************************************
'Daten in gewünschtes Tabellenblatt übertragen
For b = 1 To 12
ThisWorkbook.Worksheets(liste).Cells(startreihe, b + 1) = Excel_Daten(b, 3)
Next b
b = 12
For a = 13 To 10 + emdat
ThisWorkbook.Worksheets(liste).Cells(startreihe, b + 3) = Excel_Daten(a, 3)
If Excel_Daten(a, 0) = "GRAMS_KM_CO2" Or Excel_Daten(a, 0) = "GRAMS_MI_CO2" _
Or Excel_Daten(a, 0) = "FUEL_CONS_MPG" Or Excel_Daten(a, 0) = "FUEL_CONS_KPL" _
Or Excel_Daten(a, 0) = "FUEL_CONS_LP100K" Then
b = b
ElseIf Excel_Daten(a + 1, 0) = Excel_Daten(a, 0) & "_PH1" Then
b = b + 2
End If
For i = 1 To c
a = a + 1
b = b + 1
ThisWorkbook.Worksheets(liste).Cells(startreihe, b + 3) = Excel_Daten(a, 3)
Next i
b = b + 1
'If a < emdat + 10 Then
' If test = "US06V1_FE" And VTS_Daten(a + 1, 0) = "FUEL_CONS_MPG" Then B = B + 5
'End If
Next a
Application.ScreenUpdating = True 'Bildschirmanzeige zulassen
Next dateinr
End Sub
用户表单:
Private Sub button_cancel_Click()
ReDim strListe_selected(0) 'Liste wird gelöscht
booDatenAbbrechen = True
Unload Me
End Sub
Private Sub button_all_Click()
With Me.ListBox1
For i = 0 To .ListCount - 1
ListBox1.Selected(i) = True
Next
End With
End Sub
Private Sub button_none_Click()
With Me.ListBox1
For i = 0 To .ListCount - 1
ListBox1.Selected(i) = False
Next
End With
End Sub
Private Sub button_apply_Click()
booDatenAbbrechen = False
With Me.ListBox1
liste = .List
j = 0
For i = 0 To .ListCount - 1
If .Selected(i) Then
ReDim Preserve strListe_selected(j)
strListe_selected(j) = liste(i, 0)
j = j + 1
End If
Next
End With
Unload Me
End Sub
Private Sub button_add_file_Click()
add_files
End Sub
Private Sub button_add_folder_Click()
add_folder
End Sub
Sub add_folder()
Dim objAppShell As Object
Dim varBrowseDir As Variant
Dim strPfad As String
Dim varUnterordner As Variant
Dim objFileSystem As Object
Dim varOrdner As Variant
Dim Element
Dim strFilelist() As String
Dim i As Integer
Dim strFile As String
Dim FD As FileDialog
Set FD = Application.FileDialog(msoFileDialogFolderPicker)
With FD
.AllowMultiSelect = True
If Application.FileDialog(msoFileDialogFolderPicker).Show = 0 Then
Else
strPfad = .SelectedItems(1)
End If
End With
If strPfad = "" Then Exit Sub
'Ordner nach *.xls-Dateien durchsuchen
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set varOrdner = objFileSystem.GetFolder(strPfad)
Set varUnterordner = varOrdner.SubFolders
i = 0
ReDim Preserve strFilelist(i)
'Hauptordner durchsuchen
strFile = Dir(strPfad & "\" & "*.xls") 'Ersten Eintrag wählen
Do While strFile <> ""
strFilelist(i) = strPfad & "\" & strFile
ListBox1.AddItem (strFilelist(i))
i = i + 1
ReDim Preserve strFilelist(i)
strFile = Dir 'strFile = Dir 'Get nächsten Eintrag.
Loop
'Unterordner durchsuchen
For Each Element In varUnterordner
strFile = Dir(strPfad & "\" & Element.name & "\" & "*.xls")
Do While strFile <> ""
ReDim Preserve strFilelist(i)
strFilelist(i) = strPfad & "\" & Element.name & "\" & strFile
ListBox1.AddItem (strFilelist(i))
i = i + 1
strFile = Dir 'strFile = Dir 'Get nächsten Eintrag.
Loop
Next
End Sub
Sub add_files()
Dim FD As FileDialog
Dim Element
Dim i As Integer
Set FD = Application.FileDialog(msoFileDialogOpen)
With FD
.AllowMultiSelect = True
'.InitialFileName = ActiveWorkbook.Path & "\*.xls"""
.Filters.Clear
.Filters.Add "Excel dateien", "*.xls"
End With
i = 1
If FD.Show = -1 Then
For Each Element In FD.SelectedItems
' datei = Dir(Element, "*.xls")
ListBox1.AddItem (FD.SelectedItems(i))
Next
End If
End Sub
您只需复制粘贴代码并选择它,然后使用CTRL+K对其进行格式化即可。。如果这不起作用,您只需将代码添加为文本,我将为您设置格式。我想我们确实需要看看。此外,当它带您到VBE时,是否会突出显示默认黄色的任何代码?您好,谢谢您的回复。不幸的是,它没有突出显示任何内容。。而且,ctrl+k也起了作用:谢谢。我在第一篇文章中添加了代码。请尝试在“应用”按钮中为我更改Unload Me。在模块1中隐藏并卸载usrform。当您使用完它后,我将此Unload usrform放在何处?我像UnloadUserForm一样键入它,因为编辑器建议这样做语句?至少它不再在编辑器中显示usrform。数据不会输入主文件。也许这是我需要解决的另一个问题?