• ベストアンサー

Excel2007 VBAでいくつか質問

Excel2007 VBAでいくつか質問 お世話になります、 本来ならこんなタイトルではいけないのでしょうが、 お許しください。 さて、 いくつかの質問にお付き合いください。 一、サブルーティンやファンクションなどの引数で取得したレンジが、どのシートにあるか レンジ引き渡し時に指定がある場合 シート名を取得する方法ってありますか? 一、これって駄目なんですか? (※:変数宣言などはされているものとします) tempranges2=Application.WorksheetFunction.MIN(INDEX((Sheet2!A2:N33<>"")*COLUMN(Sheet2!A2:N33)+(Sheet2!A2:N33="")*900000,,)) 一、これって何処が駄目なんですか? dim My_ranges As range My_ranges=sheets(1).range(cells(1,1),cells(30,30)) 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 1.  Sub Test1 Dim a As Variant a = myFunc(Selection) End Sub Function myFunc(c As Range) Dim adr As String Dim sh As String  adr = c.Address  sh = c.Parent.Name End Function 2. >tempranges2=Application.WorksheetFunction.MIN(INDEX((Sheet2!A2:N33<>"")*COLUMN(Sheet2!A2:N33)+(Sheet2!A2:N33="")*900000,,)) そもそも、これは、VBAのコードではありません。ワークシート関数をそのまま貼り付けただけです。 もし、そのまま貼り付けたければ、Evaluateを使って、 Sub Test2() Dim tempranges2 As Variant '? tempranges2 = Application.Evaluate("MIN(INDEX((Sheet2!A2:N33<>"""")*COLUMN(Sheet2!A2:N33)+(Sheet2!A2:N33="""")*900000,,))") End Sub しかし、こうしても、VBAらしさはありません。配列数式を使うよりも、VBAは、VBAの特徴を生かしたほうがよいです。 3. dim My_ranges As range   My_ranges=sheets(1).range(cells(1,1),cells(30,30)) ある程度のレベルに達していれば、なぜダメなのか一目瞭然です。 目的は分かりませんが、私なら、このように書きます。 Sub Test3() Dim MyRange As Range '通常、Rangesとは言いません。   With Worksheets(1) 'Sheet と Worksheet は違います。   Set MyRange = .Range(.Cells(1, 1), .Cells(30, 30)) 'Set がなければ、エラーになります。   'RangeとCells は、親オブジェクトで、関連づけてあげなくてはなりません。   End With End Sub

Nouble
質問者

お礼

evaluate… ワークシート関数について調べても 全然目にできない内容でした。 他にも色々… ありがとうございます。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

>1 rangeオブジェクト.parent でシートを取得できます そこからシート名が欲しいなら、もちろん rangeオブジェクト.parent.name です。 >2 デタラメやっても、当然全然だめですというイイ例ですね。 ●関数それぞれ漏れなくworksheetfunctionを修飾する必要があります ●関数に食べさせるセル範囲は、きちんとマクロの記法でworksheets(シート名).range(セル範囲)のように書かなければダメです ●全ての関数がworksheetfunctionに含まれているわけではまったくありません。たとえばCOLUMNとかもありません >3 どうだめだったのか症状も書かれてないので、あなたが何を失敗したのか不明なままですが。 素人さんがよくやるミスだとすれば myrange = sheets(1).range(sheets(1).cells(1,1), sheets(1).cells(30,30)) としないとダメです。

Nouble
質問者

お礼

ありがとうございます。 お礼が遅れ住みません。 実はコピーでも困っているのですが sheets(1).range(sheets(1).cells(1,1),sheets(1).cells(30,30)).copy sheets(2).cells(2,2) と、すればいいのですか? なんだかな~ と、言う言語仕様ですが 串刺しがあるせいでしょうか? だとすれば理解できます。 面倒なことになっているのですね。 串刺しのことを視野に入れられなくて ご教示頂くまで考えも及びませんでした。 range(sheets(1).cells(1,1),sheets(15).cells(30,30)).select と、すればいい気がしますが、 言語設計が困難になるのでしょうかね

関連するQ&A