CDの保有枚数を教えてください

OKWave質問2回目です。
Excel VBAを最近始めたばかりのカケダシからの質問で申し訳ないのですが、
質問させていただきます。(アホみたいな質問かもしれませんがすみません。)

Excel2000を使っております。
理由があって下のVBAのコードをSheet1に書いています。
数値データがSheet2のA3からE50まで入っています。

Sheet1に書いたコードは
WorksheetFunction.Max(Worksheets("Sheet2").Range("A3:A50"))
は問題なく出来るのに
WorksheetFunction.Max(Worksheets("Sheet2").Range(Cells(3, 1), Cells(50,1)))
はSheet1からはエラーで実行できません・・・
Sheet1からシートをまたいでSheet2のデータをWorksheetFunction.とCells使って
どうこうすることは出来ないのでしょうか?

良くないやり方かもしれませんがCells使う理由は、列をずらしてループで回して最大値を
A~Eまで取得していこうかと考えているのでわざわざCells使ってます・・・
Sheet2にコードを移してコードのWorksheets("Sheet2").を削ればとりあえずエラーは回避
できるという話なんでしょうけれども・・・仕様だと言われてしまえばそれまでですが^^;
訳があってSheet1からやりたいので・・・。

すみませんが、(1)上記の方法は何故駄目なのか?、(2)SheetまたいでMaxを簡単に次々取得
する方法、などありましたら宜しくお願いいたします。

A 回答 (4件)

>(1)上記の方法は何故駄目なのか?


 ⇒Range内のCellsがSheet1配下になっているからです。Rangeと同様にSheet2配下に
  すれば解決です。
  セル範囲ならば他の方法もある(例えば、Resize等)が如何でしょうか。

>(2)SheetまたいでMaxを簡単に次々取得する方法
 ⇒一例です。
  Dim wk(1 To 5)
  For i = 1 To 5
  wk(i) = WorksheetFunction.Max(Sheets("Sheet2").Cells(3, i).Resize(48))
  Next
    • good
    • 0
この回答へのお礼

mu2011様、丁寧な説明有難う御座います。質問(1)に関してANo.1~3で教えていただき、単に私の知識不足だったみたいで申し訳ないです。面倒くさい質問(2)までこたえていただけたのはmu2011様だけだったので、非常に感謝しております!結局質問(2)の方は自己解決してしまいまして、mu2011様の配列を使う方法の方がかなりシンプルでスリムなので、参考にさせていただきます!有難う御座いました!

お礼日時:2011/10/13 19:32

Sheet1のVBAコードにWorksheetオブジェクトを省略して書いたRange(Cells)は「Sheet1の」範囲になります。


つまり、

> WorksheetFunction.Max(Worksheets("Sheet2").Range(Cells(3, 1), Cells(50,1)))

このCellsはSheet1のセル範囲を見ている訳ですが、そうすると「Sheet2の中のSheet1のセル範囲」という矛盾した表記であるという事になる訳です。

コード例については既に回答があるので省略します。
    • good
    • 0
この回答へのお礼

D-Matsu様、詳しい説明有難う御座いました。噛んで含むように良くわかりました!結果的には単純な自分のミスで、ひとえに私の勉強不足でしたね^^;すみません。どうりでSheetの方のデータが出てくるなぁとはおもっていたのですが。
1行で書けるANo.1を参考にさせていただきましたが、D-Matsu様の説明が、説明文としては一番わかりやすかったので、他の方々の文章を読んだ後でさらに納得できました。有難う御座いました!

お礼日時:2011/10/13 19:22

私も同じ書き方をして、同じ指摘をされた事があります。


こんな書き方でいいかと。

With ThisWorkbook.Worksheets("Sheet2")
MsgBox Application.WorksheetFunction.Max(.Range(.Cells(3, 1), .Cells(50, 1)))
End With

Cellsプロパティも、Rangeと同じように扱ってやらないと。
何処にくっついてるプロパティか書かないと駄目なんです。
乱暴に省略しても動くんですけど、省略しない方がいいです。
    • good
    • 0
この回答へのお礼

有難う御座います!乱暴に(はしょって)書いても今まで動いてしまっていたんですね^^;はしょってたというより実はRangeの前辺りに書いておけばRange以下まで有効だと思っていたので・・・省略というより知らずに思い込みでrangeでいくのだからRangeの中身に宣言付けずにcells書いてもいくだろうという感じで^^;
良くわかりました!勉強不足で申し訳なかったです。結果的にたいしたことではなかったかもしれませんが、逆に凄く勉強になしました!小さな抜けが大きなミスにつながったみたいで、
基礎をおろそかにしてはいけないなぁ・・・と思っています!
1行で書けるANo.1を参考にさせて頂きましたが、mapphi様の説明もわかりやすくて本当に有難う御座いました。

お礼日時:2011/10/13 19:05

「CellsがSheet1を基準に考えてしまっているから」です。


つまり、
MsgBox (WorksheetFunction.Max(Worksheets("Sheet2").Range(Worksheets("Sheet2").Cells(1, 1), Worksheets("Sheet2").Cells(3, 1))))
とかなら、大丈夫です。
    • good
    • 0
この回答へのお礼

有難うございます。出来るんですね!というか、ただ単にCellsの前にもWorksheet指定しなければ駄目なんですね。Rangeの前にしておけばOKだと思っていました・・・勉強不足ですみませんでした。どうりでsheet1のセルに入ってるものが出てきたのでおかしいとは思っていましたが。なるべく1行で行ける書き方を探していたので凄く助かりました!有難う御座いました!!

お礼日時:2011/10/13 18:47

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