[技術者向] コンピューター > プログラミング > その他(プログラミング) でも質問させて頂いたのですが
URL:http://oshiete1.goo.ne.jp/qa3166356.html
回答を得ることができず、こちらのカテゴリを勧められた為、再度質問させて頂きます。
ExcelVBAの勉強を始めて間もない者です。
Office2000のExcelでマクロを作成しています。
テキストストリームオブジェクトを作成してファイルを開き、
ファイルの内容をセルに展開するプログラムを書いているのですが、
開こうとしているファイルが他のプロセスで開かれているかどうかを調べる方法はありませんか?
Openステートメントを使用すればロックをかけることができるので、
エラーを発生させることができるみたいなのですが、
テキストストリームオブジェクトを使用してファイルを開いている場合に
開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。
説明がわかりにくいとは思いますがよろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんばんは。
>このプログラムを実行する前にテキストエディタなど他のプログラムでファイルを開き、データを変更した後に上書き保存をせずファイルを開いたままの状態でプログラムを実行したところエラーは発生せずに変更前のデータが展開されました。
「何だか気持ち悪い結果」というのは、あくまでも、個人の感性に関する問題だと思います。エディタ側には、後で開けば、Read Only にはなるはずですが、Excelもエディタ側も、事実上、排他モードは存在しません。それで、Excel側が書き込み不能になるわけではありません。ですから、実害はありません。ある意味で、それは、Windows の仕様としか言いようがありません。
>データを展開する前(ファイルオープン時)に調べる方法は無いのか?と思い質問させて頂きました。
あえて、そのようなコードを書くなら、以下のようにすればよいけれども、実際に、メモリの中を取り出すようなことを考えていなければ、本来、使う意味がないと思います。
なお、キャプションが正しく出ないものに対しては、アプリケーションのみを探すしかありません。
'標準モジュール
'Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Function GetProcessName_Check(fName As String) As Boolean
Dim hwnd As Long
Dim strClassName As String * 100 'クラス
Dim strCaption As String * 80 'キャプション
Dim buf As String
GetProcessName_Check = False
hwnd = FindWindow(vbNullString, vbNullString)
Do
If IsWindowVisible(hwnd) Then
GetWindowText hwnd, strCaption, Len(strCaption)
GetClassName hwnd, strClassName, Len(strClassName)
buf = Left(strCaption, InStr(strCaption, vbNullChar) - 1)
If InStr(1, buf, fName, vbTextCompare) > 0 Then
GetProcessName_Check = True
Exit Function
End If
End If
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)
Loop Until hwnd = GetNextWindow(hwnd, GW_HWNDLAST)
End Function
Sub TestCheck()
Dim fName As String
Dim msg as String
fName = "Test1.csv"
If GetProcessName_Check(fName) Then
msg = "起動しています。"
Else
msg = "起動していません。"
End If
MsgBox msg
End Sub
No.1
- 回答日時:
こんにちは。
テキストストリームの方法の回答を書いた者です。
>開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。
他のプロセスと他者が使用するのとでは意味が違います。
他のプロセスというのは、他のExcelという意味だと思います。それを許して使うという意味なのですか?もし、そうなら、Excelを二度目に起動する時、アラートが返ったはずです。
それとも、単に、For Each sh in ActiveWorkbook.ActiveSheets で、ループして調べるだけではありませんか?しかし、こちらは、Binary Open で、エラーレベルは返ります。
それ以外というのは、「オートメーション」で開いているという意味なのですか?
「オートメーション」では、一般的には、私は、あまり使いませんが、GetObjecct で、単発のファイルを狙うと、他にプロセスが占有していないとエラーが返るというスキルを利用する方法はありますが、ただ、どちらかというと、Excelでは不必要なワザです。
もちろん、他のプロセスで使用しているというなら、別の方法はありますが、もともと、Excelは、純粋に、MDIではありませんから、そういう必要性というのは、どちらかというと誤用に近い使い方ではないか、と思うのです。
「VBAの勉強を始めて間もない」という人が、なぜ、そんなに高度なスキルが必要になってくるのかわかりません。以前のVisual Basic や他の言語をされてきた方なのですか?
時々、VB(.Net ではない)を使ってきた方が、かなりイレギュラーな使い方を「アリ」としてしまうように見受けられます。
最初の質問から見ましたが、もう少し、詳しい事情を説明してみてほしいです。
それぞれのスキルを問われても、全体のステージが違えば、それは違うはずです。
>読み込みモードで開いた場合はエラーは発生せずに開いてしまいます。
「読み込みモード」というのは何を意味しているのでしょうか?
エラーレベルを発生させるための条件があります。その条件が違えば、エラーレベルは発生しません。
どのようにして使って、どのような状態の時に、どのようにするのか、分からないのです。また、もし上級者でしたら、他力に頼まず、ご自身で見つけたほうがよいと思います。
回答ありがとうございます。
ExcelVBA、VBでのプログラミングは初めてです。
ですが、趣味のレベルではありますがC言語でのプログラミングは2年ほど経験があります。
2回も説明してるのに説明が不足していて申し訳ないのですが、
今回やろうとしていることは、
csvファイルやtsvファイルなどデータのみが記述されているファイルを読み込んでセルに展開する。
ということをしたいと思っています。
ひとまず動くものができた為、
このプログラムを実行する前にテキストエディタなど他のプログラムでファイルを開き、
データを変更した後に上書き保存をせずファイルを開いたままの状態でプログラムを実行したところ
エラーは発生せずに変更前のデータが展開されました。
エラーが発生すると思って試しにやってみたところ、何だか気持ち悪い結果になってしまった為、
データを展開する前(ファイルオープン時)に調べる方法は無いのか?と思い質問させて頂きました。
こんな説明で伝わるか不安ですが説明不足でしたら注意をお願いします。
高度なことでVBA初心者に理解できない処理が必要でしたら
そう伝えて頂けるだけでも助かります。
お手数ですが再度回答して頂ければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Excel(エクセル) エクセルでのアクセス履歴をとりたいです 1 2022/06/13 17:30
- その他(ソフトウェア) 特定のpremiere proのファイルが開けなくなりました。 1 2022/11/16 12:31
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- ノートパソコン 「データエラー(CRCエラー)」対応に付いて 15 2022/12/08 09:01
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
- iOS HDD交換修理したWindows10・PCのOFFICE プロダクトキーがエラーとなる 2 2023/04/01 02:17
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
【C&C++】指定行のみファイル書...
-
VBAにてEXCEL以外のファイル(テ...
-
バッチで118項目のCSVを処理し...
-
VB6でのファイル作成方法
-
C言語 コンパイルエラー LNK1136
-
C言語のfopenについて教えてく...
-
C#で、フォームのタイトル名を...
-
ファイルの結合
-
テキストファイルの最終行を削...
-
Wordファイルの結合
-
2つのファイルを比較するC言語...
-
hostsファイルの登録MAX数
-
ファイルからサイズ不明の行デ...
-
ASP .NETでファイル選択ダイア...
-
FileOpen 関数で既にファイル...
-
オートキャドでCSVファイルを変...
-
iniファイルについて
-
クリップボードから任意のファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
ファイルを記録してあるセクタ...
-
テキストファイルの最終行を削...
-
SGファイルって何ですか?
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
fopenできる上限の変更
-
VBに、Cのincludeのようなもの...
-
グローバル変数のよくない使い...
-
ファイルの結合
-
大きいサイズのテキストファイ...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
ハッシュの計算時間について
-
C言語のfopenについて教えてく...
-
Javascript で INI の読み書き
-
Excelマクロでの再読込み方法
おすすめ情報