質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

341閲覧

VBA:アドインを利用したテキスト置換

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/07/02 20:38

実現したいこと

アドインするExcelをbook1とします。
作業時に使用するExcelをbook2とします。

book2のE列~G列に学科コードが記載されています。
これをbook1にある表を元にテキストの学科に置換をしたいという内容になります。
(book1のA列とbook2のE列~G列が一致していた場合、book1のC列に置換したい。)

book1のイメージ
イメージ説明

該当のソースコード

book2に直接記述した場合は置換ができました(下記はE列のみ)が
アドインするためのbook1に記述すると置換ができなくなってしまいます。

こちら原因が分からず困っていますので、ご教授いただければ幸いです。
よろしくお願いいたします。

VBA

1Sub テキスト置換() 2 3 Dim st1 As Worksheet 4 Dim st2 As Worksheet 5 Dim result As Range 6 Dim r As Long 7 8 Set st1 = Worksheets("Sheet1") 9 Set st2 = Worksheets("Sheet2") 10 11 r = 2 12 Do While st1.Cells(r, 1).Value <> "" 13 Set result = st2.Range("A:A").Find(st1.Cells(r, 5).Value) 14 If Not result Is Nothing Then 15 st1.Cells(r, 5).Value = st2.Cells(result.Row, 3).Value 16 End If 17 r = r + 1 18 DoEvents 19 Loop 20 21End Sub 22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問に提示のコードを読むと、Set st2 = Worksheets("Sheet2") こちらがアドイン側のシートを意識していると思います。
しかし、これでアドインを実行すると、WorksheetsはアクティブなExcel(book2のこと)のシートが対象になるため、アドインのシートを参照することになりません。ThisWorkbookのWorksheetsであると明記することでアドイン側のシートを参照することができます。

よって

VBA

1 Set st2 = ThisWorkbook.Worksheets("Sheet2")

まぁ。色々と思う所はありますが、これでとりあえずは動くのではないでしょうか。

投稿2022/07/03 03:13

xail2222

総合スコア1497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/07/03 06:00

ご回答ありがとうございます。 問題なく置換ができました。 もう1点ご質問させていただきたいのですが book2が開かれた際に、アドイン側のbook1を非表示にしたいです。 (見た目上、book2のみが表示されているようにしたい) Private Sub UserForm_Initialize() Application.Visible = False End Sub ユーザーフォームの場合は上記で対応できたのですが book2のファイル名が毎回異なる事を踏まえ、book2が開かれた場合にbook1を非表示するためにはどのようにすればいいかご存知でしょうか。
xail2222

2022/07/03 06:20 編集

すみません。質問者さんのいうアドインって、どうやって作っているのでしょうか。 私の認識しているExcelアドイン(xlam)だと基本的に非表示になります。 ただのマクロファイルをそのように使うのであれば Windows(ThisWorkbook.Name).Visible = False で非表示にはなるかと思います。 後で、Trueに戻して表示されるようにしたり 表示タブの再表示とかで表示するようにする必要があります。
xail2222

2022/07/03 06:33 編集

ThisWorkbookのモジュールに以下を記載すれば、一応Book2が開いたときにBook1が非表示になる。という処理にはなります。 Private WithEvents m_App As Application Private Sub m_App_WorkbookOpen(ByVal Wb As Workbook) If Wb.Name Like "Book2.*" Then Windows(ThisWorkbook.Name).Visible = False End If End Sub Private Sub Workbook_Open() Set m_App = Application End Sub ん・「book2のファイル名が毎回異なる事を踏まえ」というのであれば ほかのブックが開いたときに非表示にするだけなら 「If Wb.Name Like "Book2.*" Then」の条件は不要でしょうか。
guest

0

回答ではありません。補足要求です。
1.book2のイメージの画像もアップしていただけませんでしょうか。
2.book2の拡張子はなんでしょうか。
(.xlsxですか。それとも.xlsですか。それとも、.xlsmですか)
3.book2がオープンされている状態でマクロを実行する前提でよいですか。
4.book1のシート名は何でしょうか。
5.book2のシート名は何でしょうか。

投稿2022/07/02 23:54

tatsu99

総合スコア5424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問