なぜ出来ないのか?

このQ&Aのポイント
  • Excel VBAでSheet1からSheet2のデータを参照する方法について質問です。
  • WorksheetFunction.Max(Worksheets("Sheet2").Range("A3:A50"))は問題なく実行できますが、WorksheetFunction.Max(Worksheets("Sheet2").Range(Cells(3, 1), Cells(50,1)))はエラーになります。
  • Sheet1からSheet2のデータを参照する方法について教えてください。
回答を見る
  • ベストアンサー

何故出来ないのですか?

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を簡単に次々取得 する方法、などありましたら宜しくお願いいたします。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.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

nanjyamonjyahi
質問者

お礼

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

その他の回答 (3)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

Sheet1のVBAコードにWorksheetオブジェクトを省略して書いたRange(Cells)は「Sheet1の」範囲になります。 つまり、 > WorksheetFunction.Max(Worksheets("Sheet2").Range(Cells(3, 1), Cells(50,1))) このCellsはSheet1のセル範囲を見ている訳ですが、そうすると「Sheet2の中のSheet1のセル範囲」という矛盾した表記であるという事になる訳です。 コード例については既に回答があるので省略します。

nanjyamonjyahi
質問者

お礼

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

noname#171966
noname#171966
回答No.2

私も同じ書き方をして、同じ指摘をされた事があります。 こんな書き方でいいかと。 With ThisWorkbook.Worksheets("Sheet2") MsgBox Application.WorksheetFunction.Max(.Range(.Cells(3, 1), .Cells(50, 1))) End With Cellsプロパティも、Rangeと同じように扱ってやらないと。 何処にくっついてるプロパティか書かないと駄目なんです。 乱暴に省略しても動くんですけど、省略しない方がいいです。

nanjyamonjyahi
質問者

お礼

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

回答No.1

「CellsがSheet1を基準に考えてしまっているから」です。 つまり、 MsgBox (WorksheetFunction.Max(Worksheets("Sheet2").Range(Worksheets("Sheet2").Cells(1, 1), Worksheets("Sheet2").Cells(3, 1)))) とかなら、大丈夫です。

nanjyamonjyahi
質問者

お礼

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

