Access VBA質問箱 IV

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

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


101 / 500 ページ ←次へ | 前へ→

【11273】Re:コマンドボタンを押下すると、指定ファルダ下...
質問  cocoa  - 09/12/9(水) 10:09 -

引用なし
パスワード
   ▼小僧様 皆様
すいません。
小僧様より戴いたサンプルを実行しました。
Sub test2()
Const strFilePath = "C:\Documents and Settings\UserName\デスクトップ\EventLogAccess\eventlog\20091208.csv"
Dim FNo As Long
Dim txtData As String
Dim arrData As Variant
Dim i As Long

  FNo = FreeFile
  Open strFilePath For Input As #FNo
  
  Line Input #FNo, txtData
 
  i = 2
   Do While Not EOF(FNo)
   
    Line Input #FNo, txtData
  
    arrData = Split(txtData, ",")
  
    If InStr(1, arrData(7), "  ") = 0 Then
      MsgBox i & "行目にスペース4つがありません" _
          & vbCrLf & vbCrLf & "DATA:" & arrData(7)
      GoTo ExitEXE
    End If
    i = i + 1
   Loop

ExitEXE:
  Close #FNo

End Sub

上記プログラムを実行した結果、271行目(最終行)が半角4つ分の空白ではない行ですというエラーになりました。

>それとも271行目でデータは終わっているのに
>Loop を抜けないでエラーが出てしまうのでしょうか。
↑これです。270行目までしかデータはないのです。
が、271行目もみにいってしまっています。
※ちなみに、271行目を削除して実行してみるとエラーはおきませんでした。

>現在どの様なコードで実験を行っているのかが解りませんが、
>少なくともご提示されたコードの中では
>エラールーチンで Rollback している訳ですから
>データが入る事はありえないですよね。
Sub Test()
Dim txtData As String, FNo As Long, arrData, i As Integer
Dim Con As New ADODB.Connection, Rec As New ADODB.Recordset
 
Set Con = CurrentProject.Connection
Rec.Open "INPUTDATA", Con, adOpenDynamic, adLockOptimistic
 
FNo = FreeFile
Open "C:\Documents and Settings\UserName\デスクトップ\EventLogAccess\eventlog\20091208.csv" For Input As #FNo
  'ファイルの1行目の項目名部分を読み込む(何も処理しない)
  Line Input #FNo, txtData

   
    '実際のデータ部分(2行目)からの処理
    Do While Not EOF(FNo)
      Line Input #FNo, txtData
      arrData = Split(txtData, ",")
        Rec.AddNew
          '引用符を削除してからフィールドに値を代入する
          
          Rec("Date") = Split(arrData(2), " ")(0)
          Rec("Time") = Split(arrData(2), " ")(1)
          Rec("ComputerName") = arrData(4)
          Rec("Description1") = Split(arrData(7), "  ")(0)
          Rec("Description2") = Split(arrData(7), "  ")(1)
          
        Rec.Update
    Loop
     
  Close #FNo
   
End Sub
上記プログラムで実験しておりました。
なので、ロールバックはせず、エラー以外のデータが入るようになっておりました。すいません。

【質問内容1.】に関しては解決したのでしょうか?
まだ解決しておりません。質問内容2がきになり、手がつけれていない状態です。
・ツリー全体表示

【11272】Re:コマンドボタンを押下すると、指定ファルダ下...
発言  小僧  - 09/12/8(火) 18:57 -

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

>戴いた、サンプルを実行させてみたところ、271行目に半角4つ分のスペースでは
>ないところを発見しました。
>データが入っていない行なのですが、インポートしようとしているみたいです。
>なので、エラーはでるものの、データのインポート自体は成功しているようです。
>どのようにすれば、データがある部分だけをインポートできるのでしょうか?

ごめんなさい。
仰っている事がさっぱり解らないです。


>データが入っていない行なのですが、インポートしようとしているみたいです。

データが入っていない行、というのはどういう状態なのでしょうか。

1,xxx,100,"1  小僧"[改行]
2,yyy,300,"2  cocoa"[改行]
[改行]
4,zzz,400,"3  Nao"[改行]

