ここから質問投稿すると、最大4000ポイント当たる!!!! >>

共通でエクセルを使用していますが、時々エクセルを開いたまま外出したり、休憩したり
する方がおり、別な方がエクセルを開いて作業をしたいと思っても、どこかで開きぱなしのことが時々あります。

そんな時のために、エクセルに何も入力等がない一定時間経過したら、自動で保存して閉じる機能を持たせたいと考えています。例えば入力が5分以上なければ自動的に閉じるように・・・・

上書き保存は下記のVBAで機能するのは確認済みですが、これに「5分後」等のタイムの設定をしたいのですが可能でしょうか?

可能の場合、どのようなVBAになりますか??

よろしくお願いします。


'ブックの上書き保存
ActiveWorkbook.Save
' 保存確認を避けるため、保存済みにする
ThisWorkbook.Saved = True

' 他にブックが開いていなければ、Excelを終了する
If Workbooks.Count <= 1 Then Application.Quit

' 本ブックをClose
ThisWorkbook.Close False

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

A 回答 (5件)

何かオペレーションが行われたかを監視して、5分ごとにそれをチェックし、オペレーションがされなかったらブックを閉じるというマクロを組んでみました。

(最後のオペレーションから5分間監視、ではなく、ブックを開いてから5分間隔でチェックするので、多少のタイムラグがあります)

しかし、「何もしなかったら」というのを検知する方法がわからなかったため、ちょっと強引ですが ThisWorkbook のイベントほとんど全てをを定義して、「何かした」というフラグを立てるという方法になっています。
そのため、ThisWorkbook のイベントで拾えない操作をしたときにも強制終了する可能性があります。

まず、標準モジュールに以下のマクロを貼り付けてください。
"00:05:00"という箇所が「5分」を定義しているところなので、時間間隔を調整したいときはそこをいじってください。



Public Operated As Boolean

Sub SetTimer()
 Application.OnTime Now + TimeValue("00:05:00"), "CloseMe"
End Sub

Sub CloseMe()
 If Operated Then
  Operated = False
  SetTimer
  Exit Sub
 End If
 
 'ブックの上書き保存
 ActiveWorkbook.Save
 ' 保存確認を避けるため、保存済みにする
 ThisWorkbook.Saved = True

 ' 他にブックが開いていなければ、Excelを終了する
 If Workbooks.Count <= 1 Then Application.Quit

 ' 本ブックをClose
 ThisWorkbook.Close False
End Sub



そして、ThisWorkbook に以下のマクロを貼り付けてください。



Private Sub Workbook_Open()
 Operated = False
 SetTimer
End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)
 Operated = True
End Sub

Private Sub Workbook_Deactivate()
 Operated = True
End Sub

Private Sub Workbook_Activate()
 Operated = True
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 Operated = True
End Sub

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
 Operated = True
End Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
 Operated = True
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 Operated = True
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
 Operated = True
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 Operated = True
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
 Operated = True
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
 Operated = True
End Sub

Private Sub Workbook_WindowResize(ByVal Wn As Window)
 Operated = True
End Sub



ご覧の通り、Workbook_Open()だけは初期設定をしていますが、その他は「何かイベントが発生したらフラグをTrueにする」の羅列です。

単にExcelのファイルを開いて、マウスのホイールでスクロールしながらあちこちシートを眺めているだけの場合など、セル操作や印刷などの操作がない場合にも強制終了されてしまうので、そこはご承知ください。
    • good
    • 0
この回答へのお礼

早速、ありがとうございます。
会社に行って試してみます。。。 m(__)m

眺めているだけの場合にも閉じられてしまうところが、
ちょっと・・・・検討してみます。。。。

お礼日時:2007/04/11 06:37

VBAでは、ご希望の機能を完璧に実現するのは困難なような気がします。


どこかでチェック漏れが発生して大事な入力情報を失ってしまうことになるのではないでしょうか。

そこで提案ですが、メニューバーの「ツール」-「ブックの共有」を試してみてはどうでしょうか?

