• ベストアンサー

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

質問です。 シート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))) の部分がおかしいと思うのですが、どうすればよいでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

>Worksheets("シート1").Select.WorksheetFunction._ >Average(Range(Cells(e, g + 2), Cells(f, g + 2))) Worksheets("シート1").Select. が不要です。 そして、Range,Cellsの前にWorksheets("シート1")を付けます Worksheets("シート2").Cells(3 + g, 3 * c) = _  WorksheetFunction.Average(Worksheets("シート1").Range(Worksheets("シート1").Cells(e, g + 2), Worksheets("シート1").Cells(f, g + 2))) これでは長すぎるので、Withステートメントを使って With Worksheets("シート1")  Worksheets("シート2").Cells(3 + g, 3 * c) = _    WorksheetFunction.Average(.Range(.Cells(e, g + 2), .Cells(f, g + 2))) End With として方が見やすいですね。 以上です。

322444
質問者

お礼

なるほど、こんなに上手に書けるんですね! はやくこのようにスラスラとスマートにプログラムが かけるようになりたいです。 ありがとうございました。

その他の回答 (1)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>と書いたのですが、上手くいきません。 Cellsに変数を入れる前に実数を入れてコードが正しく動くか確認しましょう。 With Worksheets("Sheet1")   Worksheets("Sheet2").Cells(3, 3).Value = _     WorksheetFunction.Average(.Range(.Cells(3, 4), .Cells(10, 4))) End With

322444
質問者

お礼

with 関数を使えばよかったんですね。 勉強になりました。 ありがとうございます。

