在VBA中使用filedialog

时间:2018-02-20 14:03:45

标签: excel vba copy-paste filedialog

我通常只是谷歌并最终找到答案,但这次我真的被卡住了。我不熟悉VBA以及它是如何工作的,但却得到了基本的想法。

我要做的是从多个.lvm文件中收集数据并将其放在图表中。 .lvm文件是带有制表符分隔列的文本文件,它们包含文本和十进制数字。

我想从filesialog中选择几个文件,然后从文件中复制一列并将其放在图表中。我能够复制列,但是当我将值复制为文本而不是数字时。当我在Excel中打开文件时,通常值的格式为“常规”,我可以从中制作图表。但是当文件被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

原始文件中有更多行,小数点分隔符后面有五位数

3 个答案:

答案 0 :(得分:0)

我可以想到两种方法来做到这一点。一种方法是在使用VBA粘贴数据后格式化单元格。但是我建议你使用更简单的选项 - 粘贴作为值。这是语法的样子

Sheets(1).Range("B23:B" & Range("B23").End(xlDown).Row).Copy
ActiveSheet.Range("").PasteSpecial xlPasteValues 'Enter the range as you need

粘贴值可以帮助您保留所有格式。希望这会有所帮助。

答案 1 :(得分:0)

您可以将范围的NumberFormat更改为General。请参阅:https://msdn.microsoft.com/en-gb/vba/excel-vba/articles/range-numberformat-property-excel

建议不要使用ThisWorkbookActive。您可以在此处获取有关此主题的更多信息: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:=Falsewb_source.Close SaveChanges:=False

希望这有帮助

答案 2 :(得分:0)

我发现自己出了什么问题!问题实际上是由workbooks.open引起的。不知怎的,它没有响应分隔符,因此源文件以错误的方式导入。我使用workbooks.OpenText来解决它。

Workbooks.OpenText FileName:= _
fd.SelectedItems(i), DataType:=xlDelimited, Local:=True
Set wb_source = ActiveWorkbook'