この機能はとても便利で、ブックを複数の人が開いて更新することができます。(私はチームの作業進捗管理には必ずこのブック共有を使っています)

自分がブックを更新したいときは、先ず保存ボタンを先にクリックします。そうすると自分がブックを開いた以降に他者が更新した内容が、画面に反映されますし、保存ボタンをクリックせずに他者が更新したセルを更新しようとすると警告してくれます。

更新する前に保存ボタンで表示内容を最新化するのと、入力が終わったら保存ボタンをクリックすることをルール徹底すれば、かなり便利な機能です。

難点としては共有状態のままでは、オートシェイプを更新したり、フィルタの条件を変更できない等ありますが、その際は一時的にブック共有を解除すれば大丈夫です。

一度お試しください。
    • good
    • 0

やっぱりデバッグで止まってしまっていますか…。



ステップ実行させていると書かれていたので私もタイマーを縮めてステップ実行させてみました。その結果、現象は再現しました。私の場合ではステップ実行している間に次のタイマーが来てしまい、ボタンの上にボタンが重ねられて、内部的に不整合が生じてエラーになることがわかりました。多分同じことが起きているのではないかと推測しています。

それで、多分今はブックを開いたときに、はじめからボタンが表示されている状態だと思います。それは前にデバッグして止まったときのボタンの残骸で、それを押すとエラーになります。もしそういう状態なら、ブックを開いてすぐにボタンの「縁」を右クリックして「切り取り」を行ってボタンを削除してください。正常な状態では、ブックを開いたときにはボタンは表示されません。

ひょっとしたら何枚もボタンの残骸が重なっているかもしれないので、上の操作で消してもまだボタンがある場合は、とりあえず全部消してみてください。その上でいったんブックを閉じて、再度開いてみてください。

それで、その後ステップ実行をするとまた同じ現象が発生してしまいます。なので、ステップ実行は行わずにタイマーを縮めてみて様子を見るなど、VBAの実際の実行時間とタイマーの関係が狂わないようにして、動作確認をしてみていただけますか?
    • good
    • 1

デバッグで止まってしまいましたか…。

いろいろパターンを変えてテストしてみたのですが。

どういう条件の場合にエラーが出るかわかりますか?

とりあえず回避策として、

1.
  Sub CloseMe()
  If AlertButtonPushed Then Exit Sub
  AlertButton.Delete   ←←1.ここの部分
  'ブックの上書き保存

の部分を、

1.
  Sub CloseMe()
  If AlertButtonPushed Then Exit Sub
  If Not AlertButton Is Nothing Then
    AlertButton.Delete
  End If
  'ブックの上書き保存

に変更して、

2.
Sub AlertButton_Click()
 AlertButtonPushed = True
 AlertButton.Delete     ←←2.ここの部分
 SetTimer
End Sub

の部分を、

Sub AlertButton_Click()
 AlertButtonPushed = True
 AlertButton.Delete
 Set AlertButton = Nothing '←この行を追加
 SetTimer
End Sub

に変更して試していただけますか?

あと、ボタンの残骸がシートに残っていたら、右クリック>切り取り で消してください。
    • good
    • 0
この回答へのお礼

色々ありがとうございます。
ウーん、何度やっても下記の AlertButton.Delete 
のところでデバッグしてしまいます。。。。。。(-_-メ)

「AlertButton」をクリックしてもメッセージが消えませ~ん・・・・


Sub AlertButton_Click()
AlertButtonPushed = True
AlertButton.Delete
Set AlertButton = Nothing '←この行を追加
SetTimer
End        ←

お礼日時:2007/04/12 21:00

> 眺めているだけの場合にも閉じられてしまうところが、


> ちょっと・・・・検討してみます。。。。

やっぱりそうですよね。しかしながら、ただ眺めているだけでは何もオペレーションしてないのと同じなので、そうなってしまいます。マウスでどこかのセルをクリックしたり矢印キーでセルを移動するだけでいいのですが。

そうは言っても不便だと思ったので、ちょっと改良してみました。