関連するQ&A

  • 別のシートを参照して計算する方法

    質問です。 シート1に数値が入力してあり、そこで計算した結果をシート2に貼り付けるにはどのようにすればいいのでしょうか? Worksheets("シート2").Cells(3 + g, 3 * c) = _ Worksheets("シート1").Select.WorksheetFunction._ Average(Range(Cells(e, g + 2), Cells(f, g + 2))) と書いたのですが、上手くいきません。 おそらく Worksheets("シート1").Select.WorksheetFunction._ Average(Range(Cells(e, g + 2), Cells(f, g + 2))) の部分がおかしいと思うのですが、どうすればよいでしょうか? よろしくお願いします。

  • ExcelVBAにて異なるシート間での値貼り付け

    Excel VBAの異なるシート間での値のコピーと貼り付けに関して質問をさせてください。 私はExcel2007を使って、Sheet1のセルの値をsheet2に貼り付けようとして以下のコード(1)を書きましたが、うまくいきません。動作確認のためsheet1内での値のコピペを行うコード(2)を作成し実行したところ、正常に動作しました。 コード(1)をコンパイルしたときに表示されるメッセージは、[実行時エラー'1004':アプリケーション定義またはオブジェクト定義のエラーです] です。 質問としては、 Q1:等号(=)を用いた値の貼り付けは、異なるシート間に対応していないのでしょうか。 Q2:コード(1)を改良する場合、どのように書き直せばよいでしょうか。 アドバイスいただけましたら幸いです。 コード(1) Worksheets("Sheet2").Range(Cells(1, 10), Cells(5, 10)).Value = Worksheets("Sheet1").Range(Cells(1, 1), Cells(5, 1)).Value コード(2) Worksheets("Sheet1").Range(Cells(1, 10), Cells(5, 10)).Value = Worksheets("Sheet1").Range(Cells(1, 1), Cells(5, 1)).Value

  • エクセルマクロ offsetの使い方

    Sub tess() With Worksheets("Sheet1") Cells(1,11)=Application.WorksheetFunction.Max(Range("A1:A10")) End With End Sub 上記でA1~A10のうちの最大値1つがA12に表示されます。 ここで上記コードに手を加えて、例えばA12にA8の”下のセル1つの値”を表示したいのですが、 Cells(1,11)=offset.(-1, 0).Application.WorksheetFunction.Max(Range("A1:A10")) と”offset(-1, 0)” を加えても動きません。WorksheetFunctionを加えても動きません。 offsetを入れる位置と使い方がわかりません。是非よろしくお願いいたします。(OS:WindowsXP、Excel2003)

  • vbaの速度向上(sumif関数)

    エクセルvbaの速度を向上できないか、お知恵を貸していただきたく存じます。 以下のvba(sumif関数)をもっと速めたいです。何とかできないでしょうか。長い記載となり申し訳ないのですが、何卒よろしくお願い申し上げます。 myCnt7 = 2 Do Worksheets("●").Cells(myCnt7, 4).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 3), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 3), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 7).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 6), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 6), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 10).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 9), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 9), Worksheets("★").Range("C:C")) Loop While myCnt7 > 201 ※シート●のC列から3列ごとに、Sumifの検索条件があります。 ※シート●のD列から4列ごとに、Sumifの計算結果を出力させます。 ※計算対象シートは、シート◆とシート★の2つです。  シート◆のSumif合計から、シート★のSumif合計を差し引いています。  Sumifの条件自体は、どちらのシートも同じ(シート●)。 ※上記のSumif関数の記述は、3つですが、実際の記述は24あります。 ※すなわち、検索条件の組み合わせが24あり、201行分をmyCnt7でLoopさせて実行しています。

  • エクセルVBAでLOOKUP関数がうまくできません

    エクセルVBAでLOOKUP関数がうまくできません。 入力シートと判別用のシートがあり入力シートで入力した品名を検索値 として判別用シートで数値に置き換えた値をLOOKUPで検索したいのですが WorksheetFunctionクラスのVLOOKUPプロパティを取得できませんと 実行時エラーが出ます。検索しましたが修正方法がわかりません。 構文のどこが原因なのか教えてください。 VBA初心者です。よろしくお願いします。 sub test() Dim データ行 As Long Dim データ数 As Long データ行 = Cells(Rows.Count,8).End(xlUp).Row For データ数 = 11 To データ行 Cells(データ数 ,32) = Application.WorksheetFunction.VLookup(cells(データ数,8),Worksheets("判別シート").Range("B11:E110"),5,False) Next データ数 End sub

  • VBA セルコピーのエラー

    こんにちは。 Excel VBAの初心者です。 セルコピーについて教えてください。 シート1のセル範囲e4~aj4を、シート2の同じ場所に、そのままコピーします。 Worksheets(1).Range("e4:aj4").Copy Destination:=Worksheets(2).Range("e4:aj4") 上記だと普通に通るのですが、コピー元の行に変数を使用したくて、その前に一度下のように書き換えました。 Worksheets(1).Range(Cells(4, 5), Cells(4, 36)).Copy Destination:=Worksheets(2).Range(Cells(4, 5), Cells(4, 36)) するとエラー1004(アプリケーション定義またはオブジェク定義のエラー1004(アプリケーション定義またはオブジェク定義のエラー)が出て、通らなくなります。 単純なことだと思うのですが、初心者ゆえ困っております。 どなたかご教示いただけますと幸いです。 よろしくお願いいたします。

  • VBAのVLOOKUPの速度向上について

    VBAでVLOOKUPの速度向上について、お知恵を貸していただきたく存じます。 以下のVLOOKUPのVBAがおそく、速くしたいです。行数は2万行ぐらいです。 何卒よろしくお願い申し上げます。 Dim 範囲A As Range Set 範囲A = Worksheets("取引先").Range("A:H") On Error Resume Next myCnt5 = 2 Do Worksheets("受注データ").Cells(myCnt5, 49).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt5, 48), 範囲A, 6, False) myCnt5 = myCnt5 + 1 If Worksheets("受注データ").Cells(myCnt5, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt6 = 2 Do Worksheets("受注データ").Cells(myCnt6, 51).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt6, 50), 範囲A, 8, False) myCnt6 = myCnt6 + 1 If Worksheets("受注データ").Cells(myCnt6, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt7 = 2 Do Worksheets("受注データ").Cells(myCnt7, 53).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt7, 52), 範囲A, 6, False) myCnt7 = myCnt7 + 1 If Worksheets("受注データ").Cells(myCnt7, 1).Value < 10 Then Exit Do Loop 補足 上記VBAには記載していませんが、Application.ScreenUpdatingの停止、Application.Calculationを手動の設定はしています。

  • アクティブでないシートのセルを選択

    Excel VBAでアクティブでないシートのセルをSelectすることはできないのでしょうか。 Selectメソッドというのは,もともとそういうものなのでしょうか。 エラー: 「RangeクラスのSelectメソッドが失敗しました。」 コード Sub aaa() With Worksheets("Sheet2") .Range(.Cells(44, 1), .Cells(48, 21)).Select End With End Sub

  • Excel VBA 指定シートの取込

    こんにちは。 ExcelのVBAを使用して、異なるBookのシートを取込みたいのですが、 シートが無かった場合の処理方法がわかりません。 現在のコードは下記の様になっております。 With Workbooks.Open"BOOK1.xls" .Worksheets("Sh1").Cells.Copy ThisWorkbook.Sheets("Sheet1").Range("A1") .Worksheets("Sh2").Cells.Copy ThisWorkbook.Sheets("Sheet2").Range("A1") .Worksheets("Sh3").Cells.Copy ThisWorkbook.Sheets("Sheet3").Range("A1") .Close End With Book1に指定したシートが無い場合、何もしないようにしたいのですが、 どの様に書き換えれば宜しいでしょうか? よろしくお願いします。

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

専門家に質問してみよう