外出自粛中でも楽しく過ごす!QAまとめ>>

タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。

Private Sub Auto_Open()
MsgBox "Ctrl + t でイベント実行準備を行います。"
Application.OnKey "^{t}", "実行準備SUB"
End Sub
'---------------------------------------------------
Sub 実行準備SUB()
Dim Target As Range
Target = Range(Cells(1, 1), Cells(100, 100))
Call Worksheet_Change(ByVal Target)
End Sub
'---------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim r As Range
For Each r In Target
If r.Column = 2 Then
r.Offset(0, -1).Value = Now
End If
Next r
End Sub

イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

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

A 回答 (4件)

#2です。


>今後のためにも、VBAの構造的な理解、Callステートメント、
>プロシージャ等の理解を助けてくれる本などご存知でしたら
>是非教えて頂きたいです。
最近は、もっぱらヘルプを中心に参照していまして、今どきの本などについては存じ上げませんので、残念ながらご紹介できるようなネタを持ち合わせておりません。

ただ、現在お使いの本をもっとシャブリ尽くす、さらに関数の使用法やVBAの文法などは本の内容に加えてヘルプを確認するなどで理解はすすむのでは、と思います。

また、WebなどにあるExcelのサンプルなどで、結果がどのように得られるのかという過程を検証するというのも実力アップにつながるのではないかと思います。(OKWebの回答もいいサンプルになります。Excelに関しては「コンピューター [家庭向け] > ソフトウェア > Microsoftアプリケーション」のカテゴリで質問されるのが多いです。)


>ExFlgとはどういった意味なのでしょうか?
これは私が勝手に決めた変数です。(Public変数というものですが、これについてはヘルプや本で確認できると思います。)
http://okweb.jp/kotaeru.php3?q=911764
の質問で#1(=#2)さんが、フラグを使ってコントロールする方法がありますという紹介をされていますが、それの具体的な例に当たります。
フラグといのはプログラムをコントロールするための変数です。フラグ=旗のイメージで、旗が立っていたら、プログラム上のある処理を行う。旗が寝ていたら、何も行わないなどといった形で使います。
この場合でしたら、ワークブックが開いたときにフラグを寝かして置く。Ctrl+Tが押されたらフラグを立てる。ワークシートが変更された時に、フラグが立っていたら、時刻を記入するという流れになります。

(「フラグを立てる」とかは一般的にも使いますが、普通「寝かす」とは言わないです。説明のための表現ですので、お間違えなきよう)
    • good
    • 0
この回答へのお礼

御回答有難う御座います。ExFlgは、おっしゃられるとおり、Publicがあるので変数でした。焦ってしまいまして、意味不明なことばかり大変失礼致しました。

ヘルプと今使用の本で、目的を達成する努力が大切であることがよく分かりました。お忙しいところ御回答有難う御座いました。

私は某国立大学での修士生です。やはり、研究室にお金がなく未だにNEC製PC98を使っているほどです。そこからえるデータを扱うのに先輩方は、全て手作業で目的のデータを探したりそれを処理をされておりました。エクセルをよく使っていた私には、このRoutineWorkが無駄に思えて何とか簡単にできないか、というのがVBAに約半年前から携わるきっかけでした。やってみると、感動でした。しかし、だんだん本にも載っていないことが出てきて皆様に頼ることが多くなりました。正直、皆様同様、興味はあるのですが目的がVBAの習得ではないゆえ、これからもいくらかお聞きすることがあると思います。そのときは辛口で結構です。是非またよろしくお願い致します。有難う御座いました。

お礼日時:2004/07/03 17:08

素人の戯言ととでも思って読んでください。


