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

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

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

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

Q&A

解決済

2回答

640閲覧

VBA セルの検索と条件分岐による転記②

jabe

総合スコア43

VBA

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

0グッド

0クリップ

投稿2020/03/09 12:07

編集2020/03/09 13:52

前提・実現したいこと

sheet2からsheet1へ転記する際、sheet2の名前をsheet2のセルC1(製番)へ変更する。
その後、sheet2(セルC1名)内の転記項目(C1〜C4)を変更した場合もsheet1へ反映される。

狙い:sheet2を入力フォーマットとして、シートコピーをしてセルC1(製番)毎にシートを増やしていく管理をしたいと考えています。

!イメージ説明ジ説明](42a21a325925899341056140f35cc064.jpeg)説明](1ebba338c590e324c38982e904757735.jpeg)](82ca2f8f34f8289353c9510282a0c8f4.jpeg)

該当のソースコード

Sub 検索転記△2() Dim number As Range '入力値 Dim number2 As Range '入力値2 Dim number3 As Range '入力値3 Dim result As Range '検索結果 Dim lastline As Long '最終行 Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = ActiveSheet '追加項目 Set number = ws2.Range("C2") Set number2 = ws2.Range("C3") Set number3 = ws2.Range("C4") ws2.Name = ws2.Range("C1") '追加項目 lastline = ws1.Cells(Rows.Count, "B").End(xlUp).Row 'シート1 B列のセル入力済最終行を定義 Set result = ws1.Range(ws1.Cells(4, 2), ws1.Cells(lastline, 2)).Find(number, lookat:=xlWhole) 'No列の開始行から最終行の範囲で検索する If result Is Nothing Then 'Rangeが「Nothing」である場合 n = Cells(Rows.Count, "B").End(xlUp).Row + 1 o = Cells(Rows.Count, "C").End(xlUp).Row + 1 ws1.Range("B" & n).Value = number.Value 'ハイパーリンク ws1.Hyperlinks.Add _ Anchor:=ws1.Range("B" & n), _ Address:="", _ SubAddress:=ws2.Name & "!A1", _ TextToDisplay:="number" ws1.Range("C" & o).Value = number2.Value ws1.Range("D" & o).Value = number3.Value ElseIf Not result Is Nothing Then 'Findの結果で取得されたRangeから行数を取得し、その行に書き込む ws1.Cells(result.Row, 2).Value = number.Value 'ハイパーリンク ws1.Hyperlinks.Add _ Anchor:=ws1.Cells(result.Row, 2), _ Address:="", _ SubAddress:=ws2.Name & "!A1", _ TextToDisplay:="number" ws1.Cells(result.Row, 3).Value = number2.Value ws1.Cells(result.Row, 4).Value = number3.Value End If End Sub

イメージ説明

試したこと

sheet2をアクティブシート選択して、名前を変更しましたが、シート名変更後にはエラーにより、
転記が反映されなくなってしまった。
set ws2 = activesheets
ws2.name = ws2.range("C1")

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

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

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

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

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

yureighost

2020/03/09 12:37

試したことの処理が貼っているソース内にないです。 反映させた物を貼ってください。
jabe

2020/03/09 13:55

連絡ありがとうございます。 すいませんでした、コードと実行結果をアップさせていただきました。 画像の通り、sheet名は変更されるのですが、sheet1のB25へ転記されるはずが、B5へ転記されてしまいます。
guest

回答2

0

製番)毎にシートを増やしていく管理をしたい

↑これがコードに書いてなくないですか?

ExcelVBA

1Sub test() 2 Dim rngData As Range 3 Dim rngContents As Range 4 Dim rngTarget As Range 5 Dim num As Long 6 Dim ws As Worksheet 7 8 Set rngData = Worksheets("Sheet2").Range("C1:C4") 9 With Worksheets("Sheet1").Range("B3").CurrentRegion 10 Set rngContents = Worksheets("Sheet1").Range("B3").CurrentRegion.Columns(1).Cells 11 End With 12 num = rngData(1) 13 14 '//シートの作成// 15 'シートの存在確認 16 On Error Resume Next 17 Set ws = Worksheets(CStr(num)) 18 On Error GoTo 0 19 'なければ入力シートをシートコピー 20 If ws Is Nothing Then 21 With Worksheets 22 rngData.Worksheet.Copy After:=.Item(.Count) 23 Set ws = .Item(.Count) 24 End With 25 ws.Name = num 26 End If 27 28 '//目次の作成// 29 'データの存在確認 30 Set rngTarget = rngContents.Find(num, , , xlWhole) 31 '無ければ一番下の次を取得 32 If rngTarget Is Nothing Then 33 Set rngTarget = rngContents(rngContents.Count + 1, 1) 34 End If 35 '目次に転記&ハイパーリンク挿入 36 rngData.Copy 37 With rngTarget 38 .PasteSpecial Transpose:=True 39 .Worksheet.Hyperlinks.Add _ 40 Anchor:=.Cells, _ 41 Address:="", _ 42 SubAddress:=ws.Range("A1").Address, _ 43 TextToDisplay:=CStr(.Value) 44 End With 45End Sub 46

投稿2020/03/10 12:11

mattuwan

総合スコア2136

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

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

jabe

2020/03/20 05:39

回答ありがとうございます。 試してみます。
guest

0

ベストアンサー

問題はシート名を変えたことではなくて、
ActiveSheetとして取得できるようにSheet2からマクロを起動するようにしたことですね。

VBA

1・・・ 2 If result Is Nothing Then 'Rangeが「Nothing」である場合 3 n = Cells(Rows.Count, "B").End(xlUp).Row + 1 4 o = Cells(Rows.Count, "C").End(xlUp).Row + 1 5・・・

ここのB、C列の最終行を取得するコードはSheet1に転記する関係上、Sheet1で実行しないといけませんが、
WorkSheetオブジェクトが無指定だとActiveSheetが対象になるので、
Sheet2で実行されてしまっています。

VBA

1・・・ 2 If result Is Nothing Then 'Rangeが「Nothing」である場合 3 n = ws1.Cells(Rows.Count, "B").End(xlUp).Row + 1 4 o = ws1.Cells(Rows.Count, "C").End(xlUp).Row + 1 5・・・

このようにSheet1のWorkSheetオブジェクトを指定すれば問題なく動作します。

投稿2020/03/09 20:38

yureighost

総合スコア2183

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

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

jabe

2020/03/10 11:44

コード作成ありがとうございます。 実現させたい内容で動作する事が出来ました。 sheet指定の大切さを理解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問