ファイルやフォルダーを選択したいとき


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
vol163

これならわかるマイクロソフトアクセス活用法
            -->ファイルやフォルダーを選択したいとき
              
発行者:高内 章治 2012年6月20日
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┏ 今日の内容 ━━━━━━━━━━━━━━━━━━━━━━━━┓

┃【01 - ご挨拶    】
┃【02 - トピックス  】ファイルやフォルダーを選択したいとき

┃【03 - 編集後記    】

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

─────────────────────────────────
【01 - ご挨拶    】          
─────────────────────────────────

こんにちは、高内(こうない)です。

今回は、

「ファイルやフォルダーを選択したいとき」

についてお話したいと思います。




─────────────────────────────────

【02 - トピックス】: ファイルやフォルダーを選択したいとき

─────────────────────────────────

お客様から質問がありました。

データをエクセルなどへエクスポートするときに、フォルダーを選択したいそうです。
インポートするときも、フォルダーでファイルを選択したい場合があります。

エクセルやワードでは、「ファイル」「開く」や、「ファイルの名前を付けて保存」などをクリックすると、ダイアログが表示されます。
そして、フォルダーやファイルを選択することができます。

アクセスでも、やりたいですね。

でも、これは、アクセスだけでは、できません。

以前、お話した、APIを使う必要があります。
Windowsが持っている機能です。

グーグルで、APIで検索するといろいろな参考のホームページが出てきます。

今回は少し長くなりますが、説明します。

■1.まず、モジュールを開いて以下のAPIのプログラムを貼り付けます。

************この下から*********

'----- OPEN FILE
Option Explicit 'すべての変数の宣言を強制
Option Compare Database 'データベースで使用する並べ替え順序で文字列を比較

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _
"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

'[ファイルを特定]ダイアログ フィルタに使用するフィルタ文字列。
'これを開くには、ACC_CreateFilterString()を使用。既定値はすべてのファイ
ル,*.*
Type ACC_OpnFileNM

strFilter As String '表示するフィルタの初期値、既定値は 1
'ダイアログに表示される初期ディレクトリ名。既定値はカレントディレクトリ
lngFilterIdx As Long
strInitialDir As String 'ダイアログに表示される初期ファイル名、既定値は、""
strInitialFile As String 'ダイアログに表示されるタイトル名、既定値は、""
'拡張子が指定されなかった場合にファイルに追加する既定の拡張子。既定値は
システム値
strDialogTitle As String
strDefaultExtension As String 'フラグ、既定値は、フラグなし
'選択されたファイルのフルパス。
'ダイアログでユーザーが拡張子のないファイルを選択すると、
'[ファイル名]ボックスのテキストだけが返される
lngFlags As Long
strFullPathReturn As String '選択されたファイルの名前
strFileNameReturn As String 'フルパスのファイル名の開始を示すオフセット
intFileOffset As Integer 'フルパスのファイルの拡張子の開始を示すオフセット
intFileExtension As Integer

End Type


Type OPENFILENAME

lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As Long
nMaxCustrFilter As Long
nFilterIdx As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustrData As Long
lpfnHook As Long
lpTemplateName As Long

End Type

Const AllFile = "すべてのファイル"
Const OFN_HIDEREADONLY = &H4


Function GetFile(strSearchPath) As String

'[ファイルを特定]ダイアログ ボックスを表示。
'戻り値は、選択したファイルへのパス。

Dim accof As ACC_OpnFileNM

'ダイアログ ボックスのオプションを設定
accof.strDialogTitle = "取り込むテキストデータの選択"
'accof.strInitialDir = strSearchPath
'accof.strInitialDir = "C:¥SK_DATA"
accof.strInitialDir = T_IN_FOLDER


'以下の設定で、拡張子の増減や選択ができます。
'エクセルなら .xls を、ワードなら .doc を記述します。
'accof.strFilter = ACC_CreateFilterString("jpgファイル(*.jpg)", _
' "*.jpg", "gifファイル(*.gif)", _
' "*.gif", "bmpファイル(*.bmp)", "*.bmp", "すべてのファイル(*.*)", "*.*")

accof.strFilter = ACC_CreateFilterString("txtファイル(*.txt)", "*.txt", _
"すべてのファイル(*.*)", "*.*")


ACC_GetOpenFileName accof '[ファイルを特定] ダイアログボックスのルーチン
を呼び出す

GetFile = Trim(accof.strFullPathReturn) 'パスとファイル名を返す

End Function


Function ACC_CreateFilterString(ParamArray varFilt() As Variant) As String

'渡された引数からフィルタ文字列を作成。
'引数として何も渡されなかった場合は、長さ 0 の文字列 ("") を返す。
'引数が奇数個渡された場合、それに *.* を追加

Dim strFilter As String
Dim intRet As Integer
Dim intNum As Integer

intNum = UBound(varFilt)
If (intNum <> -1) Then

For intRet = 0 To intNum
strFilter = strFilter & varFilt(intRet) & vbNullChar
Next

If intNum Mod 2 = 0 Then
strFilter = strFilter & "*.*" & vbNullChar
End If

strFilter = strFilter & vbNullChar
Else
strFilter = ""
End If

ACC_CreateFilterString = strFilter

End Function


Function ACC_GetOpenFileName(accof As ACC_OpnFileNM) As Integer

'「ファイルを特定」ダイアログ ボックスを開く

Dim of As OPENFILENAME
Dim intRet As Integer

Accof_to_Of accof, of
intRet = GetOpenFileName(of)

If intRet Then
Of_to_Accof of, accof
End If

ACC_GetOpenFileName = intRet

End Function