何も操作せずに5分経つと、警告音とともに

 5分以上操作がなかったので
 30秒後に終了します。
 操作を続行したいときは
 このボタンを押してください

と表示されたボタンをExcelの画面の中央に表示するようにしました。
そのボタンを押せばブックは閉じません。ボタンを押さずに30秒経過すると、自動的にブックを閉じます。エクセルを最小化している場合は、最大化してボタンを表示するようにしています。

標準モジュールのマクロを以下に差し替えてみてください。
5分とか30秒などを調節する場合は、マクロ中の
"00:05:00"や"00:00:30"の部分を変えてください。


Public Operated As Boolean
Public AlertButton As Object
Public AlertButtonPushed As Boolean

Sub SetTimer()
 Application.OnTime Now + TimeValue("00:05:00"), "ShowAlert"
End Sub

Sub CloseMe()
 
 If AlertButtonPushed Then Exit Sub
 
 AlertButton.Delete
 
 'ブックの上書き保存
 ActiveWorkbook.Save
 ' 保存確認を避けるため、保存済みにする
 ThisWorkbook.Saved = True

 ' 他にブックが開いていなければ、Excelを終了する
 If Workbooks.Count <= 1 Then Application.Quit
 
 ' 本ブックをClose
 ThisWorkbook.Close False
End Sub

Sub ShowAlert()
 Dim BtnLeft As Double, BtnTop As Double
 Dim BtnWidth As Double, BtnHeight As Double
 
 If Operated Then
  Operated = False
  SetTimer
  Exit Sub
 End If
 
 If Application.WindowState = xlMinimized Then
  Application.WindowState = xlMaximized
 End If
 AppActivate "Microsoft Excel - " & ThisWorkbook.Name
 
 AlertButtonPushed = False
 BtnWidth = 150
 BtnHeight = 100
 BtnLeft = ActiveWindow.Width / 2 - BtnWidth / 2
 BtnTop = ActiveWindow.Height / 2 - BtnHeight
 ActiveSheet.Buttons.Add BtnLeft, BtnTop, BtnWidth, BtnHeight
 Set AlertButton = ActiveSheet.Buttons(ActiveSheet.Buttons.Count)
 AlertButton.OnAction = "AlertButton_Click"
 AlertButton.Characters.Text = _
 "5分以上操作がなかったので" & vbCrLf & _
 "30秒後に終了します。" & vbCrLf & _
 "操作を続行したいときは" & vbCrLf & _
 "このボタンを押してください"
 With AlertButton.Characters.Font
  .Name = "MS Pゴシック"
  .FontStyle = "標準"
  .Size = 9
 End With
 Beep
 
 Application.OnTime Now + TimeValue("00:00:30"), "CloseMe"
End Sub

Sub AlertButton_Click()
 AlertButtonPushed = True
 AlertButton.Delete
 SetTimer
End Sub
    • good
    • 0
この回答へのお礼

色々恐縮です。
早速ですが、標準モジュールのマクロを以下に差し替えてみまして
「ステップイン」を実行してみましたが、下記の2ケ所でデバッグが
表示されてしまいます・・・・・
スミマセンがよろしくご教授お願いします。

1.
  Sub CloseMe()
  If AlertButtonPushed Then Exit Sub
  AlertButton.Delete   ←←1.ここの部分
  'ブックの上書き保存


2.
 Sub AlertButton_Click()
AlertButtonPushed = True
AlertButton.Delete     ←←2.ここの部分
SetTimer
End Sub

お礼日時:2007/04/11 21:21

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

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

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

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

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

Q一定時間操作されないと自動で終了させる方法

プログラムが一定時間操作されない状態(マウス操作やキー操作)が続くと
自動的にプログラムを終了させたいのですが
どうすれば実現できるのでしょうか?

Aベストアンサー

タイマーコントロールを使用してみてはいかがでしょうか。
例えば、1分おきにタイマーイベントを発生させて内部でカウントをとる。
そのカウンターが一定以上になるとプログラム終了。
キー操作など他のイベントが発生したときは、そのカウンターをリセットする。
これでできると思いますが、いかがでしょう。

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で一定時間が経ったらメッセージを出したい

