Excel2000で範囲内の合計を簡単に出す方法

このQ&Aのポイント
  • Excel2000で範囲内にあるデータの合計を簡単に出す方法を知りたいです。
  • 現在は毎日SUM関数を使って合計を出していますが、もっと簡単な方法があれば教えてください。
  • また、合計を表示するセルの最終行を柔軟に設定する方法も知りたいです。
回答を見る
  • ベストアンサー

範囲内に合計を出す

毎日SUM関数で合計を出していますが、もっと簡単に出せないかと思い質問しました。H7からデーター(数字)が下に入っていきます。(H7.H8.H9.・・・・・)日によ って最後の行が違います。(シートは毎日違いますが最初に入る場所はH7からと決まっています。)昨日はH7~H20でした。今日はH7~H27ですと日によってばらばら です。計算のしかたですが、H20で終わった時は、合計ボタンを押したらH7~H20までをH1に合計を表示してH列の最終行の次も合計を表示する所まではなんとか 出来ましたが、L列から以降のセルにデーターがあっても最終行と判断しない様にするにはどうすればいいですか。(A列~K列で最終行がK25の時M列のM30にデーターがある時はH31が最終行の次と表示しますが本当はH26と表示してほしいです)アプリケーションはExcel2000です。よろしくお願いします。 Private Sub CommandButton1_Click() Dim maxRow As Long maxRow = Application.Max(Range("H65536").End(xlUp).Row, 5) Range("H1") = Application.Sum(Range("H7:H" & maxRow)) Range("A1:K2").Copy With ActiveSheet.UsedRange .Cells(.Count + 1).Select End With ActiveSheet.Paste Application.CutCopyMode = False With ActiveSheet.UsedRange .Cells(.Count + 1).Select End With End Sub

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

データ単位はいつも2行として、2行単位でコピーしています。 最終行を求めたら、それは2行を1行にした上の行なので、貼り付け先の行は+2すればいい事になります。 L列には余分な操作はしません。 コピーしているのはA~K列です。あっていればいいんですが・・・・・ Private Sub CommandButton1_Click()   Dim maxRow As Long   Dim cRow As Long   Dim col As Integer   maxRow = 7   For col = 1 To 11     cRow = Cells(65536, col).End(xlUp).Row     If maxRow < cRow Then maxRow = cRow   Next   Range("H1") = Application.Sum(Range("H7:H" & maxRow))   Range("A1:K2").Copy   Cells(maxRow + 2, 1).Select '2行単位なので書き込み行は2行下   ActiveSheet.Paste   Application.CutCopyMode = False   Cells(maxRow + 2, 1).Select End Sub

kkazumi
質問者

お礼

完璧です。どうもありがとうございます。また、よろしくお願いします。カズミ

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

>ごまかしをやらずに出来ませんか。よろしくお願いします。 できると思いますが、なにぶん、何を行いたいのか全体が理解できていません。少し補足して下さい。 1.質問ではRange("A1:K2")をコピーしています。   しかし1行目に合計を表示しているのはH列だけです。A~Kをコピーする意味は   A~K全てH列と同じことをされているわけですか?(A~K列すべてH列のように合計計算をしている) 2.1、2行目を最終行にコピーしていますが、1行目と最終行に両方書いてしまえばコピーする必要が   なくなるような気がしますが,書き込んだらダメですか。 3.#2の補足に『最終行がセル結合していて』とありますが、質問には『シートは毎日違いますが』とあります。   なぜ、最終行が結合されているのでしょうか。結合セルはK1とK2みたいですが、K1とK2は最初から結合されていて、   1、2行目をコピーすることで結合セルが下のほうにできるわけでしょうか。    K1とK2は最初結合させている     →コピーして最終行に書く     →結合セルが下に発生     →データを消して再入力(ア)     →結合セルの行が最終行になることがある     →最終行をコピーする時点でエラー発生      のようなことでしょうか。      そうなら、(ア)の時点で、入力する箇所の結合を解除すればいいでしょう。 4.K1とK2は結合されている必要があるとして、K1とK2をコピーする時、コピー先も結合する必要が   あるのでしょうか。   例えば、K1とK2を20、21行目にコピーする時、K1を20行目にコピーするだけではダメですか。 5.A1:K2をコピーしていますが、2行目までコピーしているのは、K1とK2が結合されているからですか。 >L列に適当な一文字を入れL列のフォントを白にしてA列~K列として使用しています。 この意味はほとんど分かりません。

