プロが教えるわが家の防犯対策術!

VBA初心者です。
色々調べてみましたが、どうしても原因が判りません。よろしくお願いします。

Excel2007
Windows7

実行後時々Excelが落ちてしまいます。

エラーの内容
***************************
問題の署名:
問題イベント名:APPCRASH
アプリケーション名:EXCEL.EXE
アプリケーションのバージョン:12.0.6661.5000
アプリケーションのタイムスタンプ:4f7cda6d
障害モジュールの名前:EXCEL.EXE
障害モジュールのバージョン:12.0.6661.5000
障害モジュールのタイムスタンプ:4f7cda6d
例外コード:c0000005
例外オフセット:0004da42
OS バージョン:6.1.7600.2.0.0.256.48
ロケール ID:1041

この問題に関する追加情報:
LCID:1041
Brand:Office12Crash
skulcid:1041

*****************************

以下のVBAに問題があるのでしょうか?

内容は「フォームのテキストに数字を入力し、入力した回数繰り返す」というものです。

******************************

Private Sub キャンセル_Click()
MsgBox "キャンセルされました"
Unload 奉行変換
End Sub

Private Sub 変換実行_Click()
DM = 実行枚数.Value
実行枚数.Value = Empty
MsgBox DM & "枚の伝票を変換します"
Unload 奉行変換
変換
End Sub


**********************************

入力用のシートで入力した内容を他のシートにためていくものです。
以下の内容を標準モジュールに書いています。

**********************************

Public DM As Byte '入力フォームテキストに入力された数
Public BGyo As Integer
Public BCol As Integer

Sub 変換開始()
BGyo = ActiveCell.Row '入力セルの行取得
BCol = ActiveCell.Column '入力セルの列取得
奉行変換.Show
End Sub


Sub 変換()
Dim hgyo As Integer
Dim BGyoH As Integer

If BGyo = 5 Or BGyo Mod 23 = 5 And BCol = 2 Then ’特定のセルがアクティブな時だけ実行

データー用シートの最終行指定
hgyo = Worksheets("HANYO").Cells(1, 3).CurrentRegion.Rows.Count
hgyo = hgyo + 1

For n = 1 To DM
BGyoH = BGyo + 3
With Worksheets("HANYO")

.Cells(hgyo, 3).Value = Cells(BGyo, BCol)

.Cells(hgyo, 5).Value = Cells(BGyoH, BCol + 1)

.Cells(hgyo, 6).Value = Cells(BGyoH, BCol + 2)

.Cells(hgyo, 7).Value = Cells(BGyoH + 1, BCol + 2)

.Cells(hgyo, 8).Value = Cells(BGyoH, BCol)

If Cells(BGyoH + 1, BCol + 1) = 2 Then
.Cells(hgyo, 10) = 1
ElseIf Cells(BGyoH + 1, BCol + 1) = "" Then
.Cells(hgyo, 10) = ""
.Cells(hgyo, 11) = "0"
ElseIf Cells(BGyoH + 1, BCol + 1) = 1 Then
.Cells(hgyo, 10) = 1
.Cells(hgyo, 11) = 1
End If



.Cells(hgyo, 13).Value = Cells(BGyoH, BCol + 6)

.Cells(hgyo, 14).Value = Cells(BGyoH, BCol + 7)

.Cells(hgyo, 15).Value = Cells(BGyoH + 1, BCol + 7)

.Cells(hgyo, 16).Value = Cells(BGyoH, BCol + 10)



If Cells(BGyoH + 1, BCol + 6) = 2 Then
.Cells(hgyo, 18) = 1
ElseIf Cells(BGyoH + 1, BCol + 6) = "" Then
.Cells(hgyo, 18) = ""
.Cells(hgyo, 19) = "0"
ElseIf Cells(BGyoH + 1, BCol + 6) = 1 Then
.Cells(hgyo, 18) = 1
.Cells(hgyo, 19) = 1
End If

.Cells(hgyo, 21).Value = Cells(BGyoH, BCol + 4) & Cells(BGyoH + 1, BCol + 4)


End With
hgyo = hgyo + 1
BGyoH = BGyoH + 2
Next nd
BGyo = BGyo + 23