>今後のためにも、VBAの構造的な理解、Callステートメント、プロシージャ等の理解を助けてくれる本などご存知でしたら是非教えて頂きたいです。
私も知りたいです。VBAの本に関心のあるものです。
しかしはっきり言ってお目にかかったことがありません。大村あつしさんの本を読んだ時に、所々それらしき臭いを嗅いだことを記憶しています。
あとは、9割9分初学者むけの似たり寄ったりの本ばかりです。
500題、1000題の多ページの本でも、知りたい課題を持って探すと、役に立たないことが多いです。
偶に雑誌や本の中の1文やWEBのVBA関連記事の中に、はっとする記述に出食わすことがあります。
これは自分の知識の発展・整理段階とも深く関連するようで、そういう段階に達した時に、始めて、はっとその記述の深い意味を悟るのです。始めは読んでもその意味に気がつきません。
またVBAもVBや他言語の仕組みなどを知ると、始めてVBAの
特徴や偏りなどが判るようです。回りのことを見ると自己が判る。
ですから詳しい本がそばにあれば万事解決でもないと思います。
本当に良く知っておられるプロは、小数だとは思いますが、世の中沢山いらっしゃると思いますが、忙しかったり、OKWEBにご縁がなくて、その知識を披露していただける機会がないようです。OKWEBでは、エクセルでもプロ向きの問題でない関数式の問題も多く、エクセル自身も、システムやプログラムのプロでも、必ずしもお詳しくはないのではと思います。コンピュタ界全体からすれば、エクセル関連知識も周辺部分的なことです。UNIX系統の方など、エクセルは詳しくないのではと想像します。たかが表計算ソフトのMSの1ソフトに過ぎぬと。
またOKWEBのエクセルの質問を全部目を通さないと、本件のような質問にぶつからないのですが、そのためには、毎日数時間メールに目を通す時間が要ります(私の経験から)。プロは多忙で、そんなことやってられないでしょう。
本件は理系の研究室の課題かと思いますが、良くあるニーズだと思いますので、もっと専門的に特化した世界の人や
資料に当たって見られることをお勧めします。
OKWEBは(コンピュタカテゴリについて)学術的・研究的・数学論理的・理系なことには無力ではないかと、3年間に
亘って、読み続けてきて感じます。
>Call
Callすることは、その時点で、実行するということです。
エクセルのChangeイベントなどを、VBE画面のメニュの実行
のSUB/ユーザーフォームの実行で実行しようとすると
実行できません。シート上のキーボードやマウス操作をイベントとしなければならないのは、何度も経験します。
イベントプロセジュアを通常のSUBプロセジュアの中に記述するのはおかしいと思います。
独立して記述するのが、出来るのが、メリットでもあると思います。
割り振りはシステムに任せる。
Changeイベントの前に行うべきことは、BOOKのOpenイベントなどで行うか、イベントを働かなくすれば良いのです。
EnablEevents=False なんていうのもあります。
>GPIBによるデータの取りこみの問題のようですが
時刻をデータに取り入れるなんて、良くある問題じゃないかと思います。VBAでなく、APIを使うとか、エクセルではなく、それ向けのソフトが沢山あると思います。通常はそれでの出力をCSV形式ファイルなどにして、後にエクセルに読みこませているのではと思います。
その辺を後学のためにも、研究されんことを。
たまたま身近なエクセルに飛びついた感あり、方向性の是正が必要では。
    • good
    • 0
この回答へのお礼

御回答大変勉強になりました。有難う御座います。#3の「お礼」で申し上げたとおり、身近にあるエクセルから今の方向性に至りました。API、何も全く分かりませんが、確かに耳にしたことがあります。大切なKyeword有難う御座います。取り合えず、今の知識内で最も解決手段に近いと思えるVBAでしばらく他のコード作成も行っていく方針です。しかし、並行して教わったことについても順次調べ、機会を見つけて挑戦していきたい次第です。これからもご迷惑をお掛けするかと思いますが、宜しくお願い致します。有難う御座いました。

お礼日時:2004/07/03 17:19

失礼ですが、混迷を深めやすい形での質問の出し方になっています。



質問者さんは
http://okweb.jp/kotaeru.php3?q=911402
http://okweb.jp/kotaeru.php3?q=911764
という形で関連質問を順次出されていますね?それぞれ別の問題と言うことではなく、同じ問題を順次解決していくという方針だと思うのですが、以前の質問のリンクを示されていないので、別々の問題として考えると、特に今回のような質問であれば、意図不明なものになってしまっています。
他のプロシージャから Worksheet_Changeを呼び出す必要性も正当性も感じられません。(Private Subなので同一モジュールからならWorksheet_Changeは呼び出せますが、標準モジュールから呼び出すことは出来ません。)

Worksheet_Changeで指定した時刻表示をCtrl+Tを押したとき以降だけ有効にしたいということなら次のようにする方法が考えられます。

標準モジュールで
Public ExFlg As Boolean
'Subの定義の前
Sub 実行準備SUB()
ExFlg = True
End Sub

Workbookのイベントで
Private Sub Workbook_Open()
'Auto-Openでも可
MsgBox "Ctrl + t でイベント実行準備を行います。"
ExFlg = False
Application.OnKey "^{t}", "実行準備SUB"
End Sub

Worksheetのイベントで
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
If ExFlg Then
  For Each r In Target
    If r.Column = 2 Then
      r.Offset(0, -1).Value = Now
    End If
  Next r
End If

End Sub

この回答への補足

御回答、御指摘有難う御座います。まったく、理解しないまま質問してしまいました。私はインプレス社[できる大辞典 Excel VBA]という厚めの本を参考にこれまで勉強してきました。恐らくまだこれから学ぶことが沢山あるかと思われます。しかし、今回質問させて頂いた一連のことについては、どうしてもこの本から深い理解を得ることができませんでした。また、インタネット上からも理解を得ようとしましたがそこまで至ることができませんでした。そのことで、皆様にご迷惑をお掛けいたしました。

 今後のためにも、VBAの構造的な理解、Callステートメント、プロシージャ等の理解を助けてくれる本などご存知でしたら是非教えて頂きたいです。

