Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9477 / 13646 ツリー ←次へ | 前へ→

【26949】合計値の求め方 nana 05/7/25(月) 13:06 質問[未読]
【26950】Re:合計値の求め方 Jaka 05/7/25(月) 13:27 回答[未読]
【26958】Re:合計値の求め方 nana 05/7/25(月) 14:57 質問[未読]
【26962】Re:合計値の求め方 Jaka 05/7/25(月) 15:49 発言[未読]
【26964】Re:合計値の求め方 nana 05/7/25(月) 16:00 発言[未読]
【26969】Re:合計値の求め方 Jaka 05/7/25(月) 17:03 回答[未読]
【26998】Re:合計値の求め方 Jaka 05/7/26(火) 10:20 発言[未読]
【27027】Re:合計値の求め方 yasu 05/7/26(火) 19:35 質問[未読]
【27050】Re:合計値の求め方 Jaka 05/7/27(水) 9:39 回答[未読]
【27068】Re:合計値の求め方 yasu 05/7/27(水) 18:46 質問[未読]
【27072】Re:合計値の求め方 kobasan 05/7/28(木) 0:39 回答[未読]
【27074】Re:合計値の求め方 yasu 05/7/28(木) 6:21 お礼[未読]
【27078】すみませんでした。 Jaka 05/7/28(木) 9:53 発言[未読]
【27097】ありがとうございませんでした yasu 05/7/28(木) 21:39 お礼[未読]
【27145】ありがとうございました yasu 05/7/29(金) 21:29 お礼[未読]

【26949】合計値の求め方
質問  nana  - 05/7/25(月) 13:06 -

引用なし
パスワード
   初心者のnanaです。今このようなことに悩んでいます。

合計値を求めたいですが、sumの中に変数を入れられないみたいですが、なにか方法ありませんか。教えてください。宜しくお願い致します。

c=b-a+1
Range(Cells(i + 1, 8), Cells(i + 1, 4)).Select
ActiveCell.FormulaR1C1 = "=SUM(R[-c]C:R[-1]C)"
Range(Cells(i + 2, 8), Cells(i + 2, 4)).Selects

【26950】Re:合計値の求め方
回答  Jaka  - 05/7/25(月) 13:27 -

引用なし
パスワード
   こんにちは。

""で囲まれた物は文字列ですから、文字と変数を連結して望みの文字列に成るようにすれば良いです。

= "=SUM(R[-c]C:R[-1]C)"
    ↓
= "=SUM(R[-" & c & "]C:R[-1]C)"

変数名にCとかC1、C2、R、R1、R2の類は、R1C1と間違えて誤動作する時があるみたいですから、止めておいた方が良いです。

【26958】Re:合計値の求め方
質問  nana  - 05/7/25(月) 14:57 -

引用なし
パスワード
   ご返信どうもありがとうございました。お陰で順調に動きました。
ただ、なぜか合計の値は全部0になっています。
私の書いたプログラムは以下の通りです。どこが間違っているか教えていただけますでしょうか。


'1行目からシートの最終行まで処理を繰り返す
   For i = 1 To lastRow
      If Not Cells(i + 1, "D").Value = Cells(i, "D").Value Then
      '空白行を入れる
      Range(Cells(i + 1, 4), Cells(i + 1, 4)).Select
      Selection.EntireRow.Insert Shift:=xlDown
      
      '合計を求める
      Dim a As Integer
      Dim b, d As Integer
       a = 1
       b = i
       d = b - a + 1
      Range(Cells(i + 1, 8), Cells(i + 1, 8)).Select
      
      ActiveCell.FormulaR1C1 = "=SUM(R[-" & d & "]C[-1]:R[-1]C[-1])"
      Range(Cells(i + 2, 8), Cells(i + 2, 8)).Select
      
      i = i + 2
      a = i
      End If
   Next

【26962】Re:合計値の求め方
発言  Jaka  - 05/7/25(月) 15:49 -

引用なし
パスワード
   >ただ、なぜか合計の値は全部0になっています。
って、G列を計算しているみたいですが、ご自分で入れた関数式はあっていますか?
まずはそれを確認してください。
どんな関数を入れたいんですか、R1C1形式でなくA1形式で説明してください。

