エクセルVBEのListBoxのイベント(change、BeforeUpdate、AfterUpdate)の使い方の違いが分かりません。
具体的例で簡単に教えていただきたいのですが。(web上にあればそれでも結構です。)

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

A 回答 (1件)

>エクセルVBEの


リストボックスにも
(1)ワークシートに貼り付ける
(2)ユーザーフォームに貼り付けるばあいを明確に意識し、質問に書くこと。
(1)ではBeforeUpdateは見つからなかった。
ーー
(2)では
http://home.att.ne.jp/zeta/gen/excel/c04p32.htm
の終わりのほうに解説があるが、良くわからない。エクセルVBAのリストボックスぐらい(アクセスの関連説明が多い)ではあまり使う場合は無いのではとおもう。
Private Sub ListBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
とBeforeUpdateはCancel   がある。
Private Sub ListBox1_AfterUpdate()
にはない。
http://www.geocities.jp/cbc_vbnet/kisuhen/Event. …
    • good
    • 0
この回答へのお礼

教えていただいたページに書いてあった例をコントロールを作り、イミディエイトウィンドウを表示して
試してみました。次のような結果になり理解できました。ありがとうございます。
●Changeはデータを一部でも変更するたびにイベントが発生し、フォーカス移動が可能になる。
●AfterUpdateはデータを全部変更した時点でイベントが発生し、フォーカス移動が可能になる。
●BeforeUpdateはフォーカスを移動させる前に、自分で設定した条件にデータが合うかをチェックできて(数値か文字か等)、もし条件に合わなければ変更をキャンセルしてフォーカスを移動させない。合えばAfterUpdateと同じになりフォーカスを移動できる。

お礼日時:2011/04/09 12:55

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

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

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

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

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

QVBAで、アクティブなBOOKのファイル名を取得し

エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか?


BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合

大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

Aベストアンサー

拡張子なんでもござれ!
Sub TheBody()
Const xSeparator = "_"
Const xPeriod = "."
Dim KitCut As Variant
KitCut = Split(ActiveWorkbook.Name, xPeriod)
KitCut = Split(KitCut(0), xSeparator)
Range("A1").Value = KitCut(1) & xSeparator & KitCut(2)
Columns("A").AutoFit
End Sub

QエクセルVBAのChangeイベント時の再計算

掲題の件ですが、VBAにて、
あるセルの値を変更したときに処理を行うChangeイベントについて困っております。

処理速度向上の為、この処理を行う際、再計算の処理を行わないようにしたいのですが、

Application.Calculation = xlCalculationManual

を処理の頭に入れても、

Changeイベント発生→再計算処理→再計算を手動にする処理→本処理

となってしまうため、上手くいきません。
何かいい手立てはないものでしょうか。

エクセル2010です。

Aベストアンサー

こんにちは。

これもだめですか?
Changeイベントの最初に

If ActiveSheet.Name <> Me.Name Then Exit Sub

QExcelVBA:自己のBook名を取得したい

WindowsXP-Proです。
Excelヴァージョンは2003です。

ExcelVBAでコーディングしています。
で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか?

自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。

複数のExcelファイルを、このVBAで操作しているため、
Workbooks("本体のBook名").Activate
を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

Aベストアンサー

Public Sub Auto_Open()
  MsgBox ActiveWorkbook.Name
  MsgBox ThisWorkbook.Name
End Sub

Private Sub Workbook_Open()
  MsgBox Me.Name
End Sub

いずれも、ブック名が表示されました。

QVBA CHANGEイベントに複数イベントを

いつもお世話になっています。

色々しらべて試してみたんですが、うまくいかないんで教えてください。


CHANGEイベントに複数のイベントを書き込みたいんですが。

今現在、問題なく動いている以下のイベントがあります。

(1)
Private Sub Worksheet_Change(ByVal Target As Range)



Dim rang3 As Range
Dim rang4 As Range
Dim ■■ As String
Dim LastRow1 As Long

LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row
Set rang4 = Worksheets("○○").Range("b:I" & LastRow)
Set rang3 = Range("h4")

If Intersect(Target, rang3) Is Nothing Then Exit Sub


On Error Resume Next

■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0)
If Err.Number > 0 Then
MsgBox Target.Value & "はありません。基本情報台帳に入力してください。"



Range("h4").Select


Else

Application.EnableEvents = False

Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False)
Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False)
Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False)
Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False)
Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False)

Application.EnableEvents = True



Range("K4").Select



End If



End Sub


このシートにもう一つ、イベントを入れたいのですが。

(2)
If Target.Count > 1 Then Exit Sub

If Intersect(Target, Range("E4")) Is Nothing Then

Exit Sub


Else

If Range("e4").Value = "1" Then
Target.Offset(0, 19).Value = "☆"

End If

どこに入れればいいのかわかりません。


(3)

