プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
Excel VBAの転記作業について質問です。
下記のようなシートAの特定セルの値を、シートB、またはシートCより検索し
当てはまったセルの同じ列内のデータを、シートAの特定範囲に転記するマクロを組んでいます。
①シートAの特定セル("F10")で検索先シートの切り替え
②検索先シート内からシートA("D9")の値を検索
③検索先シートよりシートAに値を転記
大まかにこのような構成で組んでいますが、①のシートの切り替えがうまくいきません。
デバックエラー「オブジェクトが必要です」となります。

どこが間違っているのか自分では判断できないため、お力添えをお願いします。

下記コード

Sub ???a????_?{?^??3_Click()

Dim sh2 As String
Dim sh1 As Worksheet
Dim lot As Range
Dim area As Range
Dim kensaku As Range
Dim n As Variant
Dim y As Long
Dim i As Long
Dim comTxt As String

n = 18

Set sh2 = Worksheets("A").Cells(10, 6).Value
Set sh1 = ThisWorkbook.Worksheets("A")

Set lot = sh1.Range("D9")
Set area = Range(sh2.Cells(3, 7), sh2.Cells(3, Columns.Count).End(xlToLeft))
Set kensaku = area.Find(what:=lot.Value, LookIn:=xlValues, LookAt:=xlWhole)


If kensaku Is Nothing Then
MsgBox "Lot確認してください"
Else
For i = 8 To 390

For y = 15 To 35

Range(sh1.Cells(i + 1, kensaku.Column - 1), sh1.Cells(i + n, kensaku.Column - 1)).UnMerge
Range(sh1.Cells(8, y), sh1.Cells(9, y)).UnMerge

sh2.Cells(8, y).Value = sh1.Cells(i + 1, kensaku.Column - 1).Value


Range(sh1.Cells(8, y), sh1.Cells(9, y)).Merge
Range(sh2.Cells(i + 1, kensaku.Column - 1), sh2.Cells(i + n, kensaku.Column - 1)).Merge
Range(sh2.Cells(i, kensaku.Column), sh2.Cells(n + i, kensaku.Column)).Copy
Range(sh1.Cells(10, y), sh1.Cells(10 + n, y)).PasteSpecial xlPasteValues
i = i + 21

Next y
Next i

comTxt = sh2.Cells(6, kensaku.Column).Comment.Text
sh1.Cells(31, 15) = comTxt
sh1.Range(Cells(31, 15), Cells(40, 33)).Select
Selection.Merge
Selection.HorizontalAlignment = xlHAlignLeft
Selection.VerticalAlignment = xlVAlignTop

End If
End Sub

A 回答 (2件)

まず、sh2はString型で定義されているので、ワークシートオブジェクトとして使用できません。


sh1と同じくAs Worksheetとして宣言します。
更に検索対象シート名格納用の別の変数を追加します。
Dim Target_SheetName As String

次に、処理1行目と2行目を

Set sh1 = ThisWorkbook.Worksheets("A")
Target_SheetName= Sh1.Cells(10, 6).Value
Set sh2 = Worksheets(Target_SheetName)

とします。

これで、sh1にはシートAが、Sh2にはシートAのF10に入力されているシートがセットされます。
    • good
    • 1
この回答へのお礼

ありがとうございます!
希望していた通りできました!

お礼日時:2019/07/06 10:39

blue_rumbleさんの回答と同様に、Setが大切です。


https://www.sejuku.net/blog/29031

関係ないですが、気になったので、
sh1.Range(Cells(31, 15), Cells(40, 33)).Select
Selection.Merge
Selection.HorizontalAlignment = xlHAlignLeft
Selection.VerticalAlignment = xlVAlignTop

With sh1.Range(Cells(31, 15), Cells(40, 33))
.Merge
.HorizontalAlignment = xlHAlignLeft
.VerticalAlignment = xlVAlignTop
End With
がいいと思います。
    • good
    • 1

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