やっている事が良く解かってないけど...。

   For ii = 1 To Int(lastRow / 2) + 1
      i = i + 1
      Cells(i + 1, "D").Select
      Cells(i, "D").Select
      If Not Cells(i + 1, "D").Value = Cells(i, "D").Value Then
      '空白行を入れる
      Range(Cells(i + 1, 4), Cells(i + 1, 4)).Select
      Selection.EntireRow.Insert Shift:=xlDown

      '合計を求める
      Dim a As Integer
      Dim b, d As Integer
       a = 1
       b = i
       d = b - a + 1
      Range(Cells(i + 1, 8), Cells(i + 1, 8)).Select

      'ActiveCell.FormulaR1C1 = "=SUM(R[-" & d & "]C[-1]:R[-1]C[-4])"
      ActiveCell.FormulaR1C1 = "=SUM(R[-" & d & "]C[-4]:R[-1]C[-4])"
      Range(Cells(i + 2, 8), Cells(i + 2, 8)).Select

      i = i + 2
      a = i
      End If
   Next

【26964】Re:合計値の求め方
発言  nana  - 05/7/25(月) 16:00 -

引用なし
パスワード
   分かりにくい言い方で申し訳ありません。

やりたいことは、つまりAとB列のデータがあると仮定します。Aは日付データ、Bはその日に売れた商品の数です。やりたい操作は、まずA列のデータ、つまり日付によって並べ替えます。次に、違う日付の行の間に空白行を入れます。最後に、各空白行のセルに、同じ日付の商品数の合計を出します。

問題は合計のところはうまく出せないです。なぜならセルの範囲は指定しにくいです。

【26969】Re:合計値の求め方
回答  Jaka  - 05/7/25(月) 17:03 -

引用なし
パスワード
   日付はどうやって入力しているんですか?
年号から入ってますか?

フィルタオプションとオートフィルタを使えば範囲は特定できそうですけど。
【102】日付と期間をオートフィルタで抽出(修正版)
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=102;id=FAQ

ループでA列のセルを1セルづつ比較して範囲を特定しても良いですし、
どちらも方法でもソートしてあるから、小難しい事は省けそうですが...。
↓A列がソートしてあるとして

Sub 一つづつ比較()
Dim CEL As Range
  For Each CEL In Range("a1", Range("A65535").End(xlUp))
    CEL.Select
    If CEL.Value <> CEL.Offset(1).Value And _
      CEL.Value <> "" Then
      CEL.Offset(1).EntireRow.Insert
      subad = Range(CEL, CEL.End(xlUp)).Offset(, 1).Address(0, 0)
      CEL.Offset(1, 1).Formula = "=sum(" & subad & ")"
    End If
  Next
End Sub

【26998】Re:合計値の求め方
発言  Jaka  - 05/7/26(火) 10:20 -

引用なし
パスワード
   何となく他の方法でも作ってみました。
データがこんな感じで、1行目は項目名などとして。
ソートも加えてみました。。

   A     B
1  日付    数
2 2005/7/3   1
3 2005/7/2   1
4 2005/7/5   1
5 2005/7/4   1
6 2005/7/1   1
7 2005/7/2   1
8 2005/7/5   1