kkazumi
質問者

補足

説明不足ですみません。もう少し詳しく書きます。表ですが、セルを結合して2行を1行として使用しています。5,6行目が項目で7行目(7,8行目)からデータが入ります。データも貼り付けで別のシートからもらってA列からL列(1行「実際は2行」)に貼り付けます。後は、このパタンでデータが入っていきます。H列が数字のデータです。最後に合計を表示するのですが、H列の最終行に書いた後左右隣の行を飾り付けするのがマクロでは大変だと思い、A1~L2で作っておいてH1,H2(H1)セルに合計を書き最終行の次にコピーしています。A1~L2は、非表示にしています。最終行をL列とする為です。L列のみセル結合はしていません。文字も白にしています。 よろしくお願いします。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

やりたい事はこんなことですか。最後のコピーの意図が分かりませんが。 Private Sub CommandButton1_Click()   Dim maxRow As Long   Dim cRow As Long   Dim col As Integer   maxRow = 7   For col = 1 To 11     cRow = Cells(65536, col).End(xlUp).Row     If maxRow < cRow Then maxRow = cRow   Next   Range("H1") = Application.Sum(Range("H7:H" & maxRow))   Range("A1:K2").Copy   Cells(maxRow + 1, 1).Select   ActiveSheet.Paste   Application.CutCopyMode = False   Cells(maxRow + 1, 1).Select End Sub

kkazumi
質問者

補足

思ったように出来ています。一つだけ気づいたことがあります。最終行がセル結合していてそのセル結合した中にデーターがあるとエラーがでます。つまり、A1~K2の中にセル結合があります。K1とK2で、データーも入っています。今ごまかしでA列~K列をA列~L列にして使用しています。L列に適当な一文字を入れL列のフォントを白にしてA列~K列として使用しています。ごまかしをやらずに出来ませんか。よろしくお願いします。最後に書いたマクロはここまで出来ていますと言うことです。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

(1)range("a:b").CurrentRegion.Lows.Countなどとやると、A列が3行まで、B列が4行まで、C列が6行までデータが入っているとして、6と出てしまいますね。お困りの点は判りました。 (2)第1行目に合計をセットするなら、  =sum(a2:a30)関数は,例えA20~A30までに数値が入ってなくても  エラーにはならず、A1からA19までの数値を加えてくれるので、A30を適当な行数にしておけば、本件のような質問の必要性はなくなるのではないでしょうか。 (3)データ入力最終行の直ぐ下行にその列の合計を出すのも、各列で合計の表示セルが異なり、私の仕事の経験から、見にくいと思いますので合計行は同じ行にされては。 (4)データ入力最終行の直ぐ下行にその列の合計を出すのなら、 極く初歩的に Sub test01() Set wf = Application.WorksheetFunction For j = 1 To 2 '2は適当  For i = 1 To 50 '50は適当   If Worksheets("sheet1").Cells(i, j) = "" Then   Worksheets("sheet1").Cells(i , j) = wf.Sum(Range(Cells(1-1, j),   Cells(i - 2, j)))   ' MsgBox i   Exit For   End If  Next i Next j を作って見ましたが、上手くやらないと、2回目以降が危険で、前回の合計まで加えてしまうおそれあり。毎回各列入力終了後、前回合計が残っていない前提なら、上記で、直ぐ下の行に合計が出せます。

