- 締切済み
EXCEL マクロにて
EXCELにて質問があります 別シートのピンクという文字列をB列から探すマクロを作成しました Private Sub CommandButton1_Click() Set aaa = Sheets("sheet1写真").Columns(2).Find("ピンク").Address(False, False) MsgBox aaa Application.Goto Sheets("Sheet1写真").Range(aaa) End Sub このマクロを実行しても型が一致しませんと言うエラーが出てしまいます 何がいけないのかさっぱりわかりませんどうかご教授お願いします
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
補足のみ。ベストアンサーは辞退します。 No.1 さんがおっしゃっているとおり、Set ステートメントは、オブジェクトを変数に代入する際に使います。 No.1 さんのコードを勝手に引用させていただけば、2 つ目の作成例の中で、まずは「Sheets("sheet1写真")」という部分が Worksheet オブジェクト(または Chart オブジェクト)です。次に「Sheets("sheet1写真").Columns(2)」という部分が Worksheet.Columns プロパティであり、このプロパティは列という Range オブジェクトを返します。さらに、「Sheets("sheet1写真").Columns(2).Find("ピンク")」という部分が Range.Find メソッドであり、このメソッドは検索結果である Range オブジェクトを返します。 というわけで 2 つ目の作成例は、Set の行で、オブジェクトを代入しています。 1 つ目の作成例の中で、「…….Address(False, False)」という部分が Range.Address プロパティであり、このプロパティはセル番地という文字列を返します。文字列はオブジェクトではなく、値でしかありません。 というわけで 1 つ目の作成例は、オブジェクトを通り越して単なる値を求めているので、Set は必要ないし、できません。型が一致しませんとかオブジェクトが必要ですとか、そんな感じのエラーになります。 ところで、ジャンプした先のセルを必ず画面の左上あたりに表示したいという場合は、Application.Goto メソッドの引数 Scroll を True に指定することで、実現できます。Application.Goto の 1 行を、次の 2 行のコードで上書きします。 Application.Goto reference:=Sheets("Sheet1写真").Range(a), scroll:=True ActiveWindow.SmallScroll up:=1, toleft:=1 変数は「aaa」か「a」の、どちらかに合わせておいてください。なお検索されたセルがシートの端っこの位置とかで、それ以上は表示をスクロールできない状況であっても、Window.SmallScroll メソッドはエラーにならないので安心です。
- keithin
- ベストアンサー率66% (5278/7941)
setはセルやシート等の「オブジェクト」を変数に代入するときにに使います。 address(=セル番地を表す文字列)などの「値」を変数に代入しようとして使うと、ご質問のエラーになります。 また別の見方をすると、「変数の宣言」あるいは「変数の型」といったマクロの基本概念がまだ理解できていない事で、結果して失敗しています。 作成例: Private Sub CommandButton1_Click() dim a as string ’文字列を代入する変数として宣言する a = Sheets("sheet1写真").Columns(2).Find("ピンク").Address(False, False) ’aにはA1などの値(文字列)が代入される MsgBox a Application.Goto Sheets("Sheet1写真").Range(a) End Sub 作成例: Private Sub CommandButton1_Click() dim a as range ’セルオブジェクトを代入する変数として宣言 Set a = Sheets("sheet1写真").Columns(2).Find("ピンク") ’aには「セルそのもの」が代入される MsgBox a.Address(False, False) Application.Goto a End Sub