「dポイント」が最大20倍になるお得な情報

お世話になっております。

Excel VBA についてご質問します。
今、VBAでCSVファイルを作成してデータ管理を行うソフトを作成しております。
このソフトは、共有をかけて複数の人で使用するため同じCSVファイルに同時にアクセスする可能性があります。そのため、CSVファイルに混同したデータが書き込まれてしまう恐れがあります。
そこで、CSVファイルがオープン中または、アクセス中が認識できる命令等はないでしょうか?

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは。



CSV ファイルですか....難しいですよ。

Excel で CSV を開く場合、ファイルはロックされるため、下記のような
ロジックで使用中かどうかを調べることは可能です。

' // ファイルが使用中か調べる
Public Function FileInUse(ByVal sFilename As String) As Boolean

  Dim n As Integer
  n = FreeFile()
  On Error Resume Next
  Open sFilename For Binary Lock Read Write As #n
  FileInUse = CBool(Err.Number > 0)
  Close #n
  On Error GoTo 0

End Function

ただし、これは CSV を編集するアプリが、ファイルを開くときに、
ファイルをロックする、、これが条件です。ロックされないファイル
について、使用中かどうかを判定する術はありません。

CSV は Excel で編集すると限定できる場合は、このロジックで十分です。

しかし、CSV の実態は単純なテキストですから、メモ帳などでも編集
できますよね?
メモ帳(他多くのエディタ)では、ファイルがロックがされませんから、
このケースでは検知できません。

心配ならデータベース(例えば mdb とか)を使った方がよろしいのでは?
    • good
    • 3
この回答へのお礼

お世話になっております。
お返事が遅れて申し訳ありません。

ご回答ありがとうございました。
参考にさせていただきます。

今後ともよろしくお願いします。

お礼日時:2009/02/25 09:53

下記を参考にできませんか。




Sub getuserstatus()

Users = Workbooks("Book2.csv").UserStatus
'Book2を開いているユーザー数
un = UBound(Users, 1)  
Debug.Print un

For Row = 1 To un
'ユーザー名と日時
Debug.Print Users(Row, 1), Users(Row, 2),
'状態
Select Case Users(Row, 3)
Case 1
Debug.Print "Exclusive"
Case 2
Debug.Print "Shared"  '共有
End Select
Next

End Sub
    • good
    • 0
この回答へのお礼

お世話になっております。
お返事が遅れて申し訳ありませんでした。

ご回答ありがとうございました。
ユーザーを確認する方法がありますね。
参考にさせていただきます。

今後ともよろしくお願いします。

お礼日時:2009/02/25 09:49

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBでファイルが開かれているかどうかを確認したい

お疲れ様です。

Open ステートメントで開いたファイルが、閉じていなければ閉じると言う処理をしたいのですが、ファイルが開きっぱなしかどうかを確認するには、どんな方法があるのでしょうか?

よろしくお願いします。

Aベストアンサー

こんにちは