Next n
Else
MsgBox "アクティブセルが日付にありません。"
Exit Sub
End If

End Sub

Excelが落ちるのはこれを実行した後のみ時々起きますので
私が作成した内容に何か問題があるのだと思うのですが
調べても判りません・・・・

この内容で情報は足りるでしょうか?
よろしくお願いします。

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

A 回答 (4件)

こんにちは。



一応ひとつひとつ確認していきますが

>  Next nd

Neext に対応する For がありません。
確実にコンパイルエラーになる間違いです。
誤って消してしまった関連の記述があったのか、
関連の記述を削除した時に消し忘れたものが残ってしまっているのか、
確認しましょう。
///
 
 
以下、今回のトラブルに直接関わりがあるかは状況次第ですが、 

>  Public DM As Byte '入力フォームテキストに入力された数

Byte 型というのは、バイナリデータのやり取りに使う為のものですから
こういう使い方をするものではありません。間違いです。
ユーザーフォームの TextBox の .Value から
数値文字列を格納するのなら Variant 型が正解です。

  Public DM As Variant

確認の上、書換えておいた方が無難です。
///
 
 
>  Public BGyo As Integer
>  Public BCol As Integer
 
>  Dim hgyo As Integer
>  Dim BGyoH As Integer
以上4点の宣言は Long 型を使うのが正常です。
.Row プロパティ、.Column プロパティ の戻り値は Long 型です。
Integer 型には収まりきらない大きな数値を扱いますから
必然 Long 型になる、という覚え方でも、当面は構わないですけれど、
本来は取得するプロパティに合わせるものです。
  Public BGyo As Long
  Public BCol As Long

  Dim hgyo As Long
  Dim BGyoH As Long
後になってからエラー原因になりそうな不備は直しておきましょう。
///
 
 
Sub 変換() に欠けてる宣言は以下。これは今回のトラブルとは無関係です。
  Dim n As Long
  Dim nd As Long
(但し、nd に関しては、推測です。)
///
 
 
以上は、比較的基本的で、環境や動作条件に左右されないレベルの手当てです。
確認して、それでも解決できない場合、は以下。
 
 
  Sub 変換開始()
これは、どうやって呼び出してますか?
シート画面からAlt + F8などでマクロを直接実行するのでしょうか?
もしそうなら、このセクションは読み飛ばして結構です。
シートにあるボタンやシェイプから実行させている場合は
その点、具体的で詳細な情報が必要です。
また、他のマクロから呼び出している場合も同様です。
///
 
 
以上で解決の目途が立たない場合は、試しに
>  奉行変換.Show

  奉行変換.Show vbModeless
に換えてから実行するとどうなるか、知らせてください。
Worksheets("HANYO") にシートの保護を適用しているかどうか知らせてください。
///
 
 
以上、とりあえず、気が付いた点だけレスしておきます。
確認してみてください。

この回答への補足

cj_moverさん

ご指導ありがとうございます。
WindFallerさんの回答にも補足で書いたとうり
ご指摘の場所を修正しましたが落ちてしまいました。

他にお気づきの点がありましたら
よろしくお願いします。

補足日時:2012/10/23 10:03
    • good
    • 1
この回答へのお礼

詳しいご説明ありがとうございます。

>Neext に対応する For がありません。

これはここに掲載する時、間違えて消してしまったようです。
実際には
For nd = 1 To 7
が With Worksheets("HANYO")の上にあります。

>Public DM As Byte

テキストに入力するのは10程度までで、50を超える事はないので
本に0~255までの数値と書いていたのでByteと思っていたのですが
間違えなのですね・・・
修正します。

>Sub 変換() に欠けてる宣言は以下。これは今回のトラブルとは無関係です。
  Dim n As Long
  Dim nd As Long

nとndも宣言が必要なんですね。
変数の型はそれによって扱える範囲が違って、その範囲が大きいと
実行時の時間のロスになると聞いたことがあるのです。
その為3ケタ行かないテキストから取得するDMはByteにしたのですが
理解が間違えてるようで、勉強しなおします。


フォームの呼び出しはマクロにショートカットキーを割り当てています。

