2017-03-12 6 views
1

現在、ブックのユーザーにブックを開き、そこから情報を取得して閉じるために次のコードを使用しています。現時点では、ブックブックのコレクションとインデックス( "woorkbooks(2)")を使用して、開いているブックをアドレスします。今、私は2つのワークブックを開く必要があります、そして、私の問題は、ワークブックのどれが2として索引付けされ、3として索引付けされるか分かりません。だから、それぞれに参照を得る方法がなければならないと考えましたワークブック。 ExcelのVBAでFileDialogを使用して複数のブックを開いて参照する

Function openfile() As Boolean 

Dim fd As FileDialog 
Dim file_was_chosen As Boolean 

Set fd = Application.FileDialog(msoFileDialogOpen) 

With fd 
    .Filters.Clear 
    .Filters.Add "Excel File", "*.xl*" 
End With 

file_was_chosen = fd.Show 

If Not file_was_chosen Then 
    MsgBox "You didn't select a file" 
    openfile = False 
    Exit Function 
End If 

fd.Execute 
openfile = True 

End Function 

は今、私は、各ワークブックのフルパスを取得関わるこの問題に対するいくつかの解決策を見てきましたが、私はそれが別の言語の単語(とワークブックの名前が含まれているため、完全なパスを使用することは避けてくださいを好みます疑問符と一緒に表示されます)。さらに、私は、ユーザーが2回ではなく2回だけプロンプトされるソリューションを好むだろう。

答えて

2

を動作するはずですので、ここでも、テストされていないが、私は私自身のprocsの1からそれを変更しました。楽しい。そして、誰かが私の他の答えを下落させた人は、あなたがそれについて嫌いだったことを説明するコメントに、それがdownvoteを必要とすることを追加してください。

Function openfile() As Variant 
    Dim aOpen(2) As String, itm As Variant, cnt As Long, lAsk As Long 
    Dim fd As FileDialog 
    Dim file_was_chosen As Boolean 

    Set fd = Application.FileDialog(msoFileDialogOpen) 

    With fd 
     .Filters.Clear 
     .Filters.Add "Excel File", "*.xl*" 
    End With 

    Do 
     file_was_chosen = fd.Show 
     If Not file_was_chosen Or fd.SelectedItems.Count > 2 Then 
      lAsk = MsgBox("You didn't select one or two files, try again?", vbQuestion + vbYesNo, "File count mismatch") 
      If lAsk = vbNo Then 
       openfile = aOpen 
       Exit Function 
      End If 
     End If 
    Loop While fd.SelectedItems.Count < 1 Or fd.SelectedItems.Count > 2 

    cnt = 0 
    For Each itm In fd.SelectedItems 
     aOpen(cnt) = itm 
     cnt = cnt + 1 
    Next 
    openfile = aOpen 
    fd.Execute 
End Function 

Sub test() 
    Dim vRslt As Variant 
    Dim wkb As Excel.Workbook, wkb1 As Excel.Workbook, wkb2 As Excel.Workbook 

    vRslt = openfile 
    For Each wkb In Application.Workbooks 
     If wkb.Path & "\" & wkb.Name = vRslt(0) Then Set wkb1 = wkb 
     If wkb.Path & "\" & wkb.Name = vRslt(1) Then Set wkb2 = wkb 
    Next 

    If vRslt(0) = "" Then ' no files 
     MsgBox "No files opened so nothing happens..." 
    ElseIf vRslt(1) = "" Then ' one file was opened 
     MsgBox "One file so do whatever you want for one file" 
    Else ' two files were opened 
     MsgBox "Two files so do whatever you want for two files" 
    End If   
End Sub 
+0

本当にありがとうございました。 (そして、私の変数と一貫してくれてありがとう、とても役に立ちました) – Sergey

0

既存のopenfile関数を使用して、ブール値をExcel.Workbookに戻します。ワークブックを開いていない場合は、falseの代わりにNothingに設定します。それ以外の場合は、オープンしたファイルのワークブック参照に設定します(その参照を取得するには、openfileを変更する必要があります)。次に、それを2回呼び出すだけで、Nothing以外の呼び出しごとにワークブック参照を設定します。

以下のコード例はフリーフォームで書かれており、テストされていません。実際には賞賛された擬似コードですが、正しい方向性を指摘する必要があります。

sub test 
    dim lAsk as long 
    dim wkb1 as excel.workbook 
    dim wkb2 as excel.workbook 
    do 
     if wkb1 is Nothing then 
      set wkb1 = openfile 
      if wkb1 is Nothing then 
       lAsk = msgbox("you didn't select a first file, try again?",vbyesno,"No file selected") 
       if lAsk = vbNo then exit do 
      end if 
     elseif wkb2 is Nothing then 
      set wkb2 = openfile 
      if wkb2 is Nothing then 
       lAsk = msgbox("you didn't select a second file, try again?",vbyesno,"No file selected") 
       if lAsk = vbNo then exit do 
      end if 
     end if 
    loop while wkb1 is Nothing or wkb2 is Nothing 

    ' do whatever with wkb1 and wkb2 here 

end sub 

を追加するように編集:

をここにあなたの改訂のOpenFile機能のための非常に基本的な形状があります。それはこのバージョンでは、ユーザーは単一のダイアログを与える

Function openfile() As Excel.Workbook 
    Dim sFilter As String 
    Dim sTitle As String 
    Dim vFileName As Variant 

    sFilter = "Excel Files (*.xl*), *.xl*, CSV Files (*.csv), *.csv, All Files (*.*), *.*" 
    sTitle = "Select file to process" 

    vFileName = Application.GetOpenFilename(filefilter:=sFilter, Title:=sTitle) 
    If vFileName = False Then 
     Set openfile = Nothing 
    Else 
     Set openfile = Workbooks.Open(Filename:=vFileName) 
    End If 
End Function 
関連する問題