現在数名で、あるエクセルファイルを使用しています。毎日全員が使うファイルで編集が必要な人以外は読み取り専用で開きますが編集をした人が読み取り専用に戻すのを忘れ次に編集をしたい人がなかなか編集できずに困ることがあります。そこである程度の時間が来たら注意を促すメッセージを画面に表示させる事などはエクセルで出来ますでしょうか?またそれ以外でもこの様な事をうまく処理できる方法はございますでしょうか?お分かりになります方、どうぞよろしくお願いいたします。

Aベストアンサー

Workbookのモジュールに以下マクロを設定
Workbook_Open のとき ReadOnlyなら 起動時刻 利用制限時間(分)後に 利用制限ご注意 の メッセージボックスを表示 :必要なら Msgboxをモーダルにする。

↓Workbookのモジュール↓


Dim 利用制限時間 As Integer

Private Sub Workbook_Open()

If Not ThisWorkbook.ReadOnly Then
利用制限時間 = 10 '分 + 起動時刻:Now
警告時刻 = Now + 利用制限時間 * TimeValue("00:01:00") '分に変換
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意"
End If
End Sub


Private Sub 利用制限ご注意()
警告文 = "共用ファイル「 " + ThisWorkbook.FullName + "」" + vbCrLf
警告文 = 警告文 + " 利用制限時間 " + CStr(利用制限時間) + " 分 を経過しました。" + vbCrLf
警告文 = 警告文 + "保存して、閉じて、読出専用で開いてご利用ください。"
MsgBox 警告文, vbCritical, "共用ファイルの利用について"

End Sub

Workbookのモジュールに以下マクロを設定
Workbook_Open のとき ReadOnlyなら 起動時刻 利用制限時間(分)後に 利用制限ご注意 の メッセージボックスを表示 :必要なら Msgboxをモーダルにする。

↓Workbookのモジュール↓


Dim 利用制限時間 As Integer

Private Sub Workbook_Open()

If Not ThisWorkbook.ReadOnly Then
利用制限時間 = 10 '分 + 起動時刻:Now
警告時刻 = Now + 利用制限時間 * TimeValue("00:01:00") '分に変換
Application.OnTime 警告時刻, "ThisWorkbook.利...続きを読む

QエクセルVBAにおけるON TIMEメソッドの解除方法について

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマンドボタンがついているフォームを表示する

End Sub

マクロは大まかに記述しましたが以上のようにすると、一度はマクロの作成が成功したように終了するのですが、ブックを開けたままでいると1時間後に自動的にuserform1が表示されてしまいます。また、ブックを閉じていても自動的にオープンし、(マクロを有効にする)をONにするとデバック状態となります。
変数のtimekpを初期化する事で凌げると思ったのですが、うまくいきません。
以前マクロのヘルプを操作している時にON TIMEメソッドを解除する方法が掲載されていたように思うのですが、探し方がマズイのか見つけられませんでした。
マクロの記述方法がマズイのでしょうか?ON TIMEメソッドを解除しない限り、いつまでもこのメソッドは効力を発揮するのでしょうか?
また、ON TIMEメソッドを解除できるメソッドや良い解決方法がありましたら入門書等を片手にマクロを作成している素人にご教授の程お願い致します。

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマ...続きを読む

Aベストアンサー

>ON TIMEメソッドを解除
OnTimeのヘルプはごらんになられましたか?
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Schedule にfalseを設定することで、直前の実行指定を解除することができます。
具体的には
Application.OnTime timekp + TimeValue("1:00:00"),"endform",,false
とでもすればいいです。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qワードやエクセルで「時間が来たら閉じる」って出来ますか?

過去の質問に「時間が来たら警告を出す」というのがあったのは
発見出来たのですが 今回やりたい事は「試験で使えるように時間制限を付けたい」というものです。

「開いたら30分後に自動的に(強制的に?)ソフトを閉じる」
「再度開く為にはパスワードが必要」(最初に開く時には不要)