さっそく修正して試してみます。
毎回落ちるのではないので
しばらく使ってみないと結果が判りませんので
結果報告は週明けになると思いますが
本当にありがとうございます。

お礼日時:2012/10/19 09:25

あ、すみません、補足の投稿に気が付くのが遅くなりました。



> Excelが落ちるのはこれを実行した後のみ時々起きますので
> 私が作成した内容に何か問題があるのだと思うのですが

> 以下のVBAに問題があるのでしょうか?

#1に関しては確認をしてもらえた、ということでしたら、
トラブルの原因は他にあると考えた方が良さそうです。
修正が必要な個所はあったにしても
ご提示のコードが今回のトラブルの原因である可能性は極めて低いです。
呼び出し方法にも問題はないです。
一応、私が気にしていたのは、
CurrentRegion と ModalなUserForm と シートの保護 の兼ね合い
フォーカスを離さないシート上のActiveXコントロール と ModalなUserFormの兼ね合い
などでリンクが切れるケースだったのですが、
その場合は C:\Users\ユーザー名\AppData\Local\Temp フォルダに
トラブルと前後した時刻の破断したファイルが残るのですけれど、
そういう問題では無さそうですね。
後は、シートモジュールで _Change イベントを使っている場合とかは
一応、そちらの記述も確認された方がよいと思いますが。

なにぶんにも私は経験したことがないトラブルですので、
再現出来ないものに手当てできるほどのスキルもないのですが、
解決に必要な情報をもう一度整理する方向でお考えになった方がよいと思います。
例えば、
問題のブックは、現在使用中の環境(Win7、Excel2007)で作成した.xlsm(マクロ有効ブック)
をそのまま使い続けている
ということなら普通ですが、何か特異な点はないでしょうか?
例えば、
極端な 量 数 大きさ 処理時間 複雑なもの 、、、とにかく特異な点を見つけて
ひとつひとつ考えられる原因を潰していくとか。

そのブックでしか起らない現象のようですからアプリケーションの修復などは
方向違いですけれど、
手間は掛かってもBookを丸ごと作り直した方が案外解決が早いのかも知れませんね。
その場合、まっさらな新規ブックから作り始めて、
セルのコピーはしても、シートのコピーはしない。
シート上のシェイプやコントロールもコピーしないで作り直す。
UserFormもコピーしないで作り直す。
VBAのモジュールもコピーしないでテキストとしてコピペする。
コピーして良いのはオブジェクトではない生データだけ、
という風に作成すればいいのかも知れません。
それでも解決できない場合は、
今回提示されていない部分のVBAや数式やフィルタなどの扱いに何か問題があるか、
Excelの現在の仕様上の問題としてMicrosoftに相談すべき現象
のどちらかになると思います。

結局、ご提示コードの書き方ということでしか役に立てなかったですが。

頑張ってください。
    • good
    • 1

こんばんは。



>UserFormは使わないほうが安全と言う事ですか?

いえ、そういうわけではないのですが……。昔、いろいろ検討した結果、UserFormは、Workbookの付属品としての域を越えない使い方をすればよい、ということに落ち着きました。つまり、VBのようには使ってはいけない、ということです。

例えば、
Excelでしたら、Worksheet -> UserForm ->Worksheet というような順路で使うようにする、ということです。起動したら、UserFormが前面に出たり、UserFormから、いきなりアプリ終了というのは、VBA外のシステム・エラーが発生することがあります。

通常のマクロコードのレベルでは、今回のようなエラーは発生しないはずです。

>”不自然なコード”よろしければ教えてもらえませんか?
>殆ど独学で身近に聞く人がいない為、知らないで”絶対やっちゃダメ”な事とか
>してるのでは?と不安に思っています。

そんなに心配ないです。#1さんがおっしゃっていた部分で十分だと思います。
良いサンプルコードを見て真似する内に、だんだん、身についてきます。ただ、ここのOkWaveで見られるコードは、書き込み文字数の制限があるので、書き方を変形していることが多いです。

それと、整数型で、Long型を使うのは、32bitOSの場合、16bitのInteger型は内部で32bit変換されながらコードが実行されるので、32bitのLong型のほうが、オーバーヘッドがない分、高速であるといわれるからです。Byte型は、例えば、Unicodeとか、2byte文字とか、Shift JISの文字が、内部がどうなっているか、という時にバイトに別けて扱うものです。