の様に、改行コードのみの行が存在しているのでしょうか。

それとも271行目でデータは終わっているのに
Loop を抜けないでエラーが出てしまうのでしょうか。


>> ご提示されたコードの通り実行されているとすると、
>> 1つでもデータにエラーがあった場合は
>> テーブルに書き込まない処理になってますね。

> エラーはでるものの、データのインポート自体は成功しているようです。

>>> ErrHndl:
>>>  Close #FNo
>>>  Con.RollbackTrans
>>>  MsgBox "以下のエラーが発生したためロールバックしました。" & vbCrLf & _
>>>      Err.Description, vbCritical


現在どの様なコードで実験を行っているのかが解りませんが、
少なくともご提示されたコードの中では
エラールーチンで Rollback している訳ですから
データが入る事はありえないですよね。

掲示版でのやりとりですので
正確な情報が解らないと無駄なやりとりの繰り返しになりますよ。


【質問内容1.】に関しては解決したのでしょうか?
cocoa さんと同じ様に困っている方が
Webで検索してこちらの記事を読まれるかもしれません。
解決したのであれば、
どの様にコードを書き直したのかを載せるのが
エチケットだと思いますよ。
・ツリー全体表示

【11271】Re:コマンドボタンを押下すると、指定ファルダ下...
質問  cocoa  - 09/12/8(火) 15:11 -

引用なし
パスワード
   ▼小僧様 皆様
>メモ帳でCSVファイルを開くと半角4つ分の空白ですけど、
>実はTABコードだったり…という事はありませんよね…。
半角4つ分の空白で間違いありません。

戴いた、サンプルを実行させてみたところ、271行目に半角4つ分のスペースでは
ないところを発見しました。
データが入っていない行なのですが、インポートしようとしているみたいです。
なので、エラーはでるものの、データのインポート自体は成功しているようです。
どのようにすれば、データがある部分だけをインポートできるのでしょうか?

宜しくお願い致します。
・ツリー全体表示

【11270】Re:エクスポートの結果を知る方法
発言  TOMONORI E-MAIL  - 09/12/8(火) 11:14 -

引用なし
パスワード
   ▼小僧 さん:
返信ありがとうございます。

YU-TANGさんのサイト、少し見てきました。
とても参考になりますね。お陰でSQLで外部に
アクセスできるようになったのですが、自分のケースだと
現在使用中のDBにアクセスする形になり、"ロックが取得できません"
というような内容のエラーになってしまいました。

たしか、外部からこちらに向けてリンクを張るのはできたと思うので
最悪、リンク->コピー->リンクの解消という方法もあるのですが、
不自然なので他のやり方を探してみます。

YU-TANGさんのサイト等を参考にしながら
もう少しやってみます。
・ツリー全体表示

【11269】Re:エクスポートの結果を知る方法
回答  小僧  - 09/12/8(火) 10:33 -

引用なし
パスワード
   ▼TOMONORI さん、超初心者 さん:
こんにちは。

>SELECT * INTO <DestTable> FROM <SrcTable> IN c:\\tmp.mdb

YU-TANGさんのサイトに参考になりそうな記事がありますので
ご紹介させて頂きます。

YU-TANG's MS-Access Discovery
外部 Jet データベースとの接続方法
h tp://www.f3.dion.ne.jp/~element/msaccess/AcTipsGnrlHowToAttachExternalMdb.html


ただし、select into 句を使うと、
Index(含主キー)が外れてしまうので注意して下さい。
・ツリー全体表示

【11268】Re:エクスポートの結果を知る方法
質問  TOMONORI E-MAIL  - 09/12/8(火) 10:04 -

引用なし
パスワード
   ▼超初心者 さん:
返信ありがとうございます。

うーん、エクスポート先のテーブルの有無を確認するのは
考えたのですが、元からあった場合は勘違いをしてしまうと思うので、
やっていないのですが・・・提示して下さったSQLのFROM 〜 IN <path>
という書き方は知りませんでした。参考になります。

それで、考えたのですが、外部のDBをFROMで参照できるのなら、
ADOXで出力先に接続してそこから出力元に向けてSQLを書くことが
できないでしょうか?自分はこんな風に書いてみたのですが・・・

SELECT * INTO <DestTable> FROM <SrcTable> IN c:\\tmp.mdb

"FROM句の構文エラーです"と怒られてしまいます。
どうしたらよいでしょう?
でも、足がかりができたので自分でも調べてみます。
・ツリー全体表示

【11267】Re:エクスポートの結果を知る方法
発言  超初心者  - 09/12/8(火) 9:20 -

引用なし
パスワード
   ▼TOMONORI さん:
次のクエリにて外部MDBのテーブル一覧を取得できます。

SELECT Name
FROM MSysObjects IN '外部MDBのフルパス.mdb'
WHERE Type=1

存在するかどうかの確認をしてみてはいかがでしょう。
・ツリー全体表示

【11266】エクスポートの結果を知る方法
質問  TOMONORI E-MAIL  - 09/12/7(月) 20:08 -

引用なし
パスワード
   はじめましてTOMONORIといいます。
AccessVBAを始めて一月ほどになります。

やりたいことは、
カレントデータベース内のテーブルを他のデータベースの
テーブルにエクスポートして、その結果(成功したかどうか)を
もらう(調べる)ことです。

今までエクスポートには"DoCmd"を使っていましたが、
戻り値がないためキャンセルされても分かりませんでした。
なので、戻り値のあるエクスポート関数を探していたのですが、
自力では見つけられませんでした。

キャンセルされたら例外を投げてくれるDoCmd.OutputToも
試しましたが、エクスポート先にmdbファイルが選択できないので
断念しました。

何か方法があれば教えて下さい。
(過去ログは"エクスポート"で検索して7,8ページ探しましたが
なかったように思います。もしあった場合は指摘していただけると
助かります)
・ツリー全体表示

【11265】Re:コマンドボタンを押下すると、指定ファルダ下...
回答  小僧  - 09/12/7(月) 17:27 -

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

> データ自体はインポートされております。

ご提示されたコードの通り実行されているとすると、
1つでもデータにエラーがあった場合は
テーブルに書き込まない処理になってますね。

INPUTDATA テーブルを空っぽにしてから
もう一度テストされてみて下さい。


テーブルに書き込みの処理があったり、
ファイルを選ぶ処理があったりすると複雑になるので
下記の様なコードで試されてみて下さい。


Sub test2()
Const strFilePath = "C:\Test.csv"
Dim FNo As Long
Dim txtData As String
Dim arrData As Variant
Dim i As Long

  FNo = FreeFile
  Open strFilePath For Input As #FNo
    
  Line Input #FNo, txtData
  
  i = 2
   Do While Not EOF(FNo)
      
    Line Input #FNo, txtData
    
    arrData = Split(txtData, ",")
    
    If InStr(1, arrData(7), "  ") = 0 Then
      MsgBox i & "行目にスペース4つがありません" _
          & vbCrLf & vbCrLf & "DATA:" & arrData(7)
      GoTo ExitEXE
    End If
    i = i + 1
   Loop

ExitEXE:
  Close #FNo

End Sub


メモ帳でCSVファイルを開くと半角4つ分の空白ですけど、
実はTABコードだったり…という事はありませんよね…。
・ツリー全体表示

【11264】Re:コマンドボタンを押下すると、指定ファルダ下...
質問  cocoa  - 09/12/7(月) 17:11 -

引用なし
パスワード
   ▼小僧様 皆様
連投申し訳ありません。

>と先ほど提示致しましたが、
>半角スペース4個ではないデータがあると
>この様なエラーが発生しますね。
インデックスの有効範囲にありません。というエラーは発生
するのですが、データ自体はインポートされております。
半角スペース4以外のものだけ省かれてインポートされていると
いうことなのでしょうか?
ん〜、全て半角スペース4つなのですが。


質問ばかりで申し訳ありません。
宜しくお願い致します。
・ツリー全体表示

【11263】Re:コマンドボタンを押下すると、指定ファルダ下...
質問  cocoa  - 09/12/7(月) 16:53 -

引用なし
パスワード
   ▼小僧様
お世話になります。