関連するQ&A

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • 異なるシートの配列を参照し、相関係数を求める方法

    visual basicを学んでまだ1週間です。 Sheet1とSheet2に配列が格納されているのですが、これらを用いて相関係数が求めたいのですが、うまくいきません。 どのように書いているかというと、 Sub 2つのシート間の配列から相関係数を求める() Dim correlation as Double correlation = Application.WorksheetFunction.Correl(Worksheets("Sheet1").Range(Cells(1, 2), Cells(1, 567)), Worksheets("Sheet2").Range(Cells(1, 2), Cells(1, 567))) Cells(2,1).Value = correlation End 添削よろしくおねがいします。

  • 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させて実行しています。

  • 複数のシートで各シートをアクティブについて

    複数(10個ほど)のシートで各シートをアクティブにして次のようなコードを実行するとシートが次々と代わって表示されます。シートを1に固定しながら出来る方法はありませんか Worksheets(SN).Activate Sheets(SN).Cells(gyou, 24).Value = Application.WorksheetFunction.Average(Sheets(SN).Range(Cells(gyou - (ma1 - 1), 22), _ Sheets(SN).Cells(gyou, 22))) Worksheets(SN).Activate このコードを外すとエラーになります

  • Unionでの他のシートの参照について

    excel2007のマクロなのですが、データからグラフを作るときに、setsoursedataでデータ参照するときに、sheet1とsheet2からそれぞれデータを選択したいので、Unionを使ってそれぞれの範囲を結合しようとしたのですが、 worksheets("sheet1").Select Set owarine = Range(Cells(st, 5), Cells(en, 5)) Worksheets("sheet2").Select Set BB = Union(Range(Cells(st, 3), Cells(en, 3)), Range(Cells(st, 5), Cells(en, 6))) Set sphere = Union(owarine, BB) ActiveSheet.ChartObjects.Add(5, 18, 550, 250).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=sphere, PlotBy:=xlColumns としても、'Union'メソッドは失敗しました'_Global'オブジェクトと表示されてできません。どうすればいいのでしょうか?

  • 繰返し計算の高速化の方法をご指南願います

    いつも大変お世話になり有難うございます。 VBA初心者です。 早速ですがお尋ねします。 VBAで毎回条件変えて繰返すプログラムを作りましたが終了まで数時間かかり困ってます。 プログラムの全体の流れは、 約25000個のデータをあるパラメータで計算→計算結果とその時のパラメータをセル(i、1~9)に記入→パラメータを変更→約25000個のデータをあるパラメータで計算→計算結果とその時のパラメータをセル(i+1、1~9)に記入→・・・ というものです。繰り返し回数は1万回前後です。パラメータをもとに計算する式は簡単な加減則で、文字数の都合もあり割愛いたします。 試行錯誤の結果、 1.繰り返し計算の途中にある以下の多くのセル記入文の部分 2.1列目のセルに(IF(C77=100,"測定終了",IF(C77-J77>0,"下降","上昇")))、(IF(C78=100,"測定終了",IF(C78-J78>0,"下降","上昇")))・・・の式が約25000行に渡りは入っている事 3.2~4列目に時間、測定データ1、測定データ2が約25000個ずつセルに入っている事 がネックと分かりました(ファイル容量約3MB)。 Q1、以下のセル記入方法を改善して高速化できる方法があればご指南いただけないでしょうか? なおセルへの記入はWorksheets(1)にあるグラフに使用するのと、記入されたデータを後でソートして傾向を見るためのものです。また以下Rangeの値は一回の計算毎に変化するものです。 Range("J74") = Application.WorksheetFunction.Sum(Range("J76:J30000")) Range("K74") = Application.WorksheetFunction.Sum(Range("K76:K30000")) Range("L74") = Application.WorksheetFunction.Count(Range("J76:J30000")) Range("M74") = Application.WorksheetFunction.Count(Range("K76:K30000")) Worksheets(2).Cells(i, 1).Value = i - 1 Worksheets(2).Cells(i, 2).Value = Range("J74") Worksheets(2).Cells(i, 3).Value = Range("K74") Worksheets(2).Cells(i, 4).Value = Range("L74") Worksheets(2).Cells(i, 5).Value = Range("M74") Worksheets(2).Cells(i, 6).Value = Range("B32") Worksheets(2).Cells(i, 7).Value = Range("B33") Worksheets(2).Cells(i, 8).Value = Range("B31") Worksheets(2).Cells(i, 9).Value = Range("B34") Q2、(IF(C77=100,"測定終了",IF(C77-J77>0,"下降","上昇")))・・・、の式によりプログラムが遅くならない方法は考えられるでしょうか?(一回の計算毎に”下降””上昇”の数をcountしているため計算無効にすると困ります) Q3、時間と測定データ1,2は繰返し計算のプログラムで使用する元データのため消してはまずいのですが、データの多さがプログラム速度に悪影響与えない方法はあるでしょうか? 画面更新無効などは設定しています。 winXP、excel2002、cpu2.4GHz、RAM1GB、です。 字数の都合で前後式は省略してます。すみません。 ネットや書籍で調べ、当初より多少は速度が改善されたのですが、上記問題を残し力尽きてしまいました。 質問のうち一つでも結構ですので、ご指南よろしくお願いします。

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • TextBoxの値を複数シートのセルに記入する

    よろしくお願いします。 TextBoxの値を複数シートのセルに記入するようにしたいのですが 一つのシートにしか記入されません。 醜い構文ですみません。 Private Sub CommandButton1_Click() Dim a As Long Dim b As Long Dim f As Long Dim h As Long Dim c As Range Dim d As Range Dim e As Range Dim g As Range With Worksheets(Array("駐車状態", "材料", "外壁1", "外壁2", "屋根1")).Select Set c = Cells(1, 2) For a = 1 To 140 Step 7 Set c = Union(c, Cells(a, 2)) c = TextBox1.Value Next c.EntireRow.Select Set d = Cells(1, 4) For b = 1 To 140 Step 7 Set d = Union(d, Cells(b, 4)) d = TextBox1.Value Next d.EntireRow.Select Set g = Cells(2, 2) For h = 2 To 141 Step 7 Set g = Union(g, Cells(h, 2)) g = TextBox2.Value Next g.EntireRow.Select Set e = Cells(2, 4) For f = 2 To 141 Step 7 Set e = Union(e, Cells(f, 4)) e = TextBox2.Value Next e.EntireRow.Select End With End Sub

  • VBA フィルター後に重複を1件としてカウントした

    VBA初心者です。 Sheet1にリスト、Sheet2にボタンなどを配置し、Sheet1のリストにフィルターをして、その結果の中の重複分を1件としてカウントして、合計で何件あるのかというものを作りたいと思っています。 Sub 計算() Worksheets("sheet1").Range("A1").AutoFilter Field:=10,Criteria1:=Worksheets("sheet2").Range("C3").Value Count = WorksheetFunction.Subtotal(3,Range("j2:j577")) n = WorksheetFunction.Subtotal(3,Range("j2:j577")) Application.Evaluate("=SUMPRODUCT(1/COUNTIF(C1:C577,C1:C577))") Worksheets("sheet2").Range("E3").Value = n & "件" Worksheets("sheet2").Select End Sub というような感じで作ってみましたが、重複を1件として数えず全件の件数が出てしまいます。 初心者なのでいろいろ不備はあるかと思いますが、どのように直せばよろしいか、どうか教えていただけますようよろしくおねがいいたします。

  • 別シートに罫線がひけない

    表題どおりなのですが、別シートに罫線がかけません。 例えばSheet1にあるボタンをクリックするとSheet2に罫線をかく。 (コードは下記参照)としたときにエラーが発生します。 「1004 Rangeメソッドは失敗しました。」 そのため「ActiveSheet.」をはずしてみると”Sheet1”に描画されてしまいます。 なにか宣言が必要なのでしょうか? Private Sub CommandButton1_Click() Worksheets("sheet2").Activate '.Selectでも同じ For i = 4 To Range("G30").Column ActiveSheet.Range(Cells(4, i), Cells(30, i)).Borders(xlLeft).Weight = xlThin ActiveSheet.Range(Cells(4, i), Cells(30,i)).Borders(xlLeft).LineStyle = xlContinuous Next End Sub