Access VBA質問箱 IV

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

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


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

【7515】一旦アクセスに取り込んだ写真のエクスポート o 06/3/15(水) 11:00 質問[未読]
【7524】Re:一旦アクセスに取り込んだ写真のエクスポ... Gin_II 06/3/15(水) 23:10 回答[未読]
【7531】Re:一旦アクセスに取り込んだ写真のエクスポ... o 06/3/16(木) 11:24 発言[未読]
【7532】Re:一旦アクセスに取り込んだ写真のエクスポ... o 06/3/16(木) 13:40 回答[未読]
【7534】Re:一旦アクセスに取り込んだ写真のエクスポ... たん 06/3/16(木) 14:43 発言[未読]
【7535】Re:一旦アクセスに取り込んだ写真のエクスポ... o 06/3/16(木) 14:59 回答[未読]
【7536】Re:一旦アクセスに取り込んだ写真のエクスポ... たん 06/3/16(木) 15:23 回答[未読]
【7537】Re:一旦アクセスに取り込んだ写真のエクスポ... o 06/3/16(木) 15:27 回答[未読]
【7538】Re:一旦アクセスに取り込んだ写真のエクスポ... YU-TANG 06/3/16(木) 15:37 発言[未読]
【7540】Re:一旦アクセスに取り込んだ写真のエクスポ... o 06/3/16(木) 15:56 お礼[未読]
【7542】Re:一旦アクセスに取り込んだ写真のエクスポ... YU-TANG 06/3/16(木) 16:15 発言[未読]
【7539】Re:一旦アクセスに取り込んだ写真のエクスポ... o 06/3/16(木) 15:54 発言[未読]
【7541】Re:案 たん 06/3/16(木) 16:14 発言[未読]
【7543】Re:案 YU-TANG 06/3/16(木) 16:20 発言[未読]
【7544】Re:(^^;) たん 06/3/16(木) 16:22 発言[未読]
【7545】Re:(^^;) たん 06/3/16(木) 16:25 発言[未読]

【7515】一旦アクセスに取り込んだ写真のエクスポ...
質問  o  - 06/3/15(水) 11:00 -

引用なし
パスワード
   こんにちは。

一旦、アクセスに取り込んだ写真をファイルとして

保存したいのですが、可能でしょうか?

できればファイル名も指定しながらエクスポート(?)したいのですが。

環境
access2002
sqlserver2000

【7524】Re:一旦アクセスに取り込んだ写真のエクス...
回答  Gin_II  - 06/3/15(水) 23:10 -

引用なし
パスワード
   > アクセスに取り込んだ写真を

写真といっても、形式がいろいろありますが、元の画像のファイル形式は?

"DWriteChunk 関数"
http://x7net.com/~access/AcResTipsWarehouse2.html#DWriteChunkFunction

こちらが参考になると思います。

【7531】Re:一旦アクセスに取り込んだ写真のエクス...
発言  o  - 06/3/16(木) 11:24 -

引用なし
パスワード
   申し訳ありません。

取込の形式はjpgで取り込んでおります。

尚、お教え頂いたHPは非常に参考になりました。

jpgでできるかはわかりませんが現在、試しているところです。

また、結果がわかりしだいご報告致します。

【7532】Re:一旦アクセスに取り込んだ写真のエクス...
回答  o  - 06/3/16(木) 13:40 -

引用なし
パスワード
   すいません。

教えて頂いたHPどおりに以下のプログラムで
実行したのですが途中でエラーになります。


Private Sub コマンド25_Click()
On Error GoTo Err_コマンド25_Click


  Screen.PreviousControl.SetFocus
  DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70

Exit_コマンド25_Click:
  Exit Sub

Err_コマンド25_Click:
  MsgBox Err.Description
  Resume Exit_コマンド25_Click
  
End Sub

' 指定されたレコードの OLE オブジェクト型またはメモ型フィールドの
' 内容をファイルに書き出します。
' 成功すると空文字列を、失敗するとエラーメッセージを返します。
' 引数は、DLookup 関数などの Domain 系定義域集計関数と、GetChunk
' メソッドの引数に準じます。
' ただし引数 offset 省略時にはデータの先頭から、引数 numbytes
' 省略時にはデータ長すべてが対象になります。
' DAO ライブラリへの参照設定が必須です。
Function DWriteChunk(fieldname As String, _
    tablename As String, _
    filename As String, _
    Optional criteria As String, _
    Optional ByVal offset As Long, _
    Optional ByVal numbytes As Long) As String