Sub オートフィルタ()  '思ったほど速くない。遅い?
  Dim AdRg As Range, CEL As Range, FlSt() As String, CT As Long, SSt As Variant
  Dim SumAd As String
  Application.ScreenUpdating = False
  Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess
  With Range("A1", Range("A65536").End(xlUp))
    .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    Set AdRg = .Resize(.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
    ActiveSheet.ShowAllData
    For Each CEL In AdRg
      CT = CT + 1
      ReDim Preserve FlSt(1 To CT)
      FlSt(CT) = CEL
    Next
    For Each SSt In FlSt
      DtSt = Format(SSt, "yyyy/mm/dd")
      .AutoFilter Field:=1, Criteria1:=">=" & DtSt, Operator:=xlAnd, _
                 Criteria2:="<=" & DtSt
      Set FlRg = .Resize(.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
      ActiveSheet.AutoFilterMode = False
      FlRg.Cells(FlRg.Count).Offset(1).EntireRow.Insert
      SumAd = FlRg.Offset(, 1).Address(0, 0)
      FlRg.Cells(FlRg.Count).Offset(1, 1).Select
      FlRg.Cells(FlRg.Count).Offset(1, 1).Formula = "=sum(" & SumAd & ")"
    Next
  End With
  Application.ScreenUpdating = True
  Erase FlSt
  Set AdRg = Nothing
  Set FlRg = Nothing
  MsgBox "終わりました。"
End Sub

Sub 一つづつ比較()
Dim CEL As Range
  Application.ScreenUpdating = False
  Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess
  For Each CEL In Range("A2", Range("A65535").End(xlUp))
    If CEL.Value <> CEL.Offset(1).Value And _
      CEL.Value <> "" Then
      CEL.Offset(1).EntireRow.Insert
      subad = Range(CEL, CEL.End(xlUp)).Offset(, 1).Address(0, 0)
      CEL.Offset(1, 1).Formula = "=sum(" & subad & ")"
    End If
  Next
  Application.ScreenUpdating = True
  MsgBox "終わりました。"
End Sub

Sub SumIF版()
  Application.ScreenUpdating = False
  Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess
  For Each CEL In Range("A2", Range("A65535").End(xlUp))
    If CEL.Value <> CEL.Offset(1).Value And _
      CEL.Value <> "" Then
      CEL.Offset(1).EntireRow.Insert
      CEL.Offset(1, 1).Formula = "=SUMIF($A$1:A" & CEL.Row & ",A" & CEL.Row & ",$B$1:$B" & CEL.Row & ")"
    End If
  Next
  Application.ScreenUpdating = True
  MsgBox "終わりました。"
End Sub

【27027】Re:合計値の求め方
質問  yasu  - 05/7/26(火) 19:35 -

引用なし
パスワード
   ▼Jaka さん:
今晩は。
横から御免なさい。

>ループでA列のセルを1セルづつ比較して範囲を特定しても良いですし、
>どちらも方法でもソートしてあるから、小難しい事は省けそうですが...。
>↓A列がソートしてあるとして
>
>Sub 一つづつ比較()
>Dim CEL As Range
>  For Each CEL In Range("a1", Range("A65535").End(xlUp))
>    CEL.Select
>    If CEL.Value <> CEL.Offset(1).Value And _
>      CEL.Value <> "" Then
>      CEL.Offset(1).EntireRow.Insert
>      subad = Range(CEL, CEL.End(xlUp)).Offset(, 1).Address(0, 0)
>      CEL.Offset(1, 1).Formula = "=sum(" & subad & ")"
>    End If
>  Next
>End Sub

合計が?少しおかしくなるのですが・・・・・
直せますでしょうか?
分かれば教えてください。

【27050】Re:合計値の求め方
回答  Jaka  - 05/7/27(水) 9:39 -

引用なし
パスワード
   ▼yasu さん:
>合計が?少しおかしくなるのですが・・・・・
>直せますでしょうか?
>分かれば教えてください。

実際、データレイアウトが解らないのでなんともいえませんが、合計の出るSUM関数の範囲はあっているのでしょうか?
おかしいと言われたコードは、1行目からデータ部としています。
また、ソートはコードに含まれていません。

1行目はタイトルか項目名、他などとし、データが始まるセルは A2なら、
[#26998]こちらを見てください。

【27068】Re:合計値の求め方
質問  yasu  - 05/7/27(水) 18:46 -

引用なし
パスワード
   ▼Jaka さん:

失礼しましたnanaさんの文面どおりのことを再度書いていなくて分かりにくくご迷惑をかけました。

nanaさんの質問で
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=26964;id=excel
これですが・・・・

「やりたいことは、つまりAとB列のデータがあると仮定します。Aは日付データ、Bはその日に売れた商品の数です。やりたい操作は、まずA列のデータ、つまり日付によって並べ替えます。次に、違う日付の行の間に空白行を入れます。最後に、各空白行のセルに、同じ日付の商品数の合計を出します。
問題は合計のところはうまく出せないです。なぜならセルの範囲は指定しにくいです。」


例えば、下の例でやりますと、日付を昇順後・・・その後マクロコードを使うと
最初の7月1日は合計で150となります7月の3日の合計も130になります。が、ここまでは良いのですが7月の5日290になります7月8日も250という数字になります。
つまり対象日が1日の時にその日の上2行分を加算しています。

日付     商品数
7月1日    50
7月1日    100
7月3日    70
7月3日    60
7月5日    100
7月7日    80
7月7日    60
7月8日    50
7月10日    80
7月10日    100
7月10日    70

貴兄のご提示されたコードがシンプルで素晴らしいと思い残しています。
何か出来そうで、試行錯誤していますが・・・上のような結果が出ます。
対処方法が有りましたら教えていただきたく書かせていただいた次第です。

Sub 一つづつ比較()
Dim CEL As Range
  For Each CEL In Range("a1", Range("A65535").End(xlUp))
    CEL.Select
    If CEL.Value <> CEL.Offset(1).Value And _
      CEL.Value <> "" Then
      CEL.Offset(1).EntireRow.Insert
      subad = Range(CEL, CEL.End(xlUp)).Offset(, 1).Address(0, 0)
      CEL.Offset(1, 1).Formula = "=sum(" & subad & ")"
    End If
  Next
End Sub

よろしくお願いします。

【27072】Re:合計値の求め方
回答  kobasan  - 05/7/28(木) 0:39 -

引用なし
パスワード
   みなさん今晩は。 横から失礼します。


>例えば、下の例でやりますと、日付を昇順後・・・その後マクロコードを使うと
>最初の7月1日は合計で150となります7月の3日の合計も130になります。が、ここまでは良いのですが7月の5日290になります7月8日も250という数字になります。
>つまり対象日が1日の時にその日の上2行分を加算しています。


これでできます。


Sub 一つづつ比較()
Dim subad As String
Dim CEL As Range
  For Each CEL In Range("a2", Range("A65535").End(xlUp))
    CEL.Select
    If (CEL.Value <> CEL.Offset(1).Value And CEL.Value <> "") Then
      If (CEL.Value = CEL.Offset(-1).Value) Then
        subad = Range(CEL, CEL.End(xlUp)).Offset(, 1).Address(0, 0)
      Else
        subad = CEL.Offset(, 1).Address(0, 0)
      End If
      CEL.Offset(1).EntireRow.Insert
      CEL.Offset(1, 1).Formula = "=sum(" & subad & ")"
    End If
  Next
End Sub

【27074】Re:合計値の求め方
お礼  yasu  - 05/7/28(木) 6:21 -

引用なし
パスワード
   ▼kobasan さん:

おはようございます。
ありがとうございました。

よく理解できました。
色々な場面で使えるようで嬉しいです。

今後ともよろしくお願いします。

失礼します。

【27078】すみませんでした。
発言  Jaka  - 05/7/28(木) 9:53 -

引用なし
パスワード
   申し訳ございません。
色々なパターンでの検証が足りませんでした。
kobasanさんフォローありがとうございました。
で、一応修正してみました。(まだ、検証が足りないかも...。)

Sub 一つづつ比較()
Dim CEL As Range,savad As String
  Application.ScreenUpdating = False
  Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess
  savad = "B2"  'データ部先頭
  For Each CEL In Range("A2", Range("A65535").End(xlUp))
    If CEL.Value <> CEL.Offset(1).Value And _
      CEL.Value <> "" Then
      CEL.Offset(1).EntireRow.Insert
      subad = Range(Range(savad), CEL.Offset(1).End(xlUp).Offset(, 1)).Address(0, 0)
      CEL.Offset(1, 1).Formula = "=sum(" & subad & ")"
      savad = CEL.Offset(2, 1).Address
    End If
  Next
  Application.ScreenUpdating = True
  MsgBox "終わりました。"
End Sub

【27097】ありがとうございませんでした
お礼  yasu  - 05/7/28(木) 21:39 -

引用なし
パスワード
   ▼Jaka さん:

途中から入り失礼しました。
最後までご返答を頂き感謝しています。
これからもよろしくご指導下さい。

失礼します。

【27145】ありがとうございました
お礼  yasu  - 05/7/29(金) 21:29 -

引用なし
パスワード
   ▼Jaka さん:

「題名」が間違っていました。
今ころ気がつきました。
何を考えていたのか、タイピングミスです。
失礼しました。

これからもよろしくお願いします。

9477 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free