みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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))

宜しくお願い致します。

投稿日時 - 2013-02-05 22:59:14

QNo.7930173

暇なときに回答ください

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

こんにちは。

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

投稿日時 - 2013-02-06 00:16:30

お礼

evaluate…
ワークシート関数について調べても
全然目にできない内容でした。

他にも色々…
ありがとうございます。

投稿日時 - 2013-02-09 13:13:33

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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))
としないとダメです。

投稿日時 - 2013-02-05 23:55:14

お礼

ありがとうございます。
お礼が遅れ住みません。

実はコピーでも困っているのですが
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
と、すればいい気がしますが、
言語設計が困難になるのでしょうかね

投稿日時 - 2013-02-09 12:57:12

あなたにオススメの質問