On Error GoTo ErrorHandler
  ' 定数/変数宣言部
  Const ERR_INVARID_DATA_TYPE = 3259
  Dim rs     As DAO.Recordset
  Dim strSQL   As String
  Dim varChunk  As Variant
  Dim abytChunk() As Byte
  Dim FileNo   As Integer
  ' 変数を初期化します。
  FileNo = FreeFile
  strSQL = "Select " & fieldname & " From " & tablename
  If (LenB(criteria) <> 0) Then strSQL = strSQL & " Where " & criteria
  strSQL = strSQL & ";"
  ' ファイルとレコードセットを開きます。
  Open filename For Binary As #FileNo
☆☆エラー箇所  Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  ' データ型をチェックします。
  Select Case rs(0).Type
    Case dbLongBinary, dbMemo
      ' OK
    Case Else
      Err.Raise ERR_INVARID_DATA_TYPE
    End Select
  ' データをファイルに書き込みます。
  With rs
    If (numbytes = 0) Then numbytes = .Fields(fieldname).FieldSize
    varChunk = .Fields(fieldname).GetChunk(offset, numbytes)
    abytChunk = varChunk
    Put #FileNo, , abytChunk
  End With
  
ExitProcedure:
On Error Resume Next
  Close #FileNo
  rs.Close: Set rs = Nothing
  Exit Function

ErrorHandler:
  DWriteChunk = Err.Number & ":" & vbCrLf & Err.Description
  Resume ExitProcedure
End Function

Private Sub コマンド26_Click()
  Const BMP_OFFSET = 87
  Dim strResp As String
  strResp = DWriteChunk( _
    "写真", _
    "T_購入_写真", _
    "C:\" & "テスト.bmp", _
    "[管理No.]=0000000001-001", _
    BMP_OFFSET)
  If (LenB(strResp) = 0) Then strResp = "完了"
  MsgBox strResp
End Sub

エラー番号は91で「オブジェクト変数またはWithブロック変数が
設定されていません」とでます。

これはなぜでしょうか?

最初はSQLServerにDAOで接続することができないのかと
思いましたが調べるとそうではないようでした。

【7534】Re:一旦アクセスに取り込んだ写真のエクス...
発言  たん  - 06/3/16(木) 14:43 -

引用なし
パスワード
   横から失礼。

>エラー番号は91で「オブジェクト変数またはWithブロック変数が
>設定されていません」とでます。

「なぜでしょう」と聞かれても、エラーの出た場所を知っているのは
質問者だけです。

ON ERROR等でエラー無視させているなら、エラー無視を外すべきでしょう。

また、フィールド名等、名前付け規則にも違反しています。

# ロジックが正常動作するまでは、ON ERRORは外すのが鉄則です。

【7535】Re:一旦アクセスに取り込んだ写真のエクス...
回答  o  - 06/3/16(木) 14:59 -

引用なし
パスワード
   ▼たん さん:

>>エラー番号は91で「オブジェクト変数またはWithブロック変数が
>>設定されていません」とでます。
>
>「なぜでしょう」と聞かれても、エラーの出た場所を知っているのは
>質問者だけです。

ですのでエラーの場所はプログラム内に記入しておりますので

読んでください。

【7536】Re:一旦アクセスに取り込んだ写真のエクス...
回答  たん  - 06/3/16(木) 15:23 -

引用なし
パスワード
   >ですのでエラーの場所はプログラム内に記入しておりますので
>読んでください。

ちょっと、わかりにくい。
(まあ、細かく見てなかったこっちも悪いのですが。)

DAOで処理しているなら、DAOの参照設定をしていますか?。

【7537】Re:一旦アクセスに取り込んだ写真のエクス...
回答  o  - 06/3/16(木) 15:27 -

引用なし
パスワード
   ▼たん さん:
>>ですのでエラーの場所はプログラム内に記入しておりますので
>>読んでください。
>
>ちょっと、わかりにくい。
>(まあ、細かく見てなかったこっちも悪いのですが。)
>
>DAOで処理しているなら、DAOの参照設定をしていますか?。

いえ、こちらこそ申し訳ないです。

