在 VBA 中使用文件对话框
Using filedialog in VBA
我通常只是 google 并最终找到答案,但这次我真的被卡住了。我不太熟悉 VBA 及其工作原理,但了解了基本概念。
我想做的是从多个 .lvm 文件中收集数据并将其放入图表中。 .lvm 文件是用制表符分隔的列的文本文件,它们包含文本和十进制数字。
我想 select 文件对话框中的多个文件,并从文件中复制一列并将其放入图表中。我能够复制该列,但是当我将值复制为文本而不是数字时。当我在 Excel 中打开文件时,通常值的格式为 "General" 并且我可以从中制作图表。但是当文件被 filedialog 打开时,格式发生了一些变化。我的代码看起来像这样(到目前为止):
Private Sub CommandButton1_Click()
Dim fd As FileDialog
Dim FileChosen As Variant
Dim FileName As String
Dim i As Integer
Set fd = Application.FileDialog(msoFileDialogFilePicker)
'use the standard title and filters, but change the
'initial folder
fd.InitialView = msoFileDialogViewList
'allow multiple file selection
fd.AllowMultiSelect = True
FileChosen = fd.Show
If FileChosen = -1 Then
'open each of the files chosen
For i = 1 To fd.SelectedItems.Count
Workbooks.Open fd.SelectedItems(i)
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
Application.DisplayAlerts = False
ActiveWorkbook.Close
ThisWorkbook.Sheets("Sheet2").Activate
Sheets("Sheet2").Select
Sheets("Sheet2").Cells(1, i * 1).Select
ActiveSheet.Paste
Application.DisplayAlerts = True
Next i
End If
End Sub
我的来源看起来像这样:
"Lots of text until row 23"
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
原文件行数较多,小数点后有五位数字
我可以想到两种方法来做到这一点。一种是在使用 VBA 粘贴数据后格式化单元格。但是,我建议您使用更简单的选项 - 粘贴为值。这是语法的样子
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
ActiveSheet.Range("").PasteSpecial xlPasteValues 'Enter the range as you need
粘贴为值可以帮助您保留所有格式。希望这有帮助。
您可以将范围的 NumberFormat
更改为 General
。参见:https://msdn.microsoft.com/en-gb/vba/excel-vba/articles/range-numberformat-property-excel
不建议使用ThisWorkbook
或Active
。您可以在此处获得有关此主题的更多信息:How to avoid using Select in Excel VBA
为什么说i*1
?我将其更改为 i
这应该为您完成:
Dim wb_main As Workbook
Dim wb_source As Workbook
Set wb_main = ThisWorkbook
...
For i = 1 To fd.SelectedItems.Count
Set wb_source = Workbooks.Open(Filename:=fd.SelectedItems(i))
wb_source.Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
'Application.DisplayAlerts = False
wb_source.Close SaveChanges:=False
With wb_main.Sheets("Blad2")
.Cells(1, i).PasteSpecial xlPasteValues
.Columns(i).NumberFormat = "General"
End With
'Application.DisplayAlerts = True
Next i
为什么要使用 Application.DisplayAlerts = False
?如果您不想 Excel 询问是否应该更改更改,您可以将 SaveChanges:=False
添加到关闭操作:wb_source.Close SaveChanges:=False
希望对您有所帮助
我发现自己出了什么问题!该问题实际上是由 workbooks.open
引起的。不知何故它没有响应分隔符,因此源文件以错误的方式导入。我改用 workbooks.OpenText
解决了这个问题。
Workbooks.OpenText FileName:= _
fd.SelectedItems(i), DataType:=xlDelimited, Local:=True
Set wb_source = ActiveWorkbook'
我通常只是 google 并最终找到答案,但这次我真的被卡住了。我不太熟悉 VBA 及其工作原理,但了解了基本概念。
我想做的是从多个 .lvm 文件中收集数据并将其放入图表中。 .lvm 文件是用制表符分隔的列的文本文件,它们包含文本和十进制数字。
我想 select 文件对话框中的多个文件,并从文件中复制一列并将其放入图表中。我能够复制该列,但是当我将值复制为文本而不是数字时。当我在 Excel 中打开文件时,通常值的格式为 "General" 并且我可以从中制作图表。但是当文件被 filedialog 打开时,格式发生了一些变化。我的代码看起来像这样(到目前为止):
Private Sub CommandButton1_Click()
Dim fd As FileDialog
Dim FileChosen As Variant
Dim FileName As String
Dim i As Integer
Set fd = Application.FileDialog(msoFileDialogFilePicker)
'use the standard title and filters, but change the
'initial folder
fd.InitialView = msoFileDialogViewList
'allow multiple file selection
fd.AllowMultiSelect = True
FileChosen = fd.Show
If FileChosen = -1 Then
'open each of the files chosen
For i = 1 To fd.SelectedItems.Count
Workbooks.Open fd.SelectedItems(i)
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
Application.DisplayAlerts = False
ActiveWorkbook.Close
ThisWorkbook.Sheets("Sheet2").Activate
Sheets("Sheet2").Select
Sheets("Sheet2").Cells(1, i * 1).Select
ActiveSheet.Paste
Application.DisplayAlerts = True
Next i
End If
End Sub
我的来源看起来像这样:
"Lots of text until row 23"
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
0,9 0,2 0,5 0,2 0,1 0,1
0,1 0,2 0,4 0,5 0,7 0,8
原文件行数较多,小数点后有五位数字
我可以想到两种方法来做到这一点。一种是在使用 VBA 粘贴数据后格式化单元格。但是,我建议您使用更简单的选项 - 粘贴为值。这是语法的样子
Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
ActiveSheet.Range("").PasteSpecial xlPasteValues 'Enter the range as you need
粘贴为值可以帮助您保留所有格式。希望这有帮助。
您可以将范围的 NumberFormat
更改为 General
。参见:https://msdn.microsoft.com/en-gb/vba/excel-vba/articles/range-numberformat-property-excel
不建议使用ThisWorkbook
或Active
。您可以在此处获得有关此主题的更多信息:How to avoid using Select in Excel VBA
为什么说i*1
?我将其更改为 i
这应该为您完成:
Dim wb_main As Workbook
Dim wb_source As Workbook
Set wb_main = ThisWorkbook
...
For i = 1 To fd.SelectedItems.Count
Set wb_source = Workbooks.Open(Filename:=fd.SelectedItems(i))
wb_source.Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
'Application.DisplayAlerts = False
wb_source.Close SaveChanges:=False
With wb_main.Sheets("Blad2")
.Cells(1, i).PasteSpecial xlPasteValues
.Columns(i).NumberFormat = "General"
End With
'Application.DisplayAlerts = True
Next i
为什么要使用 Application.DisplayAlerts = False
?如果您不想 Excel 询问是否应该更改更改,您可以将 SaveChanges:=False
添加到关闭操作:wb_source.Close SaveChanges:=False
希望对您有所帮助
我发现自己出了什么问题!该问题实际上是由 workbooks.open
引起的。不知何故它没有响应分隔符,因此源文件以错误的方式导入。我改用 workbooks.OpenText
解决了这个问题。
Workbooks.OpenText FileName:= _
fd.SelectedItems(i), DataType:=xlDelimited, Local:=True
Set wb_source = ActiveWorkbook'