Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


602 / 2272 ツリー ←次へ | 前へ→

【10998】字数(Byte数)制限? よっぴ 09/2/12(木) 13:02 質問[未読]
【10999】訂正:字数(Byte数)制限? よっぴ 09/2/12(木) 14:43 質問[未読]
【11000】Re:訂正:字数(Byte数)制限? 小僧 09/2/12(木) 18:55 回答[未読]
【11001】Re:訂正:字数(Byte数)制限? よっぴ 09/2/13(金) 11:34 お礼[未読]

【10998】字数(Byte数)制限?
質問  よっぴ  - 09/2/12(木) 13:02 -

引用なし
パスワード
    いつもとても勉強にさせて頂いてます。
今回初の投稿になりますが、何卒よろしくお願いいたします。

■状況
(スペック)
WinXP
Access2003
Excel2003

(目的)
複数のExcelファイル(任意指定、複数指定可)のシート(固有名指定)をアクセスにインポートする。

(経過)
1.[GetOpenFileName]を呼び出し、ダイアログからファイルパスを任意・複数取得
2.Excel.Application.WorkBook.Openでエクセルファイルをオープン
3.DAOでAccessTableへ保存
*2.でエクセルの保護をしているため[TransferSpreadSheet]メソッドは使用不可

(問題?困っていること)
1.のダイアログから複数のファイルを選択した場合、なぜか『8188』Byte以上になるとそれ以降が削除されます。

以下記述内容です。*エラー処理は省いてます。


■[GetOpenFileName]の標準モジュール

Public Enum enmGetFileNameView
gfnViewDetail
gfnViewPreview
gfnViewPropewty
gfnViewList
gfnViewLargeIcons
gfnViewSmallIcons
gfnViewTiles = 8
End Enum

Public Enum enmGetFileNameFlags
gfnFlagsoverWritePrompt = &H1
gfnFlagsSetCurDir = &H4
gfnFlagsAllowMultiSelect = &H8
gfnFlagsSelectFolder = &H20
gfnFlagsEnableView = &H40
End Enum

Public Enum enmGetFileNameFOpen
gfnFOpenOpen = -1
gfnFOpenSaveAs = 0
End Enum

Function wh_GetFileName( _
  Optional hwndOner As Long, _
  Optional AppName As String, _
  Optional DlgTitle As String, _
  Optional OpenTitle As String, _
  Optional FILE As String, _
  Optional InitialDir As String, _
  Optional FILTER As String, _
  Optional FilterIndex As Long, _
  Optional View As enmGetFileNameView, _
  Optional flags As enmGetFileNameFlags, _
  Optional fOpen As enmGetFileNameFOpen _
  ) As String

Const ENABLE_WIZHOOK = 51488399
Const DISABLE_WIZHOOK = 0
Dim strFILE As String
Dim lngResult As Long

If (hwndOwner = 0) Then hwndOwner = Application.hWndAccessApp
If (AppName = "") Then AppName = Application.Name
strFILE = FILE
If (FILTER = "") Then FILTER = "すべてのファイル(*.*)|*.*"
WizHook.Key = ENABLE_WIZHOOK

lngResult = WizHook.GetFileName( _
  hwndOwner, _
  AppName, _
  DlgTitle, _
  OpenTitle, _
  strFILE, _
  InitialDir, _
  FILTER, _
  FilterIndex, _
  View, _
  flags, _
  fOpen)

WizHook.Key = DISABLE_WIZHOOK

wh_GetFileName = strFILE
  
End Function


■実行プロシージャ
Sub sample()

'---ファイルの取得処理---
Const DLG_TITLE = "データインポート"
Const FILTER_ = "Excelファイル(*.xls)|*.xls"
Dim INITIAL_DIR As String

INITIAL_DIR = CurrentProject.Path

Dim strFILE As String
strFILE = wh_GetFileName(, , _
  DLG_TITLE, , , INITIAL_DIR, FILTER_, _
   , , gfnFlagsAllowMultiSelect, _
  gfnFOpenOpen)
If strFILE = vbNullString Then
Exit Sub
End If

MsgBox LenB(strFILE) '←ここで問題であろうByte数を調べました。
Debug.Print strFILE '←一応表示もしてみました。

DoCmd.Hourglass True

'---データの保存処理---
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim xls As Excel.Application
Dim wkb As Excel.Workbook
Dim vntList As Variant
Dim CNT As Long
Dim IDX As Long

''---保存先の設定---
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(Name:="T_Test", Type:=dbOpenTable)
Set xls = CreateObject("Excel.Application")

''---ファイル取得情報を区切る---
Dim ret, myFILE
ret = Split(strFILE, vbTab)

For Each myFILE In ret

''---エクセルファイルオープン---
  Set wkb = xls.Workbooks.Open(FileName:=myFILE, ReadOnly:=True _
       , Password:="pass", WriteResPassword:="pass")

  With wkb.Worksheets("Sheet1").Range("A1").CurrentRegion