見やすく☆にしたつもりなのですが・・・。

やはり掲示板などは会って話すより表現が難しいですね。

ちなみにDAOの参照設定はしております。

【7538】Re:一旦アクセスに取り込んだ写真のエクス...
発言  YU-TANG WEB  - 06/3/16(木) 15:37 -

引用なし
パスワード
   こんにちは、YU-TANG です。

エラー以前の話として、BMP はともかく GIF や JPEG の復元はほぼ不可能
です。
私の記事でも例は BMP に限定しています。

ただ例外的に、OLE オブジェクトではなくファイルそのものを格納している
場合は、そのまま書き出せば復元されます。
まず、現状どちらの形式で格納されているのか明らかにしてください。
OLE オブジェクトであれば、試すだけ無駄ですので。

# 昔のコードは見たくないね。戻り値が空文字列って、我ながらどういう
# 仕様だろ。

【7539】Re:一旦アクセスに取り込んだ写真のエクス...
発言  o  - 06/3/16(木) 15:54 -

引用なし
パスワード
   こんにちは。

何度も申し訳ないです。

先ほどのエラーは以下の追加箇所と変更箇所(**で囲ってあります)で

解決しました。

ただ、実行してもエラーは出ないのですがファイルサイズはいつまでたっても

0のままで砂時計になります。

やはり元の形式(アクセスに取り込むファイル)がjpegで

このプログラムはbmp形式だからでしょうか。

とりあえず途中報告です。

データが重いだけかもしれませんのでもう少し様子を見ます。


Function DWriteChunk(fieldname As String, _
    tablename As String, _
    filename As String, _
    Optional criteria As String, _
    Optional ByVal offset As Long, _
    Optional ByVal numbytes As Long) As String
On Error GoTo ErrorHandler
  ' 定数/変数宣言部
  Const ERR_INVARID_DATA_TYPE = 3259
  Dim rs     As DAO.Recordset
  Dim strSQL   As String
  Dim varChunk  As Variant
  Dim abytChunk() As Byte
  Dim FileNo   As Integer
  Dim strConnect As String
  Dim db As DAO.Database

***********************************************************
*****************追記箇所**********************************
***********************************************************
  
  '-- ODBC 接続文字列の指定
  strConnect = "ODBC;Driver={SQL Server};Server=sgw9920sv4;" & _
         "Database=資産管理SQL;UID=hoken;PWD=hoken;"
  
  '-- 接続文字列を使用して SQL Server に接続する
  Set db = DBEngine.OpenDatabase("", False, False, strConnect)
  
***********************************************************
*****************追記箇所終了******************************
***********************************************************
  
  ' 変数を初期化します。
  FileNo = FreeFile
  strSQL = "Select " & fieldname & " From " & tablename
  If (LenB(criteria) <> 0) Then strSQL = strSQL & " Where " & criteria
  strSQL = strSQL & ";"
  ' ファイルとレコードセットを開きます。
  Open filename For Binary As #FileNo

***********************************************************
*****************変更箇所**********************************
***********************************************************

'  Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

***********************************************************
*****************追記箇所終了******************************
***********************************************************

  ' データ型をチェックします。
  Select Case rs(0).Type
    Case dbLongBinary, dbMemo
      ' OK
    Case Else
      Err.Raise ERR_INVARID_DATA_TYPE
    End Select
  ' データをファイルに書き込みます。
  With rs
    If (numbytes = 0) Then numbytes = .Fields(fieldname).FieldSize
    varChunk = .Fields(fieldname).GetChunk(offset, numbytes)
    abytChunk = varChunk
    Put #FileNo, , abytChunk
  End With
  
ExitProcedure:
On Error Resume Next
  Close #FileNo
  rs.Close: Set rs = Nothing
  Exit Function

ErrorHandler:
  DWriteChunk = Err.Number & ":" & vbCrLf & Err.Description
  Resume ExitProcedure
End Function

Private Sub コマンド26_Click()
  Const BMP_OFFSET = 87
  Dim strResp As String
  strResp = DWriteChunk( _
    "写真", _
    "T_購入_写真", _
    "C:\" & "テスト.bmp", _
    "[管理No.]=0000000001-001", _
    BMP_OFFSET)
  If (LenB(strResp) = 0) Then strResp = "完了"
  MsgBox strResp
End Sub

