簡體   English   中英

如何在下拉列表框中選擇一個文件,然后該文件將由excel打開?

[英]How can I select a file in a dropdownbox which will then be opened by excel?

我已經創建了下拉框,它指向包含.csv文件的某個目錄。 我可以在下拉框中看到文件,但是我想在單擊它們后立即打開它們。 如何在Visual Basic編輯器中完成此操作? 這是我的下拉框代碼。

PS我剛剛開始在Visual Basic中編程。

    Option Explicit

Private Sub DropdownFiles()
  Dim name

  For Each name In ListDirectory(Path:="C:\Users\Test\Desktop\Macro's\", AttrInclude:=vbNormal, AttrExclude:=vbSystem Or vbHidden)
    Me.ComboBox1.AddItem name
  Next name
End Sub

Function ListDirectory(Path As String, AttrInclude As VbFileAttribute, Optional AttrExclude As VbFileAttribute = False) As Collection
  Dim Filename As String
  Dim Attribs As VbFileAttribute

  Set ListDirectory = New Collection


  Filename = Dir(Path, AttrInclude)

  While Filename <> ""
    Attribs = GetAttr(Path & Filename)
  ' If Attribs And AttrInclude And Not (Attribs And AttrExclude) Then
    If Not (Attribs And AttrExclude) Then
      ListDirectory.Add Filename, Path & Filename
    End If
    Filename = Dir
  Wend
End Function


Private Sub OpenButton()

End Sub

我運行的宏。 它位於.csv文件附近的目錄中

    Private Sub Macro()
'
' Macro
'

'
    Dim docpath As String
docpath = "TEXT;" & ThisWorkbook.Path & "\Test.csv"

    'With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Users\Test\Desktop\Macro's\Test.csv", Destination:=Range("$A$1"))
    With ActiveSheet.QueryTables.Add(Connection:=docpath, Destination:=Range("$A$1"))
'        docpath, Destination:=Range("$A$1"))
'        .CommandType = 0
        .name = "calllog"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(4, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
         ActiveSheet.name = "Sheet1"
    End With
    Range("A1:I9999").Select
    Selection.Columns.AutoFit
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Range("I2:I829").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("I2"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("I2:I9999")
        .Header = xlNo
        .MatchCase = True
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("T1").Select
    ActiveCell.FormulaR1C1 = "60"
    Range("T1").Select
    Selection.Copy
    Range("F2:F829").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Selection.NumberFormat = "0.00"
    Range("G2:G829").Select
    Range("T1").Select
    Selection.Copy
    Range("G2:G829").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Selection.NumberFormat = "0.00"
    Range("T1").Select
    Selection.ClearContents
    Range("A437:I829").Select
    Selection.Cut Destination:=Range("A439:I831")
    Range("A439:I831").Select
    Range("A439:I506").Select
    Range("I506").Activate
    Selection.Cut Destination:=Range("A438:I505")
    Range("L452").Select
    Range("A2:A436,F2:F436").Select
    Range("F436").Activate
    ActiveSheet.Shapes.AddChart2(216, xlBarClustered).Select
    ActiveChart.SetSourceData Source:=Range( _
        "Sheet1!$A$2:$A$436,Sheet1!$F$2:$F$436")
    ActiveSheet.Shapes("Chart 1").IncrementLeft 304.5
    ActiveSheet.Shapes("Chart 1").IncrementTop -139.5
    ActiveChart.ChartTitle.Select
    ActiveChart.ChartTitle.Text = "Aantal gebelde minuten (Inbound)"
    Selection.Format.TextFrame2.TextRange.Characters.Text = _
        "Aantal gebelde minuten (Inbound)"
    With Selection.Format.TextFrame2.TextRange.Characters(1, 32).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(1, 14).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 14
        .Italic = msoFalse
        .Kerning = 12
        .name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Spacing = 0
        .Strike = msoNoStrike
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(15, 18).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 14
        .Italic = msoFalse
        .Kerning = 12
        .name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Spacing = 0
        .Strike = msoNoStrike
    End With
    Range("O27").Select
    Range("A438:A505,F438:F505").Select
    Range("F505").Activate
    ActiveSheet.Shapes.AddChart2(216, xlBarClustered).Select
    ActiveChart.SetSourceData Source:=Range( _
        "Sheet1!$A$438:$A$505,Sheet1!$F$438:$F$505")
    ActiveSheet.Shapes("Chart 2").IncrementLeft 312.75
    ActiveSheet.Shapes("Chart 2").IncrementTop -61.5
    ActiveChart.ChartTitle.Select
    ActiveChart.ChartTitle.Text = "Aantal gebelde minuten (Internal)"
    Selection.Format.TextFrame2.TextRange.Characters.Text = _
        "Aantal gebelde minuten (Internal)"
    With Selection.Format.TextFrame2.TextRange.Characters(1, 33).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(1, 33).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 14
        .Italic = msoFalse
        .Kerning = 12
        .name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Spacing = 0
        .Strike = msoNoStrike
    End With
    Range("M458").Select
    Application.CommandBars("Format Object").Visible = False
    Range("A507:A831,F507:F831").Select
    Range("F831").Activate
    ActiveSheet.Shapes.AddChart2(216, xlBarClustered).Select
    ActiveChart.SetSourceData Source:=Range( _
        "Sheet1!$A$507:$A$831,Sheet1!$F$507:$F$831")
    ActiveSheet.Shapes("Chart 3").IncrementLeft 301.5
    ActiveSheet.Shapes("Chart 3").IncrementTop -73.5
    ActiveChart.ChartTitle.Select
    Application.CommandBars("Format Object").Visible = False
    ActiveChart.ChartTitle.Text = "Aantal gebelde minuten (Outbound)"
    Selection.Format.TextFrame2.TextRange.Characters.Text = _
        "Aantal gebelde minuten (Outbound)"
    With Selection.Format.TextFrame2.TextRange.Characters(1, 33).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(1, 33).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 14
        .Italic = msoFalse
        .Kerning = 12
        .name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Spacing = 0
        .Strike = msoNoStrike
    End With
    Range("P535").Select
    ActiveWindow.SmallScroll Down:=-18
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.Parent.Cut
    Sheets("Sheet1").Select
    Sheets("Sheet1").name = "Log"
    Sheets.Add After:=ActiveSheet
    Sheets("Sheet1").Select
    Sheets("Sheet1").name = "Chart"
    Range("A1").Select
    ActiveSheet.Paste
    Sheets("Log").Select
    ActiveSheet.ChartObjects("Chart 2").Activate
    ActiveChart.Parent.Cut
    Sheets("Chart").Select
    Range("J1").Select
    ActiveSheet.Paste
    Sheets("Log").Select
    ActiveSheet.ChartObjects("Chart 3").Activate
    ActiveChart.Parent.Cut
    Sheets("Chart").Select
    Range("E19").Select
    ActiveSheet.Paste
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveSheet.Shapes("Chart 1").ScaleWidth 1.1479166667, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.Shapes("Chart 1").ScaleHeight 1.1770833333, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.ChartObjects("Chart 2").Activate
    ActiveSheet.ChartObjects("Chart 2").Activate
    ActiveSheet.Shapes("Chart 2").ScaleWidth 1.1416666667, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.Shapes("Chart 2").ScaleHeight 1.1736111111, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.ChartObjects("Chart 3").Activate
    ActiveSheet.ChartObjects("Chart 3").Activate
    ActiveSheet.Shapes("Chart 3").ScaleWidth 1.1979166667, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.Shapes("Chart 3").ScaleHeight 1.2361111111, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.ChartObjects("Chart 3").Activate
    ActiveChart.PlotArea.Select
    Selection.Left = 85.964
    Selection.Top = 37.09
    ActiveChart.ChartArea.Select
    ActiveSheet.Shapes("Chart 3").IncrementLeft 36
    ActiveSheet.Shapes("Chart 3").IncrementTop -0.75
    Sheets("Log").Select
End Sub

右鍵單擊表單上的下拉框,然后選擇“查看代碼”。 在屏幕的右上角選擇“更改”事件,然后使用以下代碼:

Private Sub ComboBox1_Change()
Dim WbSource As Workbook
Dim pth As String
Dim fnme As String

fnme = ComboBox1.Value
pth = "C:\Users\Test\Desktop\Macro's\"

Application.Run "CustomMacro", pth & fnme

End Sub

如果答案有效,請標記為已接受。

我了解您現在需要在打開的工作簿上運行宏。 這可以通過幾種方法來完成,這是我的解決問題的建議:1)盡量遠離ThisWorkbookActiveWorksheet使用按工作簿和工作表ActiveWorksheet尺寸的變量2)您可以通過幾種方式將變量傳遞給宏-您可以使變量成為全局變量(我建議您閱讀變量的不同級別),但是最簡單的方法是使變量成為函數的參數。 3)對於我的解決方案,我假設您有兩本工作簿,每本都有一張紙。 我將它們稱為目標和源:源是從下拉菜單中選擇的工作簿,目標是宏所在的工作簿。 下拉框將記住源的路徑,並將其傳遞給另一個宏。

Sub CustomMacro(SrceWBPath as String)
Dim WbSource as workbook
Dim WbTarget as workbook
Dim WrkShtSrc as Worksheet
Dim WrkShtTrgt as Worksheet

Set WbTarget = This.Workbook
Set WbSource = Workbooks.Open (SrceWbPath)
Set WrkShtSrc = wbSource.Worksheets("insert_name_of_the_source_worksheet_here")
Set WrkShtTrgt = wbTarget.Worksheets("insert_name_of_the_target_worksheet_here")

'Then insert the rest of your code here, calling the proper sheets as required. Also, move away from `.Select` command - it just consumes a lot of processing time. Define variable such as `Range` and perform operations on them. 

End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM