• 締切済み

CSVファイルを開いている状態での書込処理について

OS:windows2000pro VB:VB6.0sp5 ファイル:c:\work\test0411.csv (workフォルダはEveryone共有:端末Aのみ) 端末:ABともにファイル共有を除き同環境 端末Aにて、システム(VBにて作成:下記参照)にて 上記ファイル(test0411.csv)に一定周期で書込を行っています Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" End Sub 端末Bにて、エクスプローラから上記ファイル(test0411.csv)を 開いて閲覧しています 上記ファイル(test0411.csv)を閲覧している間に (1)一定周期でデータの書込ができません 一旦ファイルを閉じ、再度開いた折、 閲覧していた間のデータが追加更新するように したいのですが、どのようにすれば良いのでしょうか? よろしくお願いいたします

みんなの回答

  • i-touch
  • ベストアンサー率40% (170/415)
回答No.2

私だったら、閲覧用のファイルを別にFilecopyなどで準備するか(それでもコピー先ファイルを開かれていたらエラーになりますが)、または、閲覧時に、元のファイルをバッチファイルなどでローカルにコピーさせて、それを開かせるようにします。 では

全文を見る
すると、全ての回答が全文表示されます。
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

それは「Bで開いている間にAで書き込むのがエラーになっても良いので、最終的に整合性が取れれば良い」という解釈でよいのかな? とりあえず今までの流れを修正するとすれば、キューやコレクションを用意すれば簡単に実現できそうだ。キューで行う方法を考えてみたので参考になれば。 用意するもの 1.CSVのデータ1行を表すクラス(CsvQueueクラスとする)  メンバー変数は、その1行のデータとCsvQueueクラスへのポインタ。データは面倒ならPublicでよいだろう。  メンバー関数は、PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue Public Function PutData(ByVal q As CsvQueue) As Boolean  If queNextData Is Nothing Then   Set queNextData = q   Exit Function  End If  PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData  GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) ++ Private csvRoot As CsvData ' Nothingに初期化しておくべし Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle ++ Do Until csvRoot Is Nothing ++  (中略と同じような内容) ++  csvRoot = csvRoot.GetData() ++ Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" ++ Dim csvTemp As New CsvData ++ csvTemp.strCsvData1 = ... ++ If csvRoot Is Nothing Then ++  Set csvRoot = csvTemp ++ Else ++  csvRoot.PutData(csvTemp) ++ End If End Sub 今机上で作ったものなので間違いがあるかも。まぁ考え方としてはこんなのはどうかな。

nao0
質問者

お礼

早速のご回答ありがとうございます また、丁寧にご教示頂戴し大変恐縮いたしております 早速試させていただきます また、不明な点が出てくるかと存じます 多分、明日(4/13)午後以降になるかと存じますので その折にはまたご教示いただければ幸いです よろしくお願いいたします

nao0
質問者

補足