【7540】Re:一旦アクセスに取り込んだ写真のエクス...
お礼  o  - 06/3/16(木) 15:56 -

引用なし
パスワード
   >エラー以前の話として、BMP はともかく GIF や JPEG の復元はほぼ不可能
>です。
>私の記事でも例は BMP に限定しています。
>
>ただ例外的に、OLE オブジェクトではなくファイルそのものを格納している
>場合は、そのまま書き出せば復元されます。
>まず、現状どちらの形式で格納されているのか明らかにしてください。
>OLE オブジェクトであれば、試すだけ無駄ですので。

OLEオブジェクトです。

やはり無理なのですね・・・。

わかりました。

ありがとうございました。

【7541】Re:案
発言  たん  - 06/3/16(木) 16:14 -

引用なし
パスワード
   YU-TANGさんの明快な回答が出たので、別な案をば。

手動でよければ、

1.OLEオブジェクトを含むフォームを作成。
2.1のフォームを開く。
3.画像が表示されていれば、OLEコントロール上で右クリックで
 編集で、その画像データを表示させるソフトを開いて、ファイルとして
 保存しなおす。
4.次レコードに移動し、1〜3を繰り返す。

# イメージコントロールだったら、mougで過去に話題がありました。そういえば。
# 個人的にはファイル残していますが、
# 「イメージコントロールから、画像ファイルへ出力する方法は」という題ですね。
# ネットでどっかにキャッシュとして残っていればラッキーかな。
# (1年以上前のシロモノなので。)

【7542】Re:一旦アクセスに取り込んだ写真のエクス...
発言  YU-TANG WEB  - 06/3/16(木) 16:15 -

引用なし
パスワード
   こんにちは、YU-TANG です。

▼o さん:
>OLEオブジェクトです。
>
>やはり無理なのですね・・・。

もし時間が有れば、一度格納されているバイナリデータをダンプして、
解析してみるといいです。
通常 GIF や JPEG は EMF に変換され、これに OLE ヘッダーが付いた形で
格納されているはずです(私の経験則的には、ですが)。
OLE ヘッダー構造体の仕様は OLE サーバーごとに異なっていて、原則
非公開ですが、EMF のフォーマットの方は公開されているので、差分を
探せば OLE ヘッダーを取り除く方法を編み出せるかもしれません。
OLE ヘッダーさえ取り除ければ、EMF ファイルとしてであれば復元できる
ので、そこから別の画像形式へ変換することも可能になるでしょう。

私が知る限り、この方法を公開した人はまだ誰もいないはずです。

私は何年も前からヒマになったらダンプして解析しようと思っているの
ですが、幸か不幸かそこまでの時間が取れなくてやっていません。
相当大変な作業になる可能性が高いですが、誰かがやってくれたら有り難い
話ではあるので、もし意欲があればぜひチャレンジしてみてください。

それでは。

【7543】Re:案
発言  YU-TANG WEB  - 06/3/16(木) 16:20 -

引用なし
パスワード
   ども。

▼たん さん:
># イメージコントロールだったら、mougで過去に話題がありました。そういえば。
># 個人的にはファイル残していますが、
># 「イメージコントロールから、画像ファイルへ出力する方法は」という題ですね。
># ネットでどっかにキャッシュとして残っていればラッキーかな。
># (1年以上前のシロモノなので。)

2 年半ほど前のシロモノで良かったら、ここにもあったりして。

http://x7net.com/~access/AcTipsUnDocumentedSysCmd.html#712

それでは。

【7544】Re:(^^;)
発言  たん  - 06/3/16(木) 16:22 -

引用なし
パスワード
   ># イメージコントロールだったら、mougで過去に話題がありました。そういえば。
># 個人的にはファイル残していますが、
># 「イメージコントロールから、画像ファイルへ出力する方法は」という題ですね。

あ、でも、イメージコントロールだと、埋め込まれた時点で、WMF形式に変換されている
ので、厳密には、「ファイル形式のまま」ではないのか。残念。

という事でイメージコントロールの話は忘れて下さい。

【7545】Re:(^^;)
発言  たん  - 06/3/16(木) 16:25 -

引用なし
パスワード
   WMF→EMF

# 打ち間違い(^^;)

さすが、知識の宝庫ですね>YU-TANGさん

# 毎度のことながら感心します。

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