もう一つ、あまり気にする話ではないのですが、プロシージャ名は、なるべくアルファベット(英語)のほうが良いと言われています。漢字の中で1つ2つエラーが生じるものがあると言われていますが、むしろ、OfficeのVersionが二種類以上入っている環境時に、検索時等で、日本字が文字化けするからです。ただ、こういう問題は、プロレベルの人の話です。

ここで勉強されると良いと思います。
武藤玄という人のExcel大事典

参考URL:http://home.att.ne.jp/zeta/gen/excel/

この回答への補足

WindFallerさん

丁寧な説明ありがとうございます。
参考URLも行ってみました。とても勉強になりそうです。

お二人にご指摘いただいた部分に修正をしてみまたが
昨日は何事もなかったのですが今朝また落ちてしまいました。

色々なサイトに行ってみましたが
当てはまるものがありません。

一つ気になっているのが、Bookの作成過程で
コピーをしたり名前を変えたりという作業をしたのですが
”リンクが切れている”というようなメッセージがでます。
リンクを貼った覚えはありません。
リンク元のファイル名がコピー元のBook名だったりします。
これは今回の事に関係ある可能性はありますか?
解除した後も出てるので関係ないと思っているのですが・・・

補足日時:2012/10/23 10:00
    • good
    • 1

こんにちは。



#1の方がご指摘になっている、「nd」って、どこから来ているのか、見当たりませんが、今回のこととは関係なさそうです。もし、For ~Next nd が成立していなければ、マクロは動かないはずです。

でも、その前に、私は、
「例外コード:c0000005」
障害モジュールの名前:EXCEL.EXE

という点に着目します。そのエラーは、触ってはいけないメモリにアクセスしたということです。

Microsoft サポートで検索すると、いくつか出てきます。
http://support.microsoft.com/search/default.aspx …

不自然なVBAコードは、ところどころ見られますが、それを直しても、原因不明のクラッシュが発生している場所が、EXCEL.EXE本体だということです。当面、ワークブックを別のワークブックにマクロごと移植することをお勧めします。

なお、経験的には、UserFormの周辺で、UserFormオブジェクトはワークブックに直結しているのに、どこにも属さないことが原因で、不明なトラブルが発生することがあります。

この回答への補足

回答ありがとうございます。

触ってはいけないメモリにアクセスと言うのはコードの問題ではなくと言うことでしょうか?
Bookの問題は疑ってみました。他のBookの操作で落ちることがないからです。
移植しても改善しなかったのでコードの問題だと思っていました。。。

”不自然なコード”よろしければ教えてもらえませんか?
殆ど独学で身近に聞く人がいない為、知らないで”絶対やっちゃダメ”な事とか
してるのでは?と不安に思っています。

>なお、経験的には、UserFormの周辺で、UserFormオブジェクトはワークブックに直結しているのに、>どこにも属さないことが原因で、不明なトラブルが発生することがあります。

UserFormは使わないほうが安全と言う事ですか?

コードの途中で落ちるのではなく
終了後シートの移動時に落ちてしまいます。

補足日時:2012/10/19 15:40
    • good
    • 0

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

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

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

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

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

Qエクセルの動作が停止する事があります

エクセル2013をwindows7で使っています。

入力している時に何かの拍子でいきなり「エクセルは動作を停止しました」という
表示が現れ、エクセルが強制的に落ちるような状態になる事があります。

結構入力したあとですと、こまめに保存していないとデーターが消えてしまい困っています。

落ちたあとに再びエクセルを立ち上げると、前の入力していたファイルを選び立ち上げる事もたまにできますが、毎回ではありません。

エラーが出たときの詳細表示をそのまま下に書きますと、

問題イベント名:APPCRASH
アプリケーション名:EXCEL.EXE
アプリケーションのバージョン:15.0.4454.1503
アプリケーションのタイムスタンプ:50b592fe
障害モジュールの名前:ntdll.dll
障害モジュールのバージョン:6.1.7601.18205
障害モジュールのタイムスタンプ:51db96c5
例外コード:c0000005
例外オフセット:00052d94
OSバージョン:6.1.7601.2.1.0.256.48
ロケールID:1041
LCID:1041
skulcid:1041