また、(2)のイベントの他に、
(1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。



(2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。
(3)については、まったくわかりません。

マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。


どなたか、教えてください。
お願いします。

いつもお世話になっています。

色々しらべて試してみたんですが、うまくいかないんで教えてください。


CHANGEイベントに複数のイベントを書き込みたいんですが。

今現在、問題なく動いている以下のイベントがあります。

(1)
Private Sub Worksheet_Change(ByVal Target As Range)



Dim rang3 As Range
Dim rang4 As Range
Dim ■■ As String
Dim LastRow1 As Long

LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row
Set rang4 = Worksheets("○○").Ran...続きを読む

Aベストアンサー

No.3です。
こんなのでしょうか?
参照する"△△"シートを"Sheet2"としています。
>マクロがあるシート(△△)への入力は、4行目にE~X(左から右)へと順に入力していきます。
>E4が空白のままで、H4に入力した際は、Y4にH4の値を入れたい場合は、どうすればいいですか?
E4またはH4が変更された時にY4を変更する条件と値はわかりましたが、その前の「EからXに順に入力して・・・」の文の意味が、VBAで何かをして欲しいのか何もしないくていいのかわかりません。

それとシートの値を変更する条件が増えてゆくと、条件によってはWorksheet_Changeが多重にかかる場合が起きてくるので、今は不要ですが、Application.EnableEventsでの制御が必要になってくる可能性が出てくるかもしれません。


Private Sub Worksheet_Change(ByVal Target As Range)
changeH4 Target
changeE4 Target
End Sub

'(1)の処理
Sub changeH4(ByVal Target As Range)
Dim rng As Range
'処理条件
'変更されたセルがH4セルで値があったら実行 (それ以外は終了)
If Target.Address <> "$H$4" Then Exit Sub 'H4以外のchangeイベントなら終了
If Target.Value <> "" Then '空白でなく
'"△△"シート(Sheet2)のB列から探してなかったらエラーメッセージ出してH4選択
Set rng = Worksheets("Sheet2").Columns("B").Find(Target.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not rng Is Nothing Then
Range("I4").Value = rng.Offset(0, 1).Value
Range("J4").Value = rng.Offset(0, 2).Value
Range("K4").Value = rng.Offset(0, 6).Value
Range("L4").Value = rng.Offset(0, 7).Value
Range("M4").Value = rng.Offset(0, 4).Value
Range("K4").Select
checkY4 '転記した場合の追加イベント
Exit Sub
End If
MsgBox Target.Value & "はありません。基本情報台帳に入力してください。"
End If
Range("H4:M4").Value = ""
Range("H4").Select
End Sub

'(2)の処理
Sub changeE4(ByVal Target As Range)
'E4が変更されたとき
If Target.Address <> "$E$4" Then Exit Sub
'1ならE4を右に19移動したセル(X4)を☆
If Target.Value = "1" Then
Range("X4") = "☆"
checkY4 '☆を書いた場合の追加イベント
Else
Range("X4") = ""
End If
End Sub

'(3)の処理
Sub checkY4()
Dim y4 As String
y4 = ""
'(1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたい。
If Range("H4").Value <> "" Then
If Range("E4").Value = "1" Then
y4 = Range("H4").Value
End If
End If
'E4が空白のままで、H4に入力した際は、Y4にH4の値を入れたい場合
If Range("E4").Value = "" Then
If Range("H4").Value <> "" Then
y4 = Range("H4").Value
End If
End If
Range("Y4").Value = y4
End Sub

No.3です。
こんなのでしょうか?
参照する"△△"シートを"Sheet2"としています。
>マクロがあるシート(△△)への入力は、4行目にE~X(左から右)へと順に入力していきます。
>E4が空白のままで、H4に入力した際は、Y4にH4の値を入れたい場合は、どうすればいいですか?
E4またはH4が変更された時にY4を変更する条件と値はわかりましたが、その前の「EからXに順に入力して・・・」の文の意味が、VBAで何かをして欲しいのか何もしないくていいのかわかりません。

それとシートの値を変更する条件が増え...続きを読む

Q他のワークシート名の取得方法 (VBAを使用せずに)

VBAを用いずに、ワークシート関数のみでワークシート名を取得できないか探しています。

自分のシート名は、以下の出力結果の一部より取得することができました。
=CELL("filename")

しかし、他のシート名を取得する方法が思いもつきません。

VBAを用いずにシート名を取得することはできないのでしょうか?

Aベストアンサー

Excel2000でしたら、
1.[挿入]-[名前]-[定義] から、名前を2つ定義します。
  ・名前:PPP  参照範囲:=GET.WORKBOOK(1)
  ・名前:QQQ  参照範囲:=GET.DOCUMENT(88)
2.A1 に =SUBSTITUTE(INDEX(PPP,ROW()),"["&QQQ&"]","") と入力します。
3.A1 を下方にドラッグコピーすると、シート名が一覧で表示されます。

例えば3枚目のシート名のみを取得する場合は、任意のセルに
=SUBSTITUTE(INDEX(PPP,3),"["&QQQ&"]","") と入力します。

※マクロ関数というものですが、最近のバージョンにこれが付帯されているのかどうか
  わかりませんが。   ^_^;

QエクセルのVBE

エクセルのVBEで四則計算のプログラムを作りたいんですが、プログラムが設定できずにいます。
教えてください!!

Aベストアンサー

#5のご回答で良いのですが、下記の方法もあります。
表示-ツールバー-コントロールツールボックスをクリックし、出てきたツールボックスのコマンドボタンを、直接ワークシート上に貼りつけ、編集モードのうちに、ボタン内部でダブルクリックするとVBE画面になると同時に
Private Sub CommandButton1_Click()

End Sub
が出ますから、この間の行にプログラムを記述します。
四則演算は
x=Range("A1")
y=Range("B1")
z=x+y
z=x-y
z=x*y
z=x/y
z=x Mod y
などと記述し、Range("C1")=z
で良いでしょう。

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

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

Aベストアンサー

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

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

QChangeイベントのセル選択

Private Sub Worksheet_Change(ByVal Target As Range)

Dim myrang As Range
Dim x as Long ★★

'K列に入力した時
If Target.Column = 11 And Target.Count = 1 Then


With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7)
Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False)
End With


If myrang Is Nothing Then

Dim intret As Integer

’☆
intret = MsgBox("入力エラーです!", vbCritical + vbOKOnly, "エラー発生")


Else

 処理2のコード

X=2  ★★
End If

Target.offset(X,0).select

End If

    End sub

’☆1のメッセージボックスが出て、OKを押したときは、入力したセルを選択、
処理2を行ったときは、2行下のセルを選択したい、という質問をし、★★のコードを教えていただき、
思った通りの動作をしました。

このパターンで、同じように1行下のセルを選択、は出来たのですが。

他に、
’☆1のメッセージボックスが出た時には、入力したセル、
処理2を行ったときは
Target.offset(1,3).select

としたい時はどのようにしたらいいのでしょうか?

会社にしかパソコンがなく、お返事は明日になると思いますが、どなたか
よろしくお願い致します。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim myrang As Range
Dim x as Long ★★

'K列に入力した時
If Target.Column = 11 And Target.Count = 1 Then


With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7)
Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False)
End With