もう一度同じファイルを同じファイルNo.(#1)で
開きに行くと、
開きっぱなしなら“すでに開いています”とエラーになって
閉じていたら、エラーがないので
判断出きるはずです。

QExcel VBA でファイルが開かれているか確認する

ExcelのVBAで、book1.xlsというファイルが現在開かれているか確認するにはどんなプロパティを使えばいいでしょうか?

実際にやりたい事は、book1.xlsに対して処理するマクロがあるのですが、そのbook1.xlsが開かれていなければ処理が出来ないのでマクロが入っているファイルを閉じる。というものです。

Aベストアンサー

Workbookは、Workbooksコレクションによって管理されているので、Worlbooksの中身を列挙することでチェック可能です。

Dim wb As WorkBook
Dim blnFlag As Boolean
For Each wb In Workbooks
  If wb.Name = "book1.xls" Then
    blnFlag = True
    Exit For
  End If
Next

もっと手っ取り早くですと、
Set wb = Workbooks("book1.xls")

これでエラーが発生したら開いていないと判断できます。

ただし、この処理を呼ぶ前にOn Error Resume Nextでエラートラップを無効にしておかないと処理が中断してしまいます。

Qすでにファイルが開かれている時のエラー回避

VB2010で、ファイルを開いていると下記のコードでエラーがでます。
Dim SR As New System.IO.StreamReader(AppPath & "諸元一覧.csv", System.Text.Encoding.Default)

「諸元一覧.csv」ファイルを閉じてください。
とメッセージを出し、ExitSubしたいのですが、
どういうコードにすればよいのでしょうか。
教えてください。よろしくお願いいたします。

Aベストアンサー

先の回答にあるように、ファイルを開いていてもエラーが出ない場合もあります。

ファイルがロックされている場合は IOException が発生するようなので、
Try ~ Catch で IOException をエラートラップする方法もあります。
(※ただのエラートラップではファイルが存在しない等の他のエラーと
 区別できませんので、エラーの種類まで限定してエラートラップします。)

Q《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理

大変お世話になっています。

サーバ上にあるファイルを更新するVBAを作りました。
該当ファイルはあらかじめ閉じられていて、オープンして処理終了後保存して閉じるという仕様になっているのですが、そのファイルは複数人が使用するもののため、「閉じている」ことを前提としたVBAにもかかわらず、ファイルが開いている可能性があります。

そこで、一番最初に「ファイルが開かれていたら何もせずに終了する」という判断をしたいのですが、いい方法はあるでしょうか。

過去の質問を検索したところ、

If .ReadOnly Then
’処理を行わない
Else
’処理を行う
End If

という書き方があるようですが、VBAを使わない場合でも「他の人が使用中です。読み取り専用で開きますか?」というメッセージが自動で出てしまうため、これを出さずに強制終了できると嬉しいです。

達人の皆様、どうかお知恵をかして下さいませ。

Aベストアンサー

こんにちは。

>過去の質問を検索したところ、
>If .ReadOnly Then
それは正しい回答だったのでしょうか?

ダミーのバイナリ編集をすればよいのではありませんか?既に開いていれば、エラーが返りますので、それでチェックできます。

サンプル:

Sub BookEnableEdit()
Dim MyPath As String
Dim myFno As Integer
Const Fname As String = "test.xls" 'ファイル名
MyPath = \\サーバー名\共有フォルダ & "\"
If Dir(MyPath & Fname) <> "" Then
  myFno = FreeFile
  On Error Resume Next
  Open MyPath & Fname For Binary Lock Read Write As #myFno
  Close #myFno
End If
 If Err.Number > 0 Then
  MsgBox "ブックは開いています", vbInformation
  Exit Sub
 End If
 On Error GoTo 0
End Sub

こんにちは。

>過去の質問を検索したところ、
>If .ReadOnly Then
それは正しい回答だったのでしょうか?

ダミーのバイナリ編集をすればよいのではありませんか?既に開いていれば、エラーが返りますので、それでチェックできます。

サンプル:

Sub BookEnableEdit()
Dim MyPath As String
Dim myFno As Integer
Const Fname As String = "test.xls" 'ファイル名
MyPath = \\サーバー名\共有フォルダ & "\"
If Dir(MyPath & Fname) <> "" Then
  myFno = FreeFile
  On Error Resume Nex...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QVBA。開いているテキストファイルを検索

エクセル2010.VBAで
開いているテキストファイルが複数あるとして、
それらの中に、
任意のテキストファイル名が含まれているかどうかを
調べるにはどうしたらいいですか?

たとえば、エクセルワークシートなら

  For Each s In ActiveWorkbook.Worksheets

という感じで網羅的に調べられますが、
テキストファイルの場合はどうしたらいいのでしょうか?

Aベストアンサー

こんにちは。

>すでにエクセルがopenしているテキストファイルをあらためてエクセルでopenしようとしたら、「開いています。閉じてから実行してください」と警告を出すプログラムが必要です。

Excelでオープンしているということですね。それが分かりませんでした。
普通に、Excelのメニューから「ファイルを『開く』」で、テキストファイルを選択し、そのまま実行し、テキストファイルを開こうとすれば、「テキストウィザード」が出てくるはずです。

既にテキストファイルを開いた状態で、再度開こうとしても、テキストファイルままでは、再度、読み込まれるだけで、二重に開くことは出来ないようです。

仮に、テキストファイルが編集中でしたら、以下のようなダイアログが出てきます。
  ---------------------------------------------------------
  ****.txtは、既に開いています。2重に開くと、これまでの変更内容は破棄されます。
  ****.txt を開きますか? はい(Y), いいえ(N)
  ---------------------------------------------------------

その時に、「いいえ」選択すれば、再度開くことは防止されます。
今のところ、Excel 2010は手元にありませんが、仕様としては同じはずです。

こんにちは。

>すでにエクセルがopenしているテキストファイルをあらためてエクセルでopenしようとしたら、「開いています。閉じてから実行してください」と警告を出すプログラムが必要です。

Excelでオープンしているということですね。それが分かりませんでした。
普通に、Excelのメニューから「ファイルを『開く』」で、テキストファイルを選択し、そのまま実行し、テキストファイルを開こうとすれば、「テキストウィザード」が出てくるはずです。

既にテキストファイルを開いた状態で、再度開こうとしても...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報