となっています。

何が原因でどうすれば改善されるのでしょうか?
どうかお教えください。
宜しくお願いいたします。

エクセル2013をwindows7で使っています。

入力している時に何かの拍子でいきなり「エクセルは動作を停止しました」という
表示が現れ、エクセルが強制的に落ちるような状態になる事があります。

結構入力したあとですと、こまめに保存していないとデーターが消えてしまい困っています。

落ちたあとに再びエクセルを立ち上げると、前の入力していたファイルを選び立ち上げる事もたまにできますが、毎回ではありません。

エラーが出たときの詳細表示をそのまま下に書きますと、

問題イベント名:APPCRASH
アプ...続きを読む

Aベストアンサー

こちらのQ&Aが参考になりますでしょうか?

http://oshiete.goo.ne.jp/qa/249046.html

http://answers.microsoft.com/ja-jp/office/forum/office_2010-excel/%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E5%90%AB/2e755c83-b938-400c-af7c-af033538a915

あと、何かの常駐プログラムが悪さをする場合もあるようです。
常駐プログラムのうち、使いそうにないものをアンインストール
するといいかもしれません。

QエクセルVBAが途中で止まります

以前別のカテゴリで質問したのですが、そちらでは解決出来なかったので、こちらで改めて質問します。
下記のマクロで、一つのブックからSheet1だけをコピーして来て、少し処理をし、元のブックを閉じるというもので、ブックの数は多くて3000程、少ない時は300位です。
で、このマクロだと900位までですと最後まで行くのですが、それを超えるとリストが95位で止まってしまいます。
自宅で別データを作ってやってみるとうまくいきました。
コピー元のブックにはテキストデータのみで、200文字から500文字程度の大きさしかありません。
ファイル名も50文字程度の物を全部20文字程度まで短くしてもみましたが、ダメでした。
どうかお知恵をお貸しください。

Sub ★1★ブックの結合()
Dim sFile As String
Dim sWB As Workbook, dWB As Workbook, aWB As Workbook
Dim dSheetCount As Long
Dim i As Long
Dim SOURCE_DIR As String

'エクセルデータに変換されたファイルのあるフォルダを選択します。
MsgBox "エクセルに変換されたデータのフォルダを選択"
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
SOURCE_DIR = .SelectedItems(1) & "\"
End If
End With

Application.ScreenUpdating = False

'指定したフォルダ内にあるブックのファイル名を取得
sFile = Dir(SOURCE_DIR & "*.xls")

'フォルダ内にブックが無ければ終了
If sFile = "" Then Exit Sub

'集約用ブックを作成
Set dWB = Workbooks.Add

'転記マクロの中のDMリストシートをコピーする
Workbooks("転記用マクロ.xlsm").Worksheets("DMリスト").Copy Before:=dWB.Worksheets("Sheet1")
Application.DisplayAlerts = False
Worksheets(Array("Sheet1", "sheet2", "sheet3")).Select
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True

'集約用ブック作成時のシート数を取得
dSheetCount = dWB.Worksheets.Count

Do
'コピー元のブックを開く
Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile)

'コピー元のsheet1を集約用ブックにコピー
sWB.Worksheets("sheet1").Copy After:=dWB.Worksheets(dWB.Sheets.Count)

シート転記

'コピー元ファイルを閉じる
Application.DisplayAlerts = False
sWB.Close
Application.DisplayAlerts = True

'セルA2の名前を変更する


'シート名をセルA2の値に変更
'ActiveSheet.Name = Range("A2").Value


'次のブックのファイル名を取得
sFile = Dir()
Loop While sFile <> ""

'集約用ブックを保存する
'dWB.SaveAs Filename:=DEST_FILE


Application.ScreenUpdating = False


End Sub