Sub Of_to_Accof(of As OPENFILENAME, accof As ACC_OpnFileNM)

'このプロシージャは、win32構造体をACC_OpnFileNM構造体に変換する

accof.strFullPathReturn = Left(of.lpstrFile, InStr(of.lpstrFile,
vbNullChar) - 1)
accof.strFileNameReturn = of.lpstrFileTitle
accof.intFileOffset = of.nFileOffset
accof.intFileExtension = of.nFileExtension

End Sub


Sub Accof_to_Of(accof As ACC_OpnFileNM, of As OPENFILENAME)

'このプロシージャは、ACC_OpnFileNM構造体をwin32構造体に変換する

Dim strFile As String * 512

'構造体の一部を初期化
of.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
of.lCustrData = 0

If accof.strFilter = "" Then
of.lpstrFilter = ACC_CreateFilterString(AllFile)
Else
of.lpstrFilter = accof.strFilter
End If

of.nFilterIdx = accof.lngFilterIdx

of.lpstrFile = accof.strInitialFile & String(512 -
Len(accof.strInitialFile), 0)
of.nMaxFile = 511

of.lpstrFileTitle = String(512, 0)
of.nMaxFileTitle = 511

of.lpstrTitle = accof.strDialogTitle

of.lpstrInitialDir = accof.strInitialDir

of.lpstrDefExt = accof.strDefaultExtension

of.Flags = accof.lngFlags

of.lStructSize = Len(of)

End Sub

******この上までコピーします。****

■2.モジュールは保存します。名前はなんでもよいです。

■3.必要であれば、上の中のデータを修正します。

変更する場所です。

accof.strDialogTitle = "取り込むテキストデータの選択"
ダイアログボックスのタイトルです。

'accof.strInitialDir = strSearchPath

'accof.strInitialDir = "C:¥SK_DATA"
止めていますが最初に開くフォルダーを指定できます。

accof.strInitialDir = T_IN_FOLDER


'以下の設定で、拡張子の増減や選択ができます。
'エクセルなら .xls を、ワードなら .doc を記述します。
'accof.strFilter = ACC_CreateFilterString("jpgファイル(*.jpg)", _
' "*.jpg", "gifファイル(*.gif)", _
' "*.gif", "bmpファイル(*.bmp)", "*.bmp", "すべてのファイル(*.*)", "*.*")

accof.strFilter = ACC_CreateFilterString("txtファイル(*.txt)", "*.txt", _
"すべてのファイル(*.*)", "*.*")

ファイルの種類に出てくる拡張子です。
上は、txtにしています。
エクセルにもできます。


■ 4.VBAを書きます。

例えば、ボタンのクリック時に

data= GetFile("")

にすると、ファイルが開くダイアログが表示されます。
例えば、aaaを入れて「開く」をクリックすると
上のdataの中に、そのフォルダー名をファイル名が入ります。

これを

DoCmd.TransferSpreadsheet
DoCmd.OutputTo acQuery


などでエクスポートできます。

インポートは

DoCmd.TransferText acImportFixed

などを使用します。

多分動くと思います。
やってみると意外と簡単です。
なかなかよいと思います。

参考にしてください。



─────────────────────────────────
【03 - 編集後記    】       
─────────────────────────────────

民主党で、修正合意が了承されました。

先日、自民党や公明党と合意がありました。

消費税の増税の法案が通過するのでしょうかね。

消費税の増税もわかりますが、もっとやることがあると思いますが。

景気が落ちなければよいですが。


◆私がアクセスをマスターできたのは!!
http://www.sk-access.com/kyozai/zaiko1.html  

テーブル作成からVBAまでマスターできます。 
「在庫管理システムをアクセスで作ってみよう」教材です。
http://www.sk-access.com/kyozai/zaiko2.html  


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●ご意見・ご感想・ご質問
 
『メルマガでもっとお役にたてる情報を配信したいと思いますので、日ごろから疑問に思っていることを教えてください。
宛先はこちらへです』

  •  kohnai★vega.ocn.ne.jp
      (高内:こうない:)
    (メールするときは、★を@に変えてください)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


◎「これならわかるマイクロソフトアクセス活用法」 のバックナンバー・配信停止はこちら

archive.mag2.com/0000222659/index.html

◎以下のホームページからでもバックナンバーを見ることができます。

http://www.sk-access.com/mailmaga/index.html

登録・解除につきましてはご自身でお願いいたします。

※このメールマガジンの転送はOKですが、掲載された記事の内容を許可無く転載することをを禁止させて頂きます。
必ず事前にご相談ください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


1週間でアクセス(Access)のシステム開発ができる〜
「在庫管理システムをアクセスで作ってみよう」教材

「アクセスのプログラム/システムを短期間で開発したい方」、
「アクセスのフォーム/VBAを完全にマスターしたい方」のための
アクセス(Access)を使って1週間でシステム開発する究極の方法とは?

「アクセス(Access)のシステムを無料のSQL Server 2016 Expressへ
移行してみよう」教材

あなたの会社のアクセス(Access)のデータベースやシステムに不安を感じていませんか?
アクセスのデータ量が多くなり処理スピードが遅くなった。
アクセスのデータを共有したい。
セキュリティに不安がある。などと、感じている方は!!
(SQL Server 2016 Expressバージョンです。)


「アクセス(Access)プログラムの仕様書の作り方」教材
マイクロソフトアクセスを使用して、プログラムの作成/システム開発をおこないたい方の為に、
アクセス(Access)のプログラム開発に成功するために絶対に必要な「仕様書」とは?



[↑一番上へ]
[マイクロソフトアクセス活用法(メールマガジン)(ホームへ)]
11:422301

アクセス全体

VBA

SQL Server