>テーブル上に該当するフィールド名がないと
>このエラーが出る様です。
>
>>>> 例:Description1 Description2
>>>>   0       userName
>
>INPUTDATA テーブルに Description1, Description2 という
>列はありますでしょうか。
作成してみると、エラーはでなくなりました。が、

>> インデックスが有効範囲ではありません。等のエラーが
>> でたりもします。
>
>>> 半角スペースが4個固定の場合はSplit関数を使って
>
>と先ほど提示致しましたが、
>半角スペース4個ではないデータがあると
>この様なエラーが発生しますね。
インデックスが有効範囲エラーとなります。
全て半角4個のデータなのです。

というのも、説明部分は自分でそういうメッセージにしているので、
固定で4個なのです。
もちろん変えることも可能なのですが、どのようにすればいいでしょうか?
・ツリー全体表示

【11262】Re:コマンドボタンを押下すると、指定ファルダ下...
回答  小僧  - 09/12/7(月) 16:42 -

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

> 実行時エラー'3265' 要求された名前または
> 序数に対応する項目がコレクションで見つかりません。

テーブル上に該当するフィールド名がないと
このエラーが出る様です。

>>> 例:Description1 Description2
>>>   0       userName

INPUTDATA テーブルに Description1, Description2 という
列はありますでしょうか。


> インデックスが有効範囲ではありません。等のエラーが
> でたりもします。

>> 半角スペースが4個固定の場合はSplit関数を使って

と先ほど提示致しましたが、
半角スペース4個ではないデータがあると
この様なエラーが発生しますね。
・ツリー全体表示

【11261】Re:コマンドボタンを押下すると、指定ファルダ下...
質問  cocoa  - 09/12/7(月) 16:25 -

引用なし
パスワード
   ▼小僧様 皆様
>> 【質問内容2.】
>> 0____userName
>> 数字とuserNameを分けてインポートできないものでしょうか?
>
>半角スペースが持つ意味によって変わってきます。
>
>半角スペースが4個固定の場合はSplit関数を使って
>
>Rec("Description1") = Split(arrData(7),"____")(0)
>Rec("Description2") = Split(arrData(7),"____")(1)
上記のSplit関数を使用して、上図の_を半角スペースに変換して
実行してもエラーとなってしまいます。

▼エラー内容
実行時エラー'3265' 要求された名前または序数に対応する項目がコレクションで見つかりません。

いろいろ試したのですが、インデックスが有効範囲ではありません。等のエラーが
でたりもします。

宜しくお願い致します。
・ツリー全体表示

【11260】Re:コマンドボタンを押下すると、指定ファルダ下...
回答  Nao  - 09/12/7(月) 15:19 -

引用なし
パスワード
   >【質問内容1.】
>EventQuery(バッチ処理)はアプリケーションログを取得し、csvファイル形式で保存する処理なのですが、ファイルが保存されるまでEventQuery以下のプログラムを待機させておくことはできないでしょうか?
>EventQuery処理が終了すると、走るようにしたいのです。


LogNameにログファイルのフルパス名を入れて、作成されるまで
以下の処理で待たせる。

 Do
  If Nz(Dir(LogName), "") <> "" Then Exit Do
  DoEvents
 Loop


>【質問内容2.】
>フィールド『Description』は説明を取得するフィールドなのですが、
>内容が、0____userName(_は半角スペース)です。
>これをテーブルにインポートする際に数字とuserNameを分けてインポートできないものでしょうか?
>例:Description1 Description2
>  0       userName
>


インポートしてからSplit関数でデータを分離する。
・ツリー全体表示

【11259】Re:コマンドボタンを押下すると、指定ファルダ下...
回答  小僧  - 09/12/7(月) 15:17 -

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


>▼小僧様
回答者を指定すると
他の回答者が答えにくくなってしまいますよ^^;


> 【質問内容1.】
> EventQuery処理が終了すると、走るようにしたいのです。

Shell関数については非同期なので
同期実行させる必要があります。

Accessそのものには外部ファイルの実行完了を
監視する機能は付いていない為、
Windowsに付随する機能などを借りてくる形が良さそうです。