If myrang Is Nothing Then

Dim intret As Integer

’☆
intret = MsgBox("入力エラーです!", vbCritical + vbOKOnly...続きを読む

Aベストアンサー

応用のモンダイです。

Dim x As Long
Dim y As Long
:
If myrang Is Nothing Then
  MsgBox "入力エラーです!", vbCritical + vbOKOnly, "エラー発生"
Else
  '処理2のコード
  x = 3
  y = 1
End If
Target.Offset(y, x).Select

..とするか、If分岐の中で素直に記述してください。

If myrang Is Nothing Then
  MsgBox "入力エラーです!", vbCritical + vbOKOnly, "エラー発生"
  Target.Select
Else
  '処理2のコード
  Target.Offset(1, 3).Select
End If

QVBAでアカウント名を取得する方法

VBAで処理したEXCELブックをデスクトップに自動保存しようとしています。VBAで現在作業中のユーザーアカウント名を自動で取得する方法を教えていただきたいのですが。

デスクトップ上にブックを保存するには、パスを記述すればよいのですが、現在PC毎にユーザーアカウントを設定しユーザー名が異なっています。
このため、PC毎にこのユーザー名をデスクトップへのパスに入れ込まなければなりません。毎回キーボードからこのユーザー名を入力する方法もありますが、自動的にユーザー名を取得し、正しいパスを指定する方法を検討しています。
どなたか、VBAでこのユーザー名を取得する方法が有れば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

Environ関数で、環境変数[USERNAME]を取得する。

MsgBox Environ("USERNAME")

Q列が対象のChangeイベントの入力セル選択

Private Sub Worksheet_Change(ByVal Target As Range)

Dim myrang As Range


'K列に入力した時
If Target.Column = 11 And Target.Count = 1 Then


With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7)
Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False)
End With


If myrang Is Nothing Then

Dim intret As Integer

      '☆
intret = MsgBox("入力エラーです!", vbCritical + vbOKOnly, "エラー発生")


Else

     処理2のコード

End If


Target.Offset(2, 0).Select

End If

    End sub

以上のコードがあります。
’☆のメッセージボックスを出し、OKを押したとき、入力したセルを選択して終了させたいのですが、
今のままでは、最後の
Target.Offset(2, 0).Select
を選択してしまいます。

どのようにすればいいのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

Dim myrang As Range


'K列に入力した時
If Target.Column = 11 And Target.Count = 1 Then


With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7)
Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False)
End With


If myrang Is Nothing Then

...続きを読む

Aベストアンサー

Dim x As Long
..と、変数1つ追加して

If myrang Is Nothing Then
  MsgBox "入力エラーです!", vbCritical + vbOKOnly, "エラー発生"
Else
  '処理2のコード
  x = 2
End If
Target.Offset(x, 0).Select

..という感じで"処理2"の時だけ Offset(2, 0) する、という考えで良いと思います。


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

人気Q&Aランキング

おすすめ情報