数式のエラーを回避するユーザー定義関数を作りPERSONAL.xlsに登録しました。
その後アドインに保存して、関数の挿入ダイアログボックスのユーザー定義関数から選んで使用していますが、頻繁に使用するのでボタンに登録したいのです。
どのようにすればいいのでしょうか?
ネットで検索して色々やってみてるのですが分かりません。
ボタンのマクロの登録で「PERSONAL.xla!vlookupエラー回避」と直接打ち込んで登録してみましたが、実際にボタンをクリックすると「コンパイルエラー End Subが必要です」というエラーメッセージが出ます。
どこをどうすればいいのか教えてください。よろしくお願いします。
Sub vlookupエラー回避()
'
' vlookupエラー回避 Macro
' マクロ記録日 : 2006/7/25 ユーザー名 : ********
'
Function myVLookup(Rg As Range, Area As Range, col As Integer, opt As Integer)
Dim vlk As Variant
vlk = Application.VLookup(Rg, Area, col, opt)
If IsError(vlk) Then
vlk = ""
End If
myVLookup = vlk
End Function
No.4ベストアンサー
- 回答日時:
#3です。
> EQ台数!の部分が消えてしまう
Addressプロパティの引数 External を True にすると外部参照を返してきます。
他の引数はVBAヘルプを見て下さい。
Sub test2()
'列のみ絶対参照でローカルアドレスを表示
MsgBox ActiveCell.Address(False, True, xlA1, False)
'行のみ絶対参照で外部参照アドレスを表示
MsgBox ActiveCell.Address(True, False, xlA1, True)
End Sub
ちなみに先のマクロのうち Test1 を直すなら
s = "VLookup(" & Rg.Address & "," & myArea.Address & _
"," & col & "," & opt & ")"
の部分を下記に変えると上手く行くと思います。
s = "VLookup(" & Rg.Address(External:=True) & "," & _
myArea.Address(External:=True) & "," & col & "," & opt & ")"
お忙しいところ、本当にありがとうございました!
大変よくわかりました!
***********************************
私の質問に答えてくださった皆様、本当にありがとうございました。
皆様からいただいた回答をもとに、また明日から頭をひねってマクロの勉強頑張ります。
No.3
- 回答日時:
結果をセルに直接入れるのでは無く関数として入れたいなら、その式を代入する Sub を作れば良いと思います。
引数を一括指定可能な UserForm を作るとか、下記のように InputBox を使用するとか、、、
Sub Test()
Dim Rg, myArea, col As Integer, opt As Byte, s As String
On Error Resume Next
Set Rg = Application.InputBox("検索値?" & vbCrLf & _
"(F4キーで絶対←→相対)", "指定", Type:=8)
Set myArea = Application.InputBox("範囲?" & vbCrLf & _
"(F4キーで絶対←→相対)", "指定", Type:=8)
col = Application.InputBox("列番号?", "指定", 2, Type:=1)
opt = Application.InputBox("検索の型?", "指定", 0, Type:=1)
s = "=myVLookup(" & Rg.Address & "," & myArea.Address & _
"," & col & "," & opt & ")"
Selection.Value = s
End Sub
あと、ユーザー定義関数は便利ですが、別のファイルからの呼出しだと人に渡した時などに問題が生じる可能性があります。
個人的には VLOOKUP のエラー回避くらいなら標準の関数で対応した方が良いと考えます。
同様のやり方で VLOOKUP と IF(ISERROR を組み合わせた例です。
これなら myVLookup が無い環境でも問題無いハズです。
Sub Test1()
Dim Rg, myArea, col As Integer, opt As Byte, s As String
On Error Resume Next
Set Rg = Application.InputBox("検索値?" & vbCrLf & _
"(F4キーで絶対←→相対)", "指定", Type:=8)
Set myArea = Application.InputBox("範囲?" & vbCrLf & _
"(F4キーで絶対←→相対)", "指定", Type:=8)
col = Application.InputBox("列番号?", "指定", 2, Type:=1)
opt = Application.InputBox("検索の型?", "指定", 0, Type:=1)
s = "VLookup(" & Rg.Address & "," & myArea.Address & _
"," & col & "," & opt & ")"
Selection.Value = "=IF(ISERROR(" & s & "),""""," & s & ")"
End Sub
ありがとうございます。
>ユーザー定義関数は便利ですが、別のファイルからの呼出しだと人に渡した時などに問題が生じる可能性があります。
おっしゃる通りです。
データの引き込みから入力・修正まで私が一人でやっていることと、マクロを独学で勉強し始めたので、手のあいたときに勉強がてら色々トライしてみたいというのもありまして・・・。
さっそく教えていただいたマクロを試してみましたが、分からないことがあります。
今作っている表はSheet1から10まであります。
Sheet1がまとめのシートで、各営業所ごとに商品別の台数を入れこみます。
Sheet2からSheet10までは、その各商品ごとの台数データの入ったシートが並んでいます。
たとえば、検索値に「$D6(営業所コード)」、範囲に「EQ台数!$C$2:$E$10」、列番号、検索の型を入力しOKをクリックしますと、
検索値が「$D$6」、範囲が「$C$2:$E$10(EQ台数!の部分が消えてしまう)」となってしまい、入力した値と違ってしまうのです。
これはどのように修正すればよいのでしょうか?
お忙しいところ恐縮ですが、お時間のあるときにでも教えていただけると有難いです。
よろしくお願いいたします。
No.2
- 回答日時:
回答にならないかもしれませんが・・・
ユーザ定義関数をボタンに登録するのは不自然な感じがするのですが、通常、VLOOKUP関数の代わりにmyVLOOKUPを使用する形をとると思うのですが。
もし、関数として使用する場合は、Sub vlookupエラー回避()を削除してください。
また、ボタンに登録する場合は、FunctionをSUBに変更して、引数を特定のセルに固定して、計算結果も特定のセルに書き出すようにすれば、良いかと思います。
参考になればよいのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) VBAの参照先のファイル名をセルに書いて代入したい 2 2022/04/04 13:42
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【VBA】ボタンに登録したマクロがエラーになる 4 2022/07/25 17:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/11 08:33
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
エクセルエラー13型が一致しま...
-
マクロについて教えてください...
-
マクロでオートシェイプ内の文...
-
なぜこんな初歩的なVBAのIf文で...
-
VB6+SQL サーバー 2000 で 実行...
-
実行時エラー3001「引数が間違...
-
VBAで入力規則の設定がうまくい...
-
職場から目的地までの距離集計
-
ワードで「エラーブックマーク...
-
日本語環境下で作成したマクロ...
-
VBA エラーと対策
-
EXCEL VBAマクロ中断でデバッグ...
-
ExcelでWindowsのイベントログ...
-
ExcelVBAで、ユーザー定義型は...
-
'width'の値をパース中にエラー...
-
[Delphi] データセットは閉じて...
-
Dictionaryについてその2
-
ユーザー定義関数をボタンに登...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
実行時エラー -'-2147417848
-
マクロについて教えてください...
-
VBAがブレークモードになっ...
-
なぜこんな初歩的なVBAのIf文で...
-
実行時エラー3001「引数が間違...
-
OLEDB.NETで接続できない
-
ExcelVBA Range クラスの Page...
-
EXCEL VBAマクロ中断でデバッグ...
-
ADODB.Streamを使用してUTF-8を...
-
VBS実行時エラー オブジェクト...
-
Outlook.ApplicationをCreateOb...
-
VBSで変数の宣言はできないので...
-
なぜエラーになるのでしょうか...
-
VB6+SQL サーバー 2000 で 実行...
-
VBAでのエラー
-
Application.ActiveInspectorで...
-
Excelで下記のようにマクロを作...
おすすめ情報