YU-TANG's MS-Access Discovery
DOS コマンドの実行結果を取得する方法
h tp://www.f3.dion.ne.jp/~element/msaccess/AcTipsGetDosResult.html

こちらのサイトの「処理完了を待機する」の辺り紹介されている方法が
ご参考になるかもしれません。


> 【質問内容2.】
> 0____userName
> 数字とuserNameを分けてインポートできないものでしょうか?

半角スペースが持つ意味によって変わってきます。

半角スペースが4個固定の場合はSplit関数を使って

Rec("Description1") = Split(arrData(7),"____")(0)
Rec("Description2") = Split(arrData(7),"____")(1)

の様に分割ができます。

桁数によって半角スペースが減る場合
(userNameが必ず6文字目から始まる場合)には

Rec("Description1") = RTrim(Left(arrData(7),5))
Rec("Description2") = Mid(arrData(7),6)

の様な文字列操作によって分割が可能ですね。

> Access2003を使用しております。
> WizHook.Key

WizHookオブジェクトは非公開オブジェクトの為、
代替が効くのであれば他の方法を取ったほうが無難かと思われます。

Access2003以前のバージョンを使わないのであれば
Office付随の FileDialog オブジェクト等も良いかもしれません。
h tp://msdn.microsoft.com/ja-jp/library/cc326127.aspx
・ツリー全体表示

【11258】Re:コマンドボタンを押下すると、指定ファルダ下...
質問  cocoa  - 09/12/7(月) 14:23 -

引用なし
パスワード
   ▼小僧様
Option Compare Database
Option Explicit

Sub Test()
Dim txtData As String, FNo As Long, arrData, i As Integer
Dim Con As New ADODB.Connection, Rec As New ADODB.Recordset
Dim strFilePath As String, returnValue

  Call EventQuery
 
  '[ファイルを開く]ダイアログボックスを表示
  WizHook.Key = 51488399
  returnValue = WizHook.GetFileName( _
             0, "", "", "", strFilePath, "", _
             "CSVファイル (*.csv)|*.csv", _
             0, 0, 0, True _
             )
  WizHook.Key = 0
   
  '[キャンセル]がクリックされた場合は即終了
  If returnValue <> 0 Then
    Exit Sub
  End If
 
Set Con = CurrentProject.Connection
Rec.Open "INPUTDATA", Con, adOpenDynamic, adLockOptimistic
 
FNo = FreeFile
Open strFilePath For Input As #FNo
  'ファイルの1行目の項目名部分を読み込む(何も処理しない)
  Line Input #FNo, txtData
   
  On Error GoTo ErrHndl
  'エラーが発生した場合にデータのインポートをなかったこと(ロールバック)
  'にするためにトランザクション処理として実行
  Con.BeginTrans
    '実際のデータ部分(2行目)からの処理
    Do While Not EOF(FNo)
      Line Input #FNo, txtData
      arrData = Split(txtData, ",")
        Rec.AddNew
          '引用符を削除してからフィールドに値を代入する
          

          Rec("Date Time") = arrData(2)
          Rec("ComputerName") = arrData(4)
          Rec("Description") = arrData(7)
          
          
        Rec.Update
    Loop
     
  Con.CommitTrans
   
Close #FNo
Exit Sub
 
ErrHndl:
  Close #FNo
  Con.RollbackTrans
  MsgBox "以下のエラーが発生したためロールバックしました。" & vbCrLf & _
      Err.Description, vbCritical
   
End Sub

Function EventQuery()

  Dim objWSH As Object
    Set objWSH = CreateObject("WScript.Shell")
      objWSH.Run """C:\Documents and Settings\UserName\デスクトップ\EventLogAccess\eventlog\event.bat"""
    Set objWSH = Nothing
  
End Function


上記プログラムで質問なのですが、
【質問内容1.】
EventQuery(バッチ処理)はアプリケーションログを取得し、csvファイル形式で保存する処理なのですが、ファイルが保存されるまでEventQuery以下のプログラムを待機させておくことはできないでしょうか?
EventQuery処理が終了すると、走るようにしたいのです。