というようにしたいのですが やはりVBAで解決するしか方法はないでしょうか?

ワードでも良いのですが、出来れば Excel2003 でやりたいと考えています。
宜しくお願い致します。

Aベストアンサー

>ご教示いただいた内容(Cells.Font.ColorIndex = 0')をそのまま
そのままで良いです。意味は 文字の色を自動に 設定するだけです。
回答前のファイル作成して保存するときは、必ずシートを選択して文字色を白、シートに保護
ブックの保護は解除して保存することになりますね。(毎回で大変ですが)
マクロで時間が来て保存された状態は
シートに保護、色は自動、ブックに保護の状態です。


更にと気が付いたので、終了時に保存のいいえを選択する可能性がありますね。
Sub OnTime1()
ActiveSheet.Protect Password:="1234"
Msgbox "指定の時間が来ましたので編集できなくなりました。指定のフォルダに回答を保存してください。"
Application.DisplayAlerts = False'←メッセージを出さない
ThisWorkbook.SaveAs Password:="1234", WriteResPassword:="1234"
ThisWorkbook.Close
End Sub
の1行を加えると上書き保存しますかのメッセージがでなくなります。
この1行はうまく出来るようになってから記述しないと修正の作業が大変になります。

>ご教示いただいた内容(Cells.Font.ColorIndex = 0')をそのまま
そのままで良いです。意味は 文字の色を自動に 設定するだけです。
回答前のファイル作成して保存するときは、必ずシートを選択して文字色を白、シートに保護
ブックの保護は解除して保存することになりますね。(毎回で大変ですが)
マクロで時間が来て保存された状態は
シートに保護、色は自動、ブックに保護の状態です。


更にと気が付いたので、終了時に保存のいいえを選択する可能性がありますね。
Sub OnTime1()
ActiveSheet.P...続きを読む

QExcel VBA 自動的に閉じるMsgBox

連続で、Popupを使う際に、途中で、他の処理を実行すると、Popupが自動で消えなくなってしまいます。
下のサンプルにて、GetOpenFilename をコメントアウトすれば、Popupは、正常に機能(指定時間後に自動で消える)しますが、GetOpenFilename を入れると、メッセージは、自動で消えなくなってしまいます。

Sub mySample()
Dim WSH As Object
Dim FileName As String

Set WSH = CreateObject("WScript.Shell")
WSH.Popup "1秒後、自動的に閉じる", 1, "Title", vbInformation
WSH.Popup "1秒後、自", 1, "Title", vbInformation
FileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?", , "Title")
WSH.Popup "1秒後、自動", 1, "Title", vbInformation
WSH.Popup "1秒後、自動的", 1, "Title", vbInformation
Set WSH = Nothing
End Sub

途中に処理を入れても、メッセージが自動で消えるようにしたいのです。
サジェスチョンがあれば、よろしくお願いします。

尚、Windows8.1,Excel2010です。

下記を参考にしてはいます。
Office TANAKA(http://officetanaka.net/excel/vba/tips/tips21.htm)

連続で、Popupを使う際に、途中で、他の処理を実行すると、Popupが自動で消えなくなってしまいます。
下のサンプルにて、GetOpenFilename をコメントアウトすれば、Popupは、正常に機能(指定時間後に自動で消える)しますが、GetOpenFilename を入れると、メッセージは、自動で消えなくなってしまいます。

Sub mySample()
Dim WSH As Object
Dim FileName As String

Set WSH = CreateObject("WScript.Shell")
WSH.Popup "1秒後、自動的に閉じる", 1, "Title", vbInformation
...続きを読む

Aベストアンサー

こちらの
https://oshiete.goo.ne.jp/qa/5393997.html
#6さんのMessageBoxTimeoutA を使う方法、
#7さんのUserForm を使う方法がよろしいかと。

MessageBoxTimeoutA の方がお手軽かな。
※ WScriptのpopup はあてになりません。

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

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

Aベストアンサー

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

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

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エクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。


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

人気Q&Aランキング