プロが教えるわが家の防犯対策術!

Windows2000 Excel2000でマクロ作成中の超初心者です。
コマンドボタンでExcelとWord文書を開いて、その文書を利用しています。次の3点について、ご教示をお願いします。
1)この文書を開いたとき、両方ともマイドキュメントのフォルダに固定したい
2)ワード文書を開くと、タスクトレーにあらわれるため、いちいち最大化ボタンをおさなければならない。これを最初から最大化表示したい
3)他のPCでも使えるコードにしたい

ちなみに使っているコードは次の2個です。
Sub ワードをひらく()
Dim FileName As String
Dim s As String
On Error GoTo JumpError
FileName = Application.GetOpenFilename("Word文書,*.doc", 1, "Word文書を開く", , False)
Shell """C:\Program Files\Microsoft Office\Office\WINWORD.EXE""" & " """ & FileName & """"
JumpError:
End Sub
-----------------------------------
Sub エクセルをひらく()
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName
End If
End Sub

A 回答 (4件)

コメントは省略しました。



こちらの方はコードは短くて済みますが、Word を開いた後、再び
Word を制御しようと思えば困難です。つまり、開きっぱなしに
なってしまいます。

そのようなニーズがある場合は、#3 の方法の方が適しています。


' // Windows の関連付けで開く方法

Sub Sample2()

  Dim oShell    As Object
  Dim sDocumentsDir As String
  Dim sDirBackup  As String
  Dim vFilename   As Variant
  
  Set oShell = CreateObject("WScript.Shell")
  
  sDocumentsDir = oShell.SpecialFolders("MyDocuments")
  sDirBackup = oShell.CurrentDirectory
  
  oShell.CurrentDirectory = sDocumentsDir
  
  vFilename = Application.GetOpenFilename( _
              FileFilter:="Word文書(*.doc),*.doc", _
              FilterIndex:=1, _
              Title:="Word文書を開く", _
              MultiSelect:=False)
  
  If VarType(vFilename) = vbBoolean Then
    MsgBox "Cancel されました", vbInformation
  Else
    oShell.Run Chr(34) & vFilename & Chr(34), vbMaximizedFocus
  End If

   oShell.CurrentDirectory = sDirBackup
  Set oShell = Nothing

End Sub
    • good
    • 0
この回答へのお礼

KenKen_SPさま
超初心者の私に、貴重なお時間を割いていただき、感謝感激です。研究すればするほど、泥沼のような深みにはまって、その難しさに戸惑った2・3日でしたが、完璧なプログラムを作っていただきもうしわけありません。プロの領域のあなた様の文章を教科書として、これから更に勉強しなければ・・・。ほんとうにありがとうございました。

お礼日時:2008/08/06 20:09

提示したキーワードはご自分でもっと掘り下げて下さいね。


とは言えお困りでしょうから、いくつか例示しておきます。

' // 定番の方法 CreateObeject

Sub Sample1()

  Dim oShell    As Object
  Dim sDocumentsDir As String
  Dim sDirBackup  As String
  Dim vFilename   As Variant ' // String から Variant に変更しました
  Dim wdApp     As Object  ' // Word.Application
  Dim wdDoc     As Object  ' // Word.Document

  ' // MyDocuments パス取得やカレントフォルダを変更するための
  ' // ライブラリを参照する
  Set oShell = CreateObject("WScript.Shell")
  
  ' // MyDocuments フォルダパス取得
  sDocumentsDir = oShell.SpecialFolders("MyDocuments")
  ' // カレントフォルダのパスを保存しておく
  sDirBackup = oShell.CurrentDirectory
  
  ' // Application.GetOpenFilename の初期フォルダ設定のため
  ' // カレントフォルダを MyDocuments に変更する
  oShell.CurrentDirectory = sDocumentsDir
  
  ' // ※ファイル名問い合せ
  vFilename = Application.GetOpenFilename( _
              FileFilter:="Word文書(*.doc),*.doc", _
              FilterIndex:=1, _
              Title:="Word文書を開く", _
              MultiSelect:=False)
  
  ' // ダイアログの結果、取得したファイルを開く
  If VarType(vFilename) = vbBoolean Then
    ' // vFilename がブール値(False)ならキャンセルボタンが押された
    MsgBox "Cancel されました", vbInformation
  Else
    ' // Word を起動する
    Set wdApp = CreateObject("Word.Application")  ' <--- 4-1
    ' // Word を表示する
    wdApp.Visible = True
    ' // Word を最大化する
    wdApp.WindowState = 1 ' // wdWindowStateMaximize
    ' // ※で指定されたファイルを開く
    Set wdDoc = wdApp.Documents.Open(vFilename)  ' <--- 4-2
    ' // Word をアクティブにする
    AppActivate (wdApp.Caption)
  End If

  ' // カレントフォルダを元に戻す
   oShell.CurrentDirectory = sDirBackup
  ' // 後始末
  Set wdDoc = Nothing
  Set wdApp = Nothing
  Set oShell = Nothing

End Sub
    • good
    • 0

#1 です。



追加ヒント、というよりつなぎ合わせていけば完成しますよ。

1. MyDocuments フォルダのパスを取得する。
  PC 環境によりパスが異なるので、WScript.Shell の SpecialFolders で
  取得します。
  
  例)#1 で紹介済みだけど再掲

    Dim oShell As Object
    Dim sDocumentsDir As String
    Set oShell = CreateObject("WScript.Shell")
    sDocumentsDir = oShell.SpecialFolders("MyDocuments")
    
2. カレントフォルダを 1. で取得したパスに設定する
  同じく、WScript.Shell の CurrentDirectory プロパティーで設定できます。

  例)sDocumentsDir は 1. で取得した MyDocuments フォルダパス
    oShell は 1. で参照済み

    oShell.CurrentDirectory = sDocumentsDir

3. Application.GetOpenFilename でファイル名を問い合わせる

4. 3. の結果、キャンセルでなければ、

  4-1) CreateObject で Word を起動
  4-2) 3. で受け取ったファイルを開く
  
  例)sFilename には *.doc のパスが代入されている
  
    Dim wdApp As Object
    Dim wdDoc As Object
    Set wdApp = CreateObject("Word.Application") ' <--- 4-1
    wdApp.Visible = True
    Set wdDoc = wdApp.Documents.Open(sFilename)  ' <--- 4-2

5. 必要であれば、カレントフォルダを元に戻しておく

頑張ってください。では。

この回答への補足

Sub test()
Dim oShell As Object
Dim sDocumentsDir As String
Set oShell = CreateObject("WScript.Shell")
sDocumentsDir = oShell.SpecialFolders("MyDocuments")
oShell.CurrentDirectory = sDocumentsDir
Application.GetOpenFilename 'ダイアログボックスを開く
Dim wdApp As Object
Dim wdDoc As Object
Set wdApp = CreateObject("Word.Application") ' <--- 4-1
wdApp.Visible = True
Set wdDoc = wdApp.Documents.Open(sFilename) ' <--- 4-2

この4-2で型が違いますのエラーが発生します。
選択ファイルを開く
' ファイルを最大化で表示
' Shell(pathname,vbNormalFocus)←ここは赤い字になります。
' カレントフォルダを元に戻す
'  コード不明なのでご教示お願いします。
End Sub

補足日時:2008/08/06 12:46
    • good
    • 0

こんばんは。



> 1)この文書を開いたとき、両方ともマイドキュメントのフォルダに
> 固定したい

' // 参考: MyDocuments フォルダのパスを取得する
Sub Sample1()
  Dim sPath As String
  sPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
  MsgBox sPath
End Sub

ヒントは、Application.GetOpenFilename の前にカレントフォルダを
MyDocuments に変更すれば GetOpenFilename ダイアログの初期ファルダ
も変更されます。

  --> 調べる際のキーワード:
    WSH CurrentDirectory SpecialFolders

> 2)ワード文書を開くと、タスクトレーにあらわれるため、いちいち
> 最大化ボタンをおさなければならない。これを最初から最大化表示
> したい

VBA ヘルプより Shell 関数
Shell(pathname[,windowstyle])

第2引数 windowstyle に、vbNormalFocus などを指定すれば良いだけです。

  --> 質問の前に最低限ヘルプは確認して下さい

> 3)他のPCでも使えるコードにしたい

開くアプリを Shell で指定する方法では、パスが通っている場合を除いて
EXE をフルパスで指定する必要がありますが、この時点で環境依存する
コードになっていますね。この部分は、他の方法に変更する必要があります。

  --> 調べる際のキーワード
    1. CreateObject(または GetObject)を使う
      --> CreateObject("Word.Application")
    2. WSH を使って Windows の関連付けから開く
      --> CreateObject("WScript.Shell").Run
    3. API を使って Windows の関連付けから開く
      --> ShellExecute

などなど。Word がインストールされてないなどという前提からはずれた
ケースは考慮してません。

まず、ご自分でコードを書いてみて、どうしても分からなければサンプル
コードを書きますので、その旨書き込みして下さい。

この回答への補足

もうしわけありません。今の私の実力では・・。ご指摘のキーワードを研究しないと理解できないかと。・・いまから少し研究してみます。

補足日時:2008/08/04 00:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!