プロが教える店舗&オフィスのセキュリティ対策術

よろしくお願いします。
-------------------------------------
A列--B列--C列--D列
123--123--512--535
264--533--111
-----222
-----○--------○--
-----------------------------------------
上記のような表があるとして、B列とD列の○の箇所に合計を出したいと思います。
合計を出す行は、固定されているのではなく、B列とD列のデータの多いほうの下の合計を出したのですが、
D列のほうが長いときには、END+方向キーとOffsetで何とか、合計を出したい行までセルを持っていくことはできるのですが、B列のほうがデータが多い場合は、一番下の行までセルを持っていくことができません。
と、オートSUMの操作をマクロに記憶をすると、合計範囲が絶対参照になってしまい、合計する範囲がそのつど変わってしまう場合の処理の仕方がわかりません。
上記のような表を、抽出機能で作成しており、たくさんの抽出結果の合計を出さなければならなく、現状は、一つずつ、合計を出しているしだいです。
使用ソフト EXCEL2000 Win2000

A 回答 (5件)

’最終行


EndRow = Worksheets(1).UsedRange.Rows.Count + Worksheets(1).UsedRange.Row - 1

’最終列
EndCol = Worksheets(1).UsedRange.Columns.Count + Worksheets(1).UsedRange.Column - 1
これでよいですか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
最初 Worksheets(1).UsedRange.Row
の意味がわからなかったのですが、先頭行がわかるんですね。大変勉強になりました。

お礼日時:2005/02/21 17:45

#4です。

コードにミスがありました。訂正します。

Sub Sample()の方で、

Cells(R+1,"A")="=SUM(A1:A" & R ")"

だとエラーですね。m(__)m

Cells(R+1,"A")="=SUM(A1:A" & R & ")"

に訂正します。
    • good
    • 0

マクロ編-------------------------------------------------------------------



ユーザー定義関数を作成してみました。

GetMaxRow はシート名と列範囲を引数とし、指定シート指定列における最下行を返えします。また、シートが存在しなかったり、列範囲の指定方法に誤りがあるとFalseを返します。使い方は

=GetMaxRow("Sheet1", "A:E")

でSheet1のA:E列のうち最下行を得られます。この関数で得られた最終行の次行に合計を書きこめば良いでしょう。


Sub Sample()

  Dim R As Long
  
  R = GetMaxRow("Sheet1", "A:E")
  'エラーだと0=Falseが返されています
  If R Then
   Cells(R+1,"A")="=SUM(A1:A" & R ")"
  Else
    MsgBox "不正な引数です"
  End If

End Sub

'指定シート指定列で最下行を返す
Public Function GetMaxRow(strSheetName$, strColNumber$) As Long

  Dim i As Integer
  Dim Sh As Worksheet
  Dim C()

  On Error GoTo ErrorHandler
  Set Sh = Sheets(strSheetName)
  With Sh.Columns(strColNumber)
    ReDim C(.Columns.Count + 1)
    For i = .Column To .Column + .Columns.Count
      C(i) = Sh.Cells(65536, i).End(xlUp).Row
    Next i
  End With
  GetMaxRow = Application.WorksheetFunction.Max(C)

ExitHandler:
  Set Sh = Nothing
  Exit Function
ErrorHandler:
  GetMaxRow = 0
  Resume ExitHandler
End Function


一般操作編----------------------------------------------------------------

発想を変えて、合計欄を1行目に持ってくる方法です。
2行目に見出し、3行目からデータという作りにします。1行目の合計はSUM関数ではなく、

=SUBTOTAL(9,A3:A65536)

とします。こうすれば、あとからデータを追加しても合計欄の修正は不要ですし、SUBTOTAL関数にしておくことで、フィルターにも対応しますよ。
    • good
    • 0
この回答へのお礼

何とか完成することができました。ありがとうございます。

一般操作編のほうは、フィルターのことも考えていただいたようですが、今回は、オートフィルタではなく、フィルタオプションをマクロに登録して一度に複数の条件で表を抽出していたため、使用することができませんでした。

とても勉強になりました。私も早くKenKen_SPさんのようになりたいものです。

お礼日時:2005/02/23 16:08

 特定の行に移動させるのでしたらマクロではなくハイパーリンクで移動させたほうが簡単かと思います。


私のは今エクセル2003なのでやり方は少し違うかもしれませんが、一行目は多分項目等が書かれていて変更することはないと思いますので、適当なセル(たとえばA1)を選んで挿入→ハイパーリンクで最終行の適当なセルを指定すれば、A1をクリックするとそこにカーソルが飛んでいきます。
 ハイパーリンクの表示は下線と色が付きますが、気になるようでしたら、書式→スタイルで「ハイパーリンク」と「表示済みのハイパーリンク」の書式を他と同じものに変更することができます。
    • good
    • 0
この回答へのお礼

今回は
>特定の行に移動させる
のではないので、質問をさせていただいたしだいです。

ありがとうございました。

お礼日時:2005/02/23 16:11

'列の設定


列 = 4
'最終行の取得
Cells(1, 列).End(xlDown).Select
行 = ActiveCell.Row + 1
'合計
範囲 = Range(Cells(2, 列), Cells(行, 列))
Cells(行, 列) = Application.WorksheetFunction.Sum(範囲)

その都度列数を設定してもいいですが、列の部分に有る程度の法則性があるのならループさせたら楽になりそうです。
    • good
    • 0
この回答へのお礼

回答本当に感謝いたします。
教えていただいた方法を試してみると、
Cells(1, 列).End(xlDown).Select
行 = ActiveCell.Row + 1
で、4列目の最終行の下に行くことはできるのですが、
2列目が10行目までデータが入っていて、4列目は3行目までしかデータが入っていないばあは、4列目の11行に合計を出すようにしたかったのですが・・(説明べたですみません)
>範囲 = Range(Cells(2, 列), Cells(行, 列))
>Cells(行, 列) = Application.WorksheetFunction.Sum(範囲)
上記の方法と、#1の方の方法を組み合わせると何とか自分の出したいものができそうです・・(これからですが・・)
勉強になりました。ありがとうございます。

お礼日時:2005/02/21 17:53

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