【質問内容2.】
フィールド『Description』は説明を取得するフィールドなのですが、
内容が、0____userName(_は半角スペース)です。
これをテーブルにインポートする際に数字とuserNameを分けてインポートできないものでしょうか?
例:Description1 Description2
  0       userName

宜しくお願い致します。
・ツリー全体表示

【11257】Re:コマンドボタンを押下すると、指定ファルダ下...
発言  cocoa  - 09/12/7(月) 11:16 -

引用なし
パスワード
   ▼小僧様
ご回答ありがとう御座います。


>まずはご自分でできる所までやってみて
>わからない所をご質問された方が回答が付きやすくなると思いますよ。

自分で考えた結果、わからない箇所を質問しており、小僧様の回答を参考に
調べて行こうと思います。
後、マクロとVBAって違うのですね。同じようなものと認識しておりました。

ファイル名の箇所は小僧様のおっしゃるとおり、記載ミスでございます。
yyyymmdd.txtです。
ご指摘ありがとうございます。
・ツリー全体表示

【11256】Re:コマンドボタンを押下すると、指定ファルダ下...
発言  小僧  - 09/12/4(金) 19:35 -

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

まず、画面上部の

>本サイトの基本方針をまとめました。こちら をご一読ください。

の こちら のリンク先をお読みになって下さい。

> してはいけない質問について

の 丸投げに相当していませんか?


> yyyy/mm/dd.txt

当方の環境(WindowsXP SP3)ですと
ファイル名に「/」を使うとWindowsに怒られてしまいますね。
下の方に

>20091204.txtを探し

とあるので yyyymmdd.txt で良いのでしょうか。


> どのようにマクロを作成すればいいでしょうか?

マクロだけだと難しいと思われます。
こちらの掲示板はAccessVBAの掲示板ですので
VBAを使っての処理なら可能ですね。


> 事前に作成しておいた、INPUTテーブルへインポートしたい

txtファイルの中身にもよるのですが、
例えばCSVファイル(カンマ区切りのデータ形式)であれば
TransferText メソッドで取り込む事が可能です。

既存のテーブルへの取込処理となると
ヘッダー行(列名の行)がついていない場合は
一工夫必要になってきます。


> 指定した日付のデータをインポートしたいのです。

指定したフォルダにファイルが存在するかどうかのチェックは
Dir関数で行う事ができます。

いきなり TransferTextメソッドを使い
エラーの返り値を見てファイルが存在しない事を
判断する事も可能ですね。

まずはご自分でできる所までやってみて
解らない所をご質問された方が回答が付きやすくなると思いますよ。
・ツリー全体表示

【11255】コマンドボタンを押下すると、指定ファルダ下にあ...
質問  cocoa  - 09/12/4(金) 16:13 -

引用なし
パスワード
   初めて質問致します。
Access2003を使用しております。

フォームのコマンドボタン(EventLogAccess)を押下すると、
C:\temp\logにあるyyyy/mm/dd.txtを事前に作成しておいた、
INPUTテーブルへインポートしたいのですが、どのようにマクロ
を作成すればいいでしょうか?

またフォームには、コマンドボタンの他にテキストボックスで
日付を指定できるのですが、指定した日付のデータをインポート
したいのです。

例:2009/12/04
   取込開始←ボタンを押すと、上の日付のデータをC:\temp\log直下から
        該当する20091204.txtを探し、trueであれば、INPUTテーブルへ
        インポートし、falseであれば、指定日付エラーとしたいの
        です。

宜しくお願い致します。
・ツリー全体表示

【11254】美人は何着ても綺麗な件!
回答  黒い月  - 09/12/3(木) 11:49 -

引用なし
パスワード
   昨日綺麗なお姉さんに犯されちまったわwww
お姉さんと仕事帰りにそのままホテルにINw
着くなりスーツ脱がされて、お姉たん自分のスーツのスカートめくりあげて
『オティンティン、バックで突っこんで!!』って!!w
ノーパン+ヌレヌレでスタンバイってどんだけよ!!!
もちろん綺麗な桃尻にぶっかけて20万貰って帰りましたwwwww
tp://prof.world-wife.com/TOP/2u93f2b/
・ツリー全体表示

101 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1082727
(SS)C-BOARD v3.8 is Free