以前別のカテゴリで質問したのですが、そちらでは解決出来なかったので、こちらで改めて質問します。
下記のマクロで、一つのブックからSheet1だけをコピーして来て、少し処理をし、元のブックを閉じるというもので、ブックの数は多くて3000程、少ない時は300位です。
で、このマクロだと900位までですと最後まで行くのですが、それを超えるとリストが95位で止まってしまいます。
自宅で別データを作ってやってみるとうまくいきました。
コピー元のブックにはテキストデータのみで、200文字から500文字...続きを読む

Aベストアンサー

http://oshiete.goo.ne.jp/qa/8750372.html


例えば、30ファイルあっても10ファイルしか読み込まれない事があり、
エラーメッセージもない、何事もなく終了するが10ファイルしか処理されていない、
常に発生する訳ではなく、マシンが変われば同じデータでもOKだったり、
データが少し変わればOKだったりする。
なので、昨日までOKだったのに、今日データが変わった為、急にダメになったりする。
もし、10ファイル目で発生した場合、何度実行しても必ず、10ファイル目までしか処理されない。
そのファイルがおかしいかと思い、その前後の2~3ファイルを削除しても、
やっぱり、10ファイル目(さっきとは違うファイル)までしか処理されない、
という恐ろしいバグがExcel VBAにありますが、それじゃないですかね?

While文などのループの中に、ワークブックのオープンがあると、
何度目かでオープンが実行されず、エラーなしでスルンと終わります。

回避方法は、Open 文の前に DoEvets の1行を書く事。
だいたいこれで直りますが、これで直らなかったマクロもあったので、
Open 文の後ろにも DoEvets の1行を書いて、前後を DoEvets ではさむと直りました。
安全(?)の為、前後をはさんでおいた方が良いと思います。

こんな感じ:
DoEvents
Workbooks.Open aaa
DoEvents

かなり前(1年くらい?)にハマりググりまくったところ、ほとんど情報はなかったですが、
1人だけ、自分の質問に「直った」と自己回答している方がいて、Open文の前にDoEvetsをつけたら直ったそうです。
半信半疑で真似たら私も直りました。
何故、これで直るのかはわかりませんが、DoEvetsを外すと見事に再現し、DoEvetsではさむとピタッと直ります。

ググりまくった際、とても情報が少なく、こんなに顕著に再現するのに、
何故、情報が少ないのかは不思議に思いました。

http://oshiete.goo.ne.jp/qa/8750372.html


例えば、30ファイルあっても10ファイルしか読み込まれない事があり、
エラーメッセージもない、何事もなく終了するが10ファイルしか処理されていない、
常に発生する訳ではなく、マシンが変われば同じデータでもOKだったり、
データが少し変わればOKだったりする。
なので、昨日までOKだったのに、今日データが変わった為、急にダメになったりする。
もし、10ファイル目で発生した場合、何度実行しても必ず、10ファイル目までしか処理されない。
そのファイルがおかし...続きを読む

Qアプリケーションエラー

会社で在庫管理をエクセルでやってます。

エクセルを開こうとすると次のメッセージが表示されます。
【アプリケーションエラー】
≪エラーが発生したため、EXCEL.exeを終了します。
プログラムをもう一度開始する必要があります。
エラーログを作成しています。--OK--≫
と表示され開くことができなくなりました。

エラー診断で保存されていたエラーは
iexplore.exe cooooo5<nosymdols>(70F65EOE)です。

内容が濃く大量の在庫管理をエクセルだけででやることじたいに無理があると思うんですが
社長の経費削減の案でして。。

とても困っています。どうぞご指導の方よろしくお願い致します。

Aベストアンサー

C0000005のエラーは、基本的にアクセスしてはいけない所に
アクセスしたときに出るエラーです。

アクセスエラー自体の回避策は、これといったものはないと
思いますが、やはりファイルの容量が大きいと発生しやすい
みたいです。

ある項目毎にファイルを小分けにしてみてはどうでしょうか?

ハードディスクが断片化してる場合も起こりやすいようです。
Windows95,98,ME系であれば、Cドライブ上で"*flag*"で検索
するとデフラグというものが見つかると思うので、それを使って
定期的に断片化したハードディスクを整理するのも手だと思います。

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

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

Aベストアンサー

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

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

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
...続きを読む

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
'-------------------------------------
 
 

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

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


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

人気Q&Aランキング