関連するQ&A

  • 最終行に合計(最終行が列によって異なる場合)

    エクセルVBAに於いて質問させて頂きます。 タイトルにも書かせていただきましたが、 A列に行数可変のデータ(文字列)があり、 B列に行数可変のデータ(数字)があり、 A列の行数>=B列の行数の条件とき、 A列の最終行+2の位置のA列に文字で合計 A列の最終行+2の位置のB列にsumを表示する場合、 どのようにすれば出来ますでしょうか。 A列の最終行+2の位置のA列に文字で合計は With Range("A3") .End(xlDown).Offset(2, 0).Formula = "合計" End With でいけると思うのですが、 A列の最終行+2の位置のB列にsumを表示する場合どのようにすればいいのかわかりません。 ご教授のほどお願い致します。

  • Rangeオブジェクトに格納できない

    A1からD5までデータが入っているのですが、 そのデータの情報をRangeオブジェクトに格納する事は出来ないのでしょうか? vbaで Sub Sampsle() Dim r As Range r = ActiveSheet.UsedRange End Sub をやろうとしてるのですが、 実行時エラー_91「オブジェクト変数またはWithブロック変数が設定されていません」になります。 r に格納しちゃえば、最終列が何列目か最終行が何行目か、A1の値は何か、などしゅとくできるんじゃないかなー と思ったのですが、できないのでしょうか?

  • UsedRange って、「空白セル」までも参照するのですか?

    Windows XP Home Edition Office XP Personal 2002 Excel 2002 1行~200行までのみに値があります。他は空白です。 UsedRange は、 何らかの編集が行われているセル範囲を選択するということですが、 確認のために、 3、 4 にして実行しますと、 3はColumns("G:H") を全部選択してしまいます。 書式を変更した「空白セル」までも、UsedRangeとなってしまうのでしょうか。 私は、3も "G1:H200" を選択すると思っていたのですが、 確認のしかたが間違っておりますでしょうか? よろしくお願い致します。   '1   With ActiveSheet.UsedRange.Columns("G:H")   '2   With ActiveSheet.Range("G1:H200")   '3    ActiveSheet.UsedRange.Columns("G:H").Select   '4    ActiveSheet.Range("G1:H200").Select

  • Excel VBA UsedRange範囲ソート

    図のような中抜の一覧ができているとき、商品コードで空行を飛ばして並び替えをしたいのですが、下記だと空行まで(チョコからわたがしまで)しか対象になりません。 ---------------------------- Sub 並べ替え() With ActiveSheet.Sort .SortFields.Clear 'Key:=Range("A3")でソートする列とタイトル位置を指定 .SortFields.Add Key:=Range("A3"), SortOn:=xlSortOnValues, _ Order:=xlAscending '.「商品コード」("A3").でソート .SetRange Range("A3").CurrentRegion ' 先頭行をタイトル行と見なす .Header = xlYes .Apply End With End Sub ------------------------- 範囲をCurrentRegion ではなくUsedRangeに広げるには、どこをいじったらいいでしょうか。 求める結果としては「商品コード」の列が登り順に揃ってほしいのです。 データ処理としてはソートをかければいいだけですが、UsedRange(範囲内のセルを選択し、Ctrl+Shift+Endキーで選ばれる範囲)をみつけてソートをかける方法を知りたいのです。

  • マクロ EXCELの範囲をコピーして貼付け

    『End(xlDown).Row』で取得した値を使ってセルの範囲指定&コピーを行い、 新しく追加したシートに貼り付けたいのですがうまくいきません。 Sub attendanceJoin() Dim MaxRow As Integer 'シートの最終行の値 Workbooks("test.xls").Activate Dim NewWorkSheet As Worksheet Set NewWorkSheet = Worksheets.Add() '新しいシートを追加する MaxRow = Worksheets(2).Range("M1").End(xlDown).Row  'A列の最終行を取得 NewWorkSheet.Name = "統合"  '新しく追加したシートの名前を変更 With Workbooks("test.xls") .Worksheets(2).Range("A1:M&MaxRow").Copy   'コピーするセルの範囲を指定    '↑ここでエラー。.Worksheets(2).Range("A1:M38").Copy を指定するイメージです。 .Worksheets("統合").Range("A1").PasteSpecial End With End Sub どなたか間違っている箇所のご教示お願い出来ますでしょうか。 どうぞよろしくお願い致します。

  • エクセルVBAで値のカウントをしたい

    C列~AA列まで値が入っています 1行目にはタイトル 2行目からそれぞれ値が入っており、終了行は毎回ランダムです 各列毎に値の合計と1以上の値の合計数を表示するために下記のマクロを使用しているのですが、もっとスマートな方法は無いでしょうか? 現在のマクロだとマクロ行数がとても多いものになっています。 Sub Count() With Range("C2") .End(xlDown).Offset(1, 0) = _ "=SUM(" & Range(.Address, .End(xlDown)).Address(False, False) & ")" End With '本当はCの最終行に直接COUNTIFを書き込みたいが、他のセルを使用しないと0になる Range("A1") = "=COUNTIF(C2:C10000,"">=1"")" Range("A1").Select Selection.Copy Range("C1").End(xlDown).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CommandBars("Stop Recording").Visible = False With Range("D2") .End(xlDown).Offset(1, 0) = _ "=SUM(" & Range(.Address, .End(xlDown)).Address(False, False) & ")" End With Range("A1") = "=COUNTIF(D2:D10000,"">=1"")" Range("A1").Select Selection.Copy Range("D1").End(xlDown).Offset(1, 0).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CommandBars("Stop Recording").Visible = False '以降AAまでセルの位置を変えた同一マクロを繰り返す End Sub

  • EXCELで印刷範囲指定

    マクロの記録で印刷範囲の指定を考えています。 以下のマクロを記録しました。 Sub 印刷範囲指定() Cells.Select With Selection.Font .Name = "MS Pゴシック" .Size = 9 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Range("A1").Select With ActiveSheet.PageSetup .PrintTitleRows = "$6:$8" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "&A" .RightHeader = "" .LeftFooter = "" .CenterFooter = "&P / &N ページ" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.78740157480315) .RightMargin = Application.InchesToPoints(0.78740157480315) .TopMargin = Application.InchesToPoints(0.984251968503937) .BottomMargin = Application.InchesToPoints(0.984251968503937) .HeaderMargin = Application.InchesToPoints(0.511811023622047) .FooterMargin = Application.InchesToPoints(0.511811023622047) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = 600 .CenterHorizontally = False .CenterVertically = False .Orientation = xlLandscape .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 100 End With ActiveWindow.View = xlPageBreakPreview ActiveWindow.LargeScroll ToRight:=1 ActiveSheet.PageSetup.PrintArea = "$A$1:$I$50" ActiveWindow.View = xlNormalView Columns("B:I").Select Columns("B:I").EntireColumn.AutoFit Range("A1").Select End Sub やりたいことは ・まず最初にcsvファイルをxlsファイルに取り込む機能をつけたい。 ・取り込んだcsvをシートの一番最後につける。 そのファイルを以下のように設定していきたいです。 ・列の印刷範囲を数ある列のうちA列からI列までとする。 ・行の印刷範囲をA列の最終行までとしたい。 上記マクロでここを修正すればいいというところがあれば教えてください。。

  • エクセル・マクロで最終行を表示することについて

    エクセル・マクロで最終行を表示することについて C列の最終行を表示する場合、以下のマクロで表示できます。 今回はC列に C1=A1&B1 C2=A2&B2  ↓ という式が入力されている場合について質問します。 A列とB列が空白の場合、C列には0が表示されます。 したがって、下記のマクロだとこの0の行が最終行となります。 私の希望はこのC列の0は空白とみなし、0以外の値や文字が入力されている最終行を表示することです。 どのような工夫をすれば可能でしょうか? ご指導よろしくお願いします。 Sub 最終行表示() maxrow = Range("c65536").End(xlUp).Row MsgBox maxrow End Sub

  • エクセルVBAでUsedRangeの範囲について

    たとえば、新たにワークシートを挿入し、A1とC3のセルにのみ入力し、他のセルには一度も入力や書式設定をしなかった場合、 MsgBox ActiveSheet.UsedRange.Addressは、当然 $A$1:$C$3 を返しますね。 この場合、仮にD列から右に非表示の列があってもUsedRange.Addressは変わりません。 ところが、4行目以下に非表示行があった場合は何故か非表示行までの範囲がUsedRange.Addressに含まれてしまいます。 仮に上記の入力状態のままで、20行目とF列を非表示にすると、不思議なことに $A$1:$C$20 が返ってきます。 どうしてUsedRangeの取得では、行と列との非表示の場合の取り扱いが異なるのでしょうか? ( ̄∇ ̄; ?( ̄□ ̄; ? Σ( ̄0 ̄;)?

  • 印刷範囲の設定がうまくいきません。教えてください

    エクセルのマクロで、データの5列目の最終行を探し、その行の一列目から右に12列、上に20行の範囲を印刷したいのですが、下記のように記述すると、一列目の一行目から12列目の最終行まで印刷されてしまいます。 どのように記述すればよいのでしょうか。 Cells(ActiveSheet.Rows.Count, 5).End(xlUp).Offset(0).Select ActiveCell.Offset(0, -4).Range("a1").Select 上 = ActiveCell.Row - 20 右 = 14 Range(ActiveCell, Cells(上, 右)).Select Range(ActiveCell, Cells(上, 右)).Activate ActiveSheet.PageSetup.PrintArea = ActiveCell.CurrentRegion.Address ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

専門家に質問してみよう