''---データが1行でない場合---
  If Not (.Rows.Count = 1) Then
  
    Let vntList = .Resize(.Rows.Count - 1).offset(1, 0).Value
  
'''---レコードの保存(選択範囲内ループ)---
    For CNT = LBound(vntList, 1) To UBound(vntList, 1)
      rst.AddNew
    
      For IDX = LBound(vntList, 2) To UBound(vntList, 2)
        Let rst.Fields(IDX - 1).Value = vntList(CNT, IDX)
      Next
    
      rst.Update
    Next
  End If

  End With

Next myFILE

''---解放処理---
wkb.Close SaveChanges:=False
xls.Quit
Set wkb = Nothing
Set xls = Nothing

rst.Close
dbs.Close
Set rst = Nothing
Set dbs = Nothing

DoCmd.Hourglass False

MsgBox "正常にインポートされました。"

End Sub

以上です。

ヘルプを見てみましたが、String型で2.0GB以上の格納が可能とあるので「?」です。
恐れ入りますがよろしくお願いいたします。

【10999】訂正:字数(Byte数)制限?
質問  よっぴ  - 09/2/12(木) 14:43 -

引用なし
パスワード
   すみません。
訂正がございましたので。。。


>1.[GetOpenFileName]を呼び出し、ダイアログからファイルパスを任意・複数取得

→[GetOpenFileName]メソッドではなく、[WizHook]メソッドの[GetFileName]メソッドでした。

>ヘルプを見てみましたが、String型で2.0GB以上の格納が可能とあるので「?」です。

→約2.0GB以内の間違いです。

よろしくお願いいたします。

【11000】Re:訂正:字数(Byte数)制限?
回答  小僧  - 09/2/12(木) 18:55 -

引用なし
パスワード
   ▼よっぴ さん:
こんにちは。

> なぜか『8188』Byte以上になるとそれ以降が削除されます。

こちらでも事象が再現しました。
(WinVista, Access2003)


> (スペック)
> WinXP
> Access2003

上記の環境に依存して良いのであれば、
Office付随の FileDialog オブジェクトを使うのが楽そうですね。

Sub Sample2()
'※要参照 Microsoft Office 11.0 Object Library
Dim objFD As FileDialog
Dim varItem As Variant
Dim buf As Variant
Dim aryFileName As Variant

  Set objFD = Application.FileDialog(msoFileDialogFilePicker)

  With objFD
    .Title = "データインポート"
    .Filters.Clear
    .Filters.Add "Excelファイル(*.xls)", "*.xls"
    .Filters.Add "すべてのファイル", "*.*"
    .FilterIndex = 1
    .InitialView = msoFileDialogViewDetails
    .InitialFileName = CurrentProject.Path
    .AllowMultiSelect = True

    If .Show = -1 Then
      For Each varItem In .SelectedItems
        buf = buf & "," & varItem
      Next varItem
    Else
      Exit Sub
    End If
  End With

  aryFileName = Split(Mid(buf, 2), ",")

  Set objFD = Nothing

End Sub


8188 という数値が 2047 * 4 であり
何かの制限に引っかかってそうだと思われますが、
WizHook に関しては非公開なクラスの為
Microfost のサイトを見てもヘルプや技術情報がありません。

WizHook を使わなければいけない理由が特にないのでしたら
他方法を使う事をおすすめします。

Ac2000 が混在環境で存在してしまうのであれば
API関数 の GetOpenFileNameA あたりをWeb検索されてみて下さい。

【11001】Re:訂正:字数(Byte数)制限?
お礼  よっぴ  - 09/2/13(金) 11:34 -

引用なし
パスワード
   ▼小僧 さん:
いつも大変参考にさせて頂いております。
まずは返信いただきありがとうございました。

>こちらでも事象が再現しました。
>(WinVista, Access2003)
やはりそうなのですね。

>> (スペック)
>> WinXP
>> Access2003
>
>上記の環境に依存して良いのであれば、
>Office付随の FileDialog オブジェクトを使うのが楽そうですね。
同環境ならそうなんですよね。
コードまで教えて頂いてありがとうございますです。

>8188 という数値が 2047 * 4 であり
>何かの制限に引っかかってそうだと思われますが、
>WizHook に関しては非公開なクラスの為
>Microfost のサイトを見てもヘルプや技術情報がありません。
そうなんですよね。

>WizHook を使わなければいけない理由が特にないのでしたら
>他方法を使う事をおすすめします。
>
>Ac2000 が混在環境で存在してしまうのであれば
>API関数 の GetOpenFileNameA あたりをWeb検索されてみて下さい。
やはりAPIですか。
過去使用したことがなくもないのですが、構造体とか色々勉強したりしましたが、まだまったく自分のものになっていないので避けてました。。。
コード自体は調べればいくらでも出てくるのでしょうが勉強してトライしてみます。
ありがとうございましたm(_ _)m

602 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078197
(SS)C-BOARD v3.8 is Free