早速ではございますが、 ご教示いただきました内容にて実行いたしますと Public Function PutData(ByVal q As CsvQueue) As Boolean の個所にて、 エラー「ユーザー定義型は定義されていません」 が発生いたします  よろしくお願いいたします

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル2007で既に開かれているCSVファイル

    のセルA1に特定の文字が入力されているファイルに対してマクロを実行したいのです。 会社のイントラネットから各種データを開くと(ダウンロードではありません。)以下のファイル名になります。 list.csv , list(1).csv , list(2).csv , list(4).csv , … , list(n).csv ←list(3).csvは不要だったので閉じられている例です。 マクロ実行前に、例えば list.csv と list(4) のセルA1に特定の文字が入力されている場合は、どちらかを選択するか、処理を中止する。(希望は前者ですが。。。) 対象のCSVファイルが無ければ(CSVファイルが開かれていない、または、A1が不一致)メッセージを出力する。 Sub Sample() Dim myChkBook As Workbook Dim i As Integer On Error GoTo Err0 Set myChkBook = Workbooks("List.csv") 'この時にセルA1の文字を比較したいです。 Call 処理 Exit Sub Err0: For i = 1 To 5 '←5は少なくとも list(n).csv のnまで処理したい。 On Error Resume Next Set myChkBook = Workbooks("List(" & i & ").csv") '←現状では、開かれていないファイルが On Error GoTo 0                      'あるとエラーになってしまいます。 Call 処理 Exit Sub Next i Exit Sub Err1: MsgBox "対象のCSVファイルが見つかりませんでした。" End Sub 出だしで躓いてしまい、悩んでおります。 良い方法をご教示いただければと思い、質問致します。 宜しくお願い致します。

  • CSVの作り方

    VBの初心者です。 VBでCSVファイルを新規で開いて 保存できたと思ったのですが、できていませんでした。 まだ何か足らないのでしょうか? ーーーーーソースーーーーー '取り合えず開いて保存 open app.path + "ファイル名"for output access write as #1 close #1 ーーーーーソースーーーーー

  • Common LISPでファイルの読込・書込を行う方法は、どのようにするのでしょうか?

    Common LISPでファイルの読込・書込を行う方法は、どのようにするのでしょうか? 例えば、CSVファイルを読み込んで、それをLISPのS式に変換し、違うファイル名で書き出すことがしたいです。 CommonLISPおよびxyzzyで動作させたいです。 ●入力ファイル test.csv 1,中村,100 2,伊藤,80 3,駒田,70 ●出力ファイル test.lsp (setq dat '( (1 中村 100) (2 伊藤 80) (3 駒田 70) ))

  • Access csvファイルの取り込み

    Access2021 2箇所の保存先の違う所からcsvファイルの取り込みについて伺います。 csv取り込みボタンは、2つ用意しています。 1つ目のボタンに、コード記述して動作確認は正常に動作して他のボタンも正常に動作。 2つ目にのボタンに、csvの格納パス名のみ変更後コード記述して動作確認したら全てのボタンが反応しなくなりました。 動作としては、削除クエリでテーブルのデータを削除してから、指定したフォルダからcsvファイルを選択して取り込ます。 同じテーブルを使用して、格納先の違うcsvファイルを使用する操作になります。 コードは、以下の通りです。 ①ボタン1 Private Sub コマンド61_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名①" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ②ボタン2 Private Sub コマンド62_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名②" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ご教授の程、宜しくお願い致します。

  • クラスの作成方法を教えてください

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1328191 標記の内容がわからなくうまくいきません 作成したいクラスの内容 ・CSVのデータ1行を表すクラス(CsvQueueクラスとする)  ・メンバー変数は、  その1行のデータとCsvQueueクラスへのポインタ。  データは面倒ならPublic。  ・メンバー関数は、  PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue 初歩的な質問ではございますが、 作成方法を教えてくださいます様、よろしくお願いいたします 以下、参考::::::::::::::::::::: Public Function PutData(ByVal q As CsvQueue) As Boolean  If queNextData Is Nothing Then   Set queNextData = q   Exit Function  End If  PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData  GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) Private csvRoot As CsvData ' Nothingに初期化 Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle  Do Until csvRoot Is Nothing   (中略と同内容)   csvRoot = csvRoot.GetData()  Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output"  Dim csvTemp As New CsvData  csvTemp.strCsvData1 = ...  If csvRoot Is Nothing Then   Set csvRoot = csvTemp  Else   csvRoot.PutData(csvTemp)  End If End Sub

  • クラス の作成方法

    以前の質問で下記の様にご教示頂いたのですが、 標記の内容がわからなくうまくいきません 初歩的な質問ではございますが、 作成方法を教えてくださいます様、よろしくお願いいたします 用意するもの 1.CSVのデータ1行を表すクラス(CsvQueueクラスとする)  メンバー変数は、その1行のデータとCsvQueueクラスへのポインタ。データは面倒ならPublicでよいだろう。  メンバー関数は、PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue 参考::::::::::::::::::::: Public Function PutData(ByVal q As CsvQueue) As Boolean  If queNextData Is Nothing Then   Set queNextData = q   Exit Function  End If  PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData  GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) Private csvRoot As CsvData ' Nothingに初期化 Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle  Do Until csvRoot Is Nothing   (中略と同内容)   csvRoot = csvRoot.GetData()  Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output"  Dim csvTemp As New CsvData  csvTemp.strCsvData1 = ...  If csvRoot Is Nothing Then   Set csvRoot = csvTemp  Else   csvRoot.PutData(csvTemp)  End If End Sub

  • VBA:2つのCSVファイルを開きたいです。

    エクセル2010のVBAにてCSVファイルを開き結合させるプログラムを組もうとしているのですが、2つ目のCSVファイルを開こうとすると、何故かエラーが出てしまいます。 -------------------------------------------------------------------------------- 1つ目 Sub mobile_FileSearch(Path As String) 'test.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call mobile_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "test.csv" Then Workbooks.Open ("test.csv") End If Next File End Sub ---------------------------------------------------------------------------- 2つ目 Sub local_FileSearch(Path As String) 'bbb.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call local_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "bbb.csv" Then Workbooks.Open ("bbb.csv")'←ここでエラー End If Next File End Sub ------------------------------------------------------------------------ まったく同じプログラムで、csvファイル名だけ変えただけで実行時エラー1004が出てしまいます。 一体全体何が問題なのでしょうか?

  • CSVファイルを読んでシートに書き込む方法

    エクセルのマクロ(VB6.5)でCSVファイルをよんでシートに書き込みたいのですが誰か教えて下さい。 例えば CSVファイルはこんな感じだとします。 ファイルID:test.csv ファイル内容  (1レコード)123,123,123,123,123,123  (2レコード)456,456,456,456,456  (3レコード)789,789,789,789 書き込むシートは「abcシート」とします。 CSVファイルはカンマ区切りですがレコード毎にカンマ区切りのデータ数が違います。 シートには指定したセルに書き込めば一番いいのですが、上から順番に書き込んでもいいです。 申し訳ありませんが、宜しくお願い致します。

  • プログラムのイベント処理中断方法

    VB2008のイベンド中止処理についてお教え頂けませんでしょうか。 Formにボタンが1つあり、クリックするとCSVファイルが出力される処理をしたいです。 やりたい処理: 1. 「CSVファイル出力しますか?」というメッセージを出す。YESなら処理続行。Noなら処理中止。 2. CSVファイル出力処理。 3. 「CSVファイルを出力しました。」 (プログラム自体を終了したいわけではありません) VBAだと下記のようなコードを書きたいです。 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end end if 'CSV出力処理~~~ end sub VBにendというステートメントがあれば、良いのですが無さそうです・・・ 何か上手な処理はあるでしょうか?VBAのコードになってしまいますが、下記のような処理方法しかないでしょうか? '''''''''''''''''1 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then end else 'CSV出力処理~~~ end if end sub ''''''''''''''''2 Sub テスト() Dim ans As Integer ans = MsgBox("CSVファイル出力しますか?", vbYesNo, "テスト") If ans = vbNo Then goto here end if 'CSV出力処理~~~ here: end sub

  • android CSVファイルのデータを

    初心者ですが宜しくお願いします。 やりたい処理えですが、CSVファイルのデータをHashMapにセットしたいのです。 現在は下記のように直接値をセットしています。 この値をCSVからセットするにはどうすればよいでしょうか? HashMap<String, String> map = new HashMap<String, String>(); // キーと値のペアを格納 map.put( "Key1", "あ1001" ); map.put( "key2", "い1002" ); map.put( "Key3", "う1003" ); map.put( "key4", "え1004" ); map.put( "key5", "err" ); ------------------------------------ value.csv "key2", "い1002" "Key3", "う1003" "key4", "え1004" "key5", "err" ------------------------------------ 上記csvファイルを作り、読み込むところまではわかります。 ヒント、参考サイトや参考書の情報でもかまいません。 どうぞよろしくおねがいいたします。

    • ベストアンサー
    • Java