アプリ版:「スタンプのみでお礼する」機能のリリースについて

For i = 552 to 554 '最終行を自動取得したい
for j = 20 to 29  '最終列を自動取得したい
?????            '合計の式をいれたい
next j
net i

常に行数がかわるので最終業の+2行目に合計値をだしたいです。

自動でcells(557,"T").value = Ans にしたい
      ↑最終行の+2行目に合計値

添付したように合計値を取得したいのですが
わかる方お願いできませんでしょうか。

「初心者です VBAで合計を出したいです。」の質問画像

A 回答 (5件)

No.2です。



セルの範囲はこちらで適当に当てちゃいました。
計算結果を配列に入れる物ではなくセルに書き出す方法ですが、データは配列から取り出してます。

Sub try()
Dim r As Range, i As Long
Dim v

If Range("B2").Value = "" Then Exit Sub

Set r = Range("B2") 'データの基準セル

v = Range(r, r.CurrentRegion.SpecialCells(xlCellTypeLastCell)).Value

Set r = r.End(xlDown).Offset(3, -1)
r.Value = "合計"

For i = LBound(v, 2) To UBound(v, 2)

With Application
r.Offset(, i).Value = .Sum(.Index(v, , i))
End With

Next
Set r = Nothing
End Sub

------

ArrayListとか使おうかとも考えましたが、まずはExcelの機能のみで。(でもうちのは古いから今ので出来るか心配)
「初心者です VBAで合計を出したいです。」の回答画像5
    • good
    • 0
この回答へのお礼

このコードは非常にわかりやすいです。
こういう感じで頭に浮かんでくるように
なりたい。いろいろ挑戦します。
また、世界が広がりました。

お礼日時:2019/05/13 22:50

No.3の回答者です。



>配列を使うなら、配列を計算するサブプロシージャやユーザー定義関数を別に作ったほうがよいでしょう。

>配列を計算するプロシージャとは
>きになります。かなり気になります。

前言を撤回します。想像だけで実際い試してみないので、失礼しました。
私は、一般のワークシート関数ですと、エラーになると思っていました。それで、ユーザー定義関数しかないと思っていました。ユーザー定義関数の部分に、SUM関数を入れてみました。ご質問者さんは、加算・減算ですから、セルのアドレスなくても、計算が可能でした。
今まで、配列で抜き出して、total= total + a と書いてきたものが、置き換えられそうです。


'//
Sub Test_1() 'イレギュラー
Dim ret
Dim i As Long
ReDim ar(200, 0) 'プリセットで配列を作る(動的配列は不可)
For i = 0 To 10
ar(i, 0) = i
Next
ret = Application.Sum(ar)
MsgBox ret
End Sub

Sub Test_2() 'こちらがノーマル
Dim ret
Dim i As Long
Dim ar()
For i = 0 To 10
ReDim Preserve ar(0, i) '動的配列ができる
ar(0, i) = i
Next
ret = Application.Sum(ar)
MsgBox ret
End Sub
    • good
    • 1

ご質問の一連の流れからすれば、配列を使っておられるようなので、おそらくは採用はしないとは思います。

好みは否定するわけではありませんが、2次元配列で処理するといっても、Excelなどの場合は、ワークシートに貼り付けするのですから、結果的には、同じになってしまうだけで、配列が、ややこしくさせてしまいます。もし、配列を使うなら、配列を計算するサブプロシージャやユーザー定義関数を別に作ったほうがよいでしょう。

以下は、Set myRng = Range("R550").CurrentRegion と、CurrentRegion で範囲を取ったら、それを移動したり、範囲を狭めながら、計算領域を抽出し、そして、場所が決まったら、一気に計算させるという内容です。
.Columns(1).Address(0, 0) これで、上と下の列の計算の部分のアドレス範囲を抽出しています。[参考まで]

'//
Sub AutoCalc()
 Dim myRng As Range
 Set myRng = Range("R550").CurrentRegion
 With myRng.Offset(2, 2) 'グレーの行番号・列番号が生きている場合
 'With myrng.offset(1,1) '実際にはない場合
  With .Resize(.Rows.Count - 2, .Columns.Count - 2)
   .Rows(.Rows.Count).Offset(2).FormulaLocal = "=Sum(" & .Columns(1).Address(0, 0) & ")"
   .Rows(.Rows.Count).Offset(2, -1).Cells(1).Value = "合計"
  End With
 End With
End Sub
    • good
    • 1
この回答へのお礼

有難うございました。思い通りです。配列を計算するプロシージャとは
きになります。かなり気になります。
どうやるのか

お礼日時:2019/05/13 07:31

No.1です。



あ!2行空白行を空けるんですね(老眼は嫌じゃぁ)。

>With rr.Offset(rr.Rows.Count + 1).Resize(1)

ここを

With rr.Offset(rr.Rows.Count + 2).Resize(1)

と +2 と修正して下さい。
    • good
    • 1
この回答へのお礼

いつもありがとうございます今日仕事なので夜やります

お礼日時:2019/05/12 08:06

Excelをデータベースとして接続出来る方が初心者とは思えないですけど。


先にExcelの基本を学んだ方が楽な気はします。
配列による方法を検討されているようですが、Excelにはワークシート関数がありますのでそちらで済むならそちらを使われた方が・・・とも思いますよ。

Sub megu()
Dim rr As Range, rc As Range

Set rr = Range("T552", Cells(Rows.Count, "T").End(xlUp)) 'データ行基準範囲
Set rc = Range("T552", Cells(552, Columns.Count).End(xlToLeft)) 'データ列基準範囲

If rr.Row >= 552 And rc.Column >= 20 Then ' T552以降にデータが存在している場合
    With rr.Offset(rr.Rows.Count + 1).Resize(1) 'データ行数だけOFFSETしてセル範囲を1つとする
        .Offset(, -1).Value = "合計" 'その1つになったセルの左側に”合計”を代入
        With .Resize(, rc.Count) '1つにしたセル範囲を列方向に広げる
            .Formula = "=SUM(" & rr.Address(0, 0) & ")" '広げたセル範囲にSUM関数の数式を代入する
            .Value = .Value '数式を値に変換する
        End With
    End With
End If

Set rr = Nothing
Set rc = Nothing
End Sub
    • good
    • 1
この回答へのお礼

Excelをデータベースとして接続出来る方が初心者とは思えないですけど。
→めぐみん様から教えてくれたからできるようになりました。

先にExcelの基本を学んだ方が楽な気はします。
→私もそう思います。
だけど、こうできるようになりたいという思いが
こんなことになってしまうんです。
有難うございました。
思い通りです。
納得いたしました。

お礼日時:2019/05/13 07:33

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