あと、またご迷惑をお掛けいたしますがExFlgとはどういった意味なのでしょうか?ヘルプ等調べましたが検索に該当致しませんでした。まだ、なぜワークシート、ブック、標準モジュールに分けて記述するかなど分からないことがありますがこれから理解に勤めていくつもりです。

 そして、この記述されたコードが私の意図する目的に完璧であったことに感謝、また自分に対して反省するところばかりです。有難う御座いました。

補足日時:2004/07/03 04:28
    • good
    • 0

実行準備って何でしょう?


Callしてるって事は実行準備では無く、実行したいって事?

正直、何をされたいのか良く解かりません。
シートの Change イベントは セルに入力されれば勝手に呼ばれます。

'-----------------------------------------------------------------
'「標準モジュール」に書く
Private Sub Auto_Open()
  MsgBox "Ctrl + t でイベント実行準備を行います。"
  Application.OnKey "^{t}", "実行準備SUB"
End Sub

'-----------------------------------------------------------------
'「標準モジュール」に書く
Sub 実行準備SUB()
Dim r As Range
  Set r = ActiveSheet.Range("B1:B100")
  r() = r()
End Sub

'-----------------------------------------------------------------
'「シートモジュール」に書く
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
 For Each r In Target
   If r.Column = 2 Then
    r.Offset(0, -1).Value = Now
   End If
 Next r
End Sub


これが希望の動作なら、シートモジュールの Change なんか不用で、下記にキーを割当てたのとなんら変わりが無い気がしますけど。。。

Sub aaaa()
  ActiveSheet.Range("A1:A100") = Now
End Sub

この回答への補足

 ご指摘有難う御座います。私は、ある値を自動計測してその値を例えば10秒毎にエクセルに取り込んでおります。しかし、測定値だけ取り込まれるためいつその値が取り込まれたかがわかりません。なので、自動計測による測定値をエクセルに取込中に、同時に測定された時刻も取り入れたいという目的で、このコードを作りました。

 ただ、測定前にエクセルに備考を記す必要があります。そのとき、入力するたびにイベントにより時刻が取り込まれることを避けたいのです。なので、実行準備SUBというプロシージャを作って制御しているつもりでした。

 しかし、ご指摘によってcallで呼び出されたイベントプロシージャは、呼び出された瞬間に実行されることが分かり、私の意図しない結果となることが始めて分かりました。有難う御座います。

 もし宜しければ、今回補足で申し上げたことをもとに質問を見ていただければ有難いです。また、今回ご指摘を受けたCallにより待機されるのではなく、すぐに実行される状態をどうにか待機させる方向にならないか、ご教授願います。長くなりましてご迷惑お掛けいたします。

補足日時:2004/07/03 03:19
    • good
    • 0

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

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

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

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

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

QExcel VBAでのWorksheet_Changeが動作しない原因

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = Falseを入れてあります。

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A1:C3")) Is Nothing Then
Exit Sub
Else
Application.EnableEvents = False
Call test
Application.EnableEvents = True
End If
End Sub

VBA初心者です。
エクセル上で特定のセル(A1~C3の6セル)が変更された際に、マクロが自動で動作するようにしたいと考えています。

既に単独では動作確認済のtest()マクロを作り、
さらに以下のイベントプロシージャを記述したのですが、セルの変更に対して反応が起きません。
どの部分に問題があるかご教示願えますでしょうか。

※test()マクロに関してはA1~C3のセルは参照するものの、
これらのセルを書き換える事はない為、ループは起きない可能性もありますが、
念の為Application.EnableEvents = ...続きを読む

Aベストアンサー

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かします。そしてマクロが、正しく動いているかチェックします。そして、そのマクロが、再び、戻ってくるかどうか、様子をみます。
ただし、今回のマクロは途中で止めると、Application.EnableEvents = True に戻っていないことがありますから、イミディエイトウィンドウあたりで、設定を戻したほうがよいです。

また、初心者ならでは失敗は、Test プロシージャが、標準モジュールか、そのシートモジュールのどちらかに置いていないのが原因だったりします。

こんにちは。

>どの部分に問題があるかご教示願えますでしょうか。

サブルーチンに肝心な部分を書いておいて、動きませんといっても、それは誰も分からないと思います。

それよりも、むしろ、ご自分で出来るように、デバッグの方法を身につけることですね。
イベント・ドリブン型の最初の部分に[ブレークポイント]を置き、
次に、「Test」というプロシージャが、どこかに置かれていたら、そこに、[ブレークポイント]を置きます。

イベントを発生させたら、[F8]で、ステップモードでひとつずつ動かし...続きを読む

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だからです。

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

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

Aベストアンサー

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

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

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub

QEXCEL VBAで全選択範囲の解除

EXCEL VBAで
Cells.Select
と書くと、全セルが選択状態になりますが、
これを解除するには、どう書けばよいのでしょうか?

Aベストアンサー

その1
A1 など、適当なセルを選択する。
(回答#1と同じ)

その2
全選択する前の選択範囲に戻る。

全選択前に
変数 = Selection.Address で記憶

全選択後
Range(変数).Select で元の選択範囲を選択

QVBAでループ内で使う変数名を可変にできないか。

次のような処理で・・・、
 Cnt_1 = Cnt_1 + 1
 Cnt_2 = Cnt_2 + 1
   :
実際には一つの変数(Cnt_1など)ごとに処理がもっとあるのですが、
変数はCnt_1からCnt_5まであり、すべて同じ処理をするので、変数名を
可変にして同じループで書けないかと思うのですが、可能でしょうか?

たとえば、
For I=1 to 5
 Cnt_I = Cnt_I + 1
Next I
と書くと、「Cnt_I」という変数の処理になってしまいますね・・。

なにかいい方法はないでしょうか?

Aベストアンサー

こんばんは。

配列変数を使えばいいでしょう。
変数を5個用意して、すべて1~5まで足すという処理の場合です。
Dim Cnt(4) As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 4
For j = 1 To 5
Cnt(i) = Cnt(i) + j
Next j
Next i
どうでしょうか。

Qエクセルvba  (ByVal Target As Range)について

シートのイベントプロシージャーが
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
となりますが
(ByVal Target As Range)部分は何なのでしょうか?
何のためにあるのかわかりません。

Private Sub Worksheet_SelectionChange()
End Sub
としたらエラーが返ってきました。

理由を教えてください。
よろしくお願いします。

Aベストアンサー

こんにちは
>Target=ActiveCell
>と言う認識でよろしいでしょうか?
#5でKenKen_SPさんが説明されていますが、補足です。

セルを一つだけ選択したときには、

Target=ActiveCell
と考えても問題ありません

しかし、複数の範囲を選択したときは、
Target=ActiveCell
はなりません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
です。

注!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
成り立っていますが、そうでない場合もあります。
Selectionは「選択されている物」という意味です。
そのために、場合によって内容が異なります。
例えば、オートシェイプが選択されているときには、Selectionは選択されているオートシェイプになります。


以下のコードを試してみてください。
上段にTargetのアドレス
中段にActiveCellのアドレス
下段にSelectionのアドレス
が表示されます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address & Chr(13) & ActiveCell.Address & Chr(13) & Selection.Address
End Sub

こんにちは
>Target=ActiveCell
>と言う認識でよろしいでしょうか?
#5でKenKen_SPさんが説明されていますが、補足です。

セルを一つだけ選択したときには、

Target=ActiveCell
と考えても問題ありません

しかし、複数の範囲を選択したときは、
Target=ActiveCell
はなりません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
です。

注!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
成り立...続きを読む

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

QVBA モジュールで共通に使う変数の宣言方法

VBAにてプログラミングを覚えている者です。

現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。
いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。

例えば、

Dim pic1 As Picture
Dim cell1 As String
Dim pass1 As String
Dim pic2 As Picture

などです。


Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。

共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに
その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか?
(例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・)

ヒントを教えていただければと思います。よろしくお願いします。

Aベストアンサー

>モジュールで共通に使う変数の宣言方法

モジュールの先頭に書いたdimで宣言すると,そのモジュールの中だけ(に記入されている各プロシジャ)でパブリックになります。
モジュールの先頭に書いたpublicで宣言すると,全モジュール(に記入されている各プロシジャ)に対してパブリックになります。

「変数宣言モジュール」のようにモジュールを越えて参照させたいという事なので,DimではなくPublicで宣言します。


Module1:
public x as variant


Module2:
sub macro1() ’先に実行する
x = "abc"
end sub


Module3:
sub macro1()
msgbox x
end sub

Q【Excel VBA】セルの値が変更されたらマクロを実行

こんにちは

B4の値を変更する度に、
標準モジュールにあるMacro1が実行されるようにするには、
どうしたら良いでしょうか。

Excel2013です。

Aベストアンサー

WorksheetのChangeイベントを書けばいいです。
【Worksheet Change】
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 And Target.Row = 4 Then
Call Module1.Macro1
End If
End Sub

【Module1】
Public Sub Macro1()
MsgBox "B4の値変更(元の値と変更がなくても走行する)"
End Sub


人気Q&Aランキング