Excel VBA質問箱 IV

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

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


3172 / 13644 ツリー ←次へ | 前へ→

【63745】不連続の足算 シオ野郎 09/12/8(火) 11:48 質問[未読]
【63746】Re:不連続の足算 seg 09/12/8(火) 13:24 発言[未読]
【63748】Re:不連続の足算 シオ野郎 09/12/8(火) 15:01 お礼[未読]
【63751】Re:不連続の足算 seg 09/12/8(火) 16:03 発言[未読]
【63753】Re:不連続の足算 シオ野郎 09/12/8(火) 16:44 お礼[未読]
【63754】Re:不連続の足算 seg 09/12/8(火) 17:30 発言[未読]
【63756】Re:不連続の足算 シオ野郎 09/12/9(水) 9:00 お礼[未読]
【63747】Re:不連続の足算 超初心者 09/12/8(火) 13:39 発言[未読]
【63749】Re:不連続の足算 シオ野郎 09/12/8(火) 15:10 お礼[未読]
【63750】Re:不連続の足算 SS 09/12/8(火) 15:44 発言[未読]
【63752】Re:不連続の足算 シオ野郎 09/12/8(火) 16:18 お礼[未読]
【63757】Re:不連続の足算 シオ野郎 09/12/9(水) 17:10 お礼[未読]

【63745】不連続の足算
質問  シオ野郎  - 09/12/8(火) 11:48 -

引用なし
パスワード
   はじめまして。
今、『idx2列のcon1行目から始まる、不連続の数値の合計』のマクロをしています。

例)
  A B C D E F G H
1     
2     1
3     3
4     4
5     
6     8
7     9
8
9     4
10
このような感じで所々空白になっています。
この場合は10行目に答えを表示させたいんですが・・・。

しかし、どうしても「不連続(空白セル)」の部分で計算がおかしくなり、
変なところに合計を表示させて困っています。(答えは最後に入力されたセルの下に表示させたい)

ちなみに、これがその私のプログラムです↓

Sub 穴あき足し算()

Dim idx1 As Integer       '入ってる数値の個数
Dim idx2 As Integer       '数値が入ってる列変数
Dim con1 As Integer       '数値が入ってる列の最初の行変数
Dim con2 As Integer       '変動する数値が入ってる行変数

  For idx2 = 1 To 49
    For con1 = 1 To 49
      If WorksheetFunction.IsNumber(Sheets("sheet1").Cells(con1, idx2)) = True Then
        Exit For
      End If
    Next con1

    If Not con1 = 50 Then
      Exit For
    End If
  Next idx2

  idx1 = WorksheetFunction.Count(Sheets("sheet1").Columns(idx2))

  For con2 = con1 To con1 + idx1
    If WorksheetFunction.IsNumber(Sheets("sheet1").Cells(con2, idx2)) = True Then
      s = s + Cells(con2, idx2)
        Else
      con2 = con2 + 1
      s = s + Cells(con2, idx2)
    End If
  Next con2
  Cells(con2 - 1, idx2) = s
End Sub


下から8行目ぐらいまでのプログラムをどうにかしたらいいってのは、なんとなくわかるんですが・・・。(特に下から6行目が変)
ちなみに、「空白セルも関係なしに全部足してしまう」といったのではありません。


こういう場合はどのようにしたらうまく動作してくれるのでしょうか?
教えてください、お願いします。

【63746】Re:不連続の足算
発言  seg  - 09/12/8(火) 13:24 -

引用なし
パスワード
   ▼シオ野郎 さん:
何か良く解らないけど、空白が含まれる列の合計を出したいのでしょうか?

ワークシート関数なら
"=SUM(A1:A9)"とすれば、空白があろうが関係なく合計値を出してくれます。

マクロ内で使用したいなら
ans = Application.WorksheetFunction.Sum(Range(Cells(1, 1), Cells(9, 1)))

【63747】Re:不連続の足算
発言  超初心者  - 09/12/8(火) 13:39 -

引用なし
パスワード
   ▼シオ野郎 さん:
私もよく分からないですが^^;;、なんとなく

Range("D10").Value = Application.WorksheetFunction. _
           Sum(Range("D1:D9").SpecialCells(xlCellTypeConstants, 1))

こんなことでしょうか
(D1:D9の数値の合計をD10に)

【63748】Re:不連続の足算
お礼  シオ野郎  - 09/12/8(火) 15:01 -

引用なし
パスワード
   ▼seg さん:
ご返信・ご回答ありがとうございます。

プログラム&文章がめちゃくちゃで申し訳ないです。
私、1週間前からExcelマクロを勉強し始めたんですが・・・
始めるきっかけは上司からの「覚えろ!」との指示からでした。

質問した内容は、上司からの問題で「1列に連続した数字の足算」をプログラムしろとの事・・・。
最初は、G9からG28それぞれ1〜20が連続して入っているとし、20の次の行(G29)に答えを出す問題でした。
次はG列だけ固定で何行目から1〜20の数値が入っているのかわからなく、これも20の次の行に答えを・・・・といった具合にステップアップしていき、今に至るということです。


segさんの言うとおり、空白が含まれる列の合計を出したいんです。
>ans = Application.WorksheetFunction.Sum(Range(Cells(1, 1), Cells(9, 1)))
これだと列も行数も限定しちゃってるから駄目って言われると思います・・・。
あと、上司が言うには「1行ずつ足していき、空白があれば飛ばす(みたいな?)感じで組み立てろ」とのことでした。
私のプログラムを変形させて組み立てることはできないでしょうか?
(長文失礼しました)

【63749】Re:不連続の足算
お礼  シオ野郎  - 09/12/8(火) 15:10 -

引用なし
パスワード
   ご返信・ご回答ありがとうございます。

▼超初心者 さん:
>Range("D10").Value = Application.WorksheetFunction. _
         Sum(Range("D1:D9").SpecialCells(xlCellTypeConstants, 1))
segさんのご回答の返信文に書いたんですが、列も行も指定してはいけないという問題なんです。

上司に質問すればいいんですが、今日から2日間出張でいないんです。
帰ってくるまでの課題とか言ってるし・・・
もう自分で考えてもよくわかりません。
完全に他人任せなんですが・・・
ヒントっぽい回答でもいいんで、どうにかならないでしょうか?

【63750】Re:不連続の足算
発言  SS  - 09/12/8(火) 15:44 -

引用なし
パスワード
   ▼シオ野郎 さん:
こんな感じはどうですか?
ただし、続けて計算すると合計値が邪魔をするのでもう一工夫必要です。

Sub 穴あき足し算2()

Dim idx1 As Integer       '入ってる数値の個数
Dim idx2 As Integer       '数値が入ってる列変数
Dim con1 As Integer       '数値が入ってる列の最初の行変数
Dim con2 As Integer       '変動する数値が入ってる行変数
Dim s As Variant
  With Worksheets("Sheet1")
    For idx2 = 1 To 39
      If Application.Count(.Range(.Cells(1, idx2), .Cells(39, idx2))) = 0 Then
        '何か処理がある場合
      Else
        If .Cells(1, idx2) <> "" Then
          idx1 = 1
        Else
          idx1 = .Cells(1, idx2).End(xlDown).Row
        End If
        s = 0
        For con1 = idx1 To .Cells(40, idx2).End(xlUp).Row
          If .Cells(con1, idx2) <> "" Then
            s = s + .Cells(con1, idx2)
          End If
        Next con1
        .Cells(con1, idx2).Value = s
      End If
    Next idx2
  End With
End Sub


>ご返信・ご回答ありがとうございます。
>
>▼超初心者 さん:
>>Range("D10").Value = Application.WorksheetFunction. _
>          Sum(Range("D1:D9").SpecialCells(xlCellTypeConstants, 1))
>segさんのご回答の返信文に書いたんですが、列も行も指定してはいけないという問題なんです。
>
>上司に質問すればいいんですが、今日から2日間出張でいないんです。
>帰ってくるまでの課題とか言ってるし・・・
>もう自分で考えてもよくわかりません。
>完全に他人任せなんですが・・・
>ヒントっぽい回答でもいいんで、どうにかならないでしょうか?

【63751】Re:不連続の足算
発言  seg  - 09/12/8(火) 16:03 -

引用なし
パスワード
   ▼シオ野郎 さん:
>質問した内容は、上司からの問題で「1列に連続した数字の足算」をプログラムしろとの事・・・。
上司からの課題をここで質問するのは、どうかと思いますが…

>segさんの言うとおり、空白が含まれる列の合計を出したいんです。
>>ans = Application.WorksheetFunction.Sum(Range(Cells(1, 1), Cells(9, 1)))
>これだと列も行数も限定しちゃってるから駄目って言われると思います・・・。
その通りですね、上記のような汎用性の無い物は使い物になりません。
構造を見て汎用的に組むのは貴方の仕事です。

>あと、上司が言うには「1行ずつ足していき、空白があれば飛ばす(みたいな?)感じで組み立てろ」とのことでした。
上司の仰りたいことはおそらく、"=SUM"で実現出来る事を、マクロで書け。
つまり、その処理内容を理解させようとされてるのではないでしょうか。

Sub test()
  Dim nRows As Long ' Integerで宣言するとオーバーフローを起こします
  Dim sum As Long
  
  For i = 1 To Range("A1").SpecialCells(xlCellTypeLastCell).Row
    If (IsNumeric(Cells(i, 1).Value) = True) Then
      sum = sum + CLng(Cells(i, 1).Value)
    End If
  Next
End Sub
上記コードは完璧では、ありません。
内容を理解し、自分なりのコードで書き直してください。

【63752】Re:不連続の足算
お礼  シオ野郎  - 09/12/8(火) 16:18 -

引用なし
パスワード
   ▼SS さん:
ご返信・ご回答ありがとうございます。

すごいです!!
間違いなくバシーっと動作しています!!
なんか感動しました。
自分で考えてないのに^^;

自分で考えてないから少し解らないとこがあるのですが・・・
>  With Worksheets("Sheet1")
>  End With
ここが何を意味している(効果がある)のか?と・・・

>    If .Cells(1, idx2) <> "" Then
>       idx1 = 1
>     Else
>       idx1 = .Cells(1, idx2).End(xlDown).Row
>     End If
>     s = 0
>     For con1 = idx1 To .Cells(40, idx2).End(xlUp).Row
>       If .Cells(con1, idx2) <> "" Then
>         s = s + .Cells(con1, idx2)
>       End If
>     Next con1
ここの部分の意味(特に<> "" の部分)がよくわかりません。
実は初めて見るかたちだったりします^^;

何度もすみません。
お願いします。

【63753】Re:不連続の足算
お礼  シオ野郎  - 09/12/8(火) 16:44 -

引用なし
パスワード
   ▼seg さん:
何度もありがとうございます。

>上司からの課題をここで質問するのは、どうかと思いますが…
仰る通りなのですが、質問や調べることはOKとされてたので^^;
ただ答えがほしいってわけじゃなく、きっかけとなるものがほしたっかのです。
もちろん答えを書いてくれた方々には大感謝なんですが、最後は理解して使いこなさなければいけませんからね。
まったく関係ない学科の女短にかよっていたもので・・・。
普段からプライベートでもパソコンを扱っていればと、今はつくづく思います。

処理コード、ありがとうございました。
参考にして自分なりのコードをつくってみます。
また何かあればお願いします。

【63754】Re:不連続の足算
発言  seg  - 09/12/8(火) 17:30 -

引用なし
パスワード
   ▼シオ野郎 さん:
>>上司からの課題をここで質問するのは、どうかと思いますが…
>仰る通りなのですが、質問や調べることはOKとされてたので^^;
なるほど、それは失言でした。

>ただ答えがほしいってわけじゃなく、きっかけとなるものがほしたっかのです。
>もちろん答えを書いてくれた方々には大感謝なんですが、最後は理解して使いこなさなければいけませんからね。

では、余計なおせっかいですが補足を
私のコードで伝えたかったのは3点です。
1.型の定義 Integerではオーバーフローします。
2.明示的なキャスト 型には様々な形があるので型変換を
 ちゃんとしないと後で後悔します。
3.エラー回避ブロック IsNumericにて対象が数値かを確認しています。
 対象の中に"a"があると困るので。

それぞれ調べてもらえると新設に解説してるサイトがあると思います。
最初は訳が解らないと思いますが、頑張ってください^^

【63756】Re:不連続の足算
お礼  シオ野郎  - 09/12/9(水) 9:00 -

引用なし
パスワード
   ▼seg さん:
お礼が遅くなり申し訳ありません。
そして、度々の親切なご回答・ご助力感謝します。

>1.型の定義 Integerではオーバーフローします。
これに関しては理解できました^^
何をするかにもよるのでしょうが、Longあたりが丁度良いのですね。

>2.明示的なキャスト 型には様々な形があるので型変換を
> ちゃんとしないと後で後悔します。
>3.エラー回避ブロック IsNumericにて対象が数値かを確認しています。
> 対象の中に"a"があると困るので。
この2つに関しては「なるほど〜!」と思わされました。

segさんの仰る通り今のところは、やればやるほどわけが解らなくなっている状態です^^;
投げ出しやすい性格の私なのですが、今回の課題等をチャンスだと思い、これからもじっくりと理解していこうかと思っています。
なので、もしかしたらまた、ここに参上してしまうかもしれませんが、私を見つけたときなどにはまた助言等をお願いしたいと思っております。
今回はありがとうございました。

【63757】Re:不連続の足算
お礼  シオ野郎  - 09/12/9(水) 17:10 -

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

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

のちの、私みたいな人のために・・・
やってることはSSさんと一緒です。
SSさんのコードの変形(?)型↓


Sub 穴あき足し算2()

Dim idx1 As Integer       '入ってる数値の個数
Dim idx2 As Integer       '数値が入ってる列変数
Dim con1 As Integer       '数値が入ってる列の最初の行変数
Dim con2 As Integer       '変動する数値が入ってる行変数
Dim s As Variant
  With Worksheets("Sheet1")
  
    For idx2 = 1 To 39
      If Application.Count(.Range(.Cells(1, idx2), .Cells(40, idx2))) = 0 Then
        '何か処理がある場合
      Else
        If Not .Cells(1, idx2) = True Then
          idx1 = 1
        Else
          idx1 = .Cells(1, idx2).End(xlDown).Row
        End If
        s = 0
        For con1 = idx1 To .Cells(40, idx2).End(xlUp).Row
          If Not .Cells(con1, idx2) = True Then
            s = s + .Cells(con1, idx2)
          End If
        Next con1
        .Cells(con1, idx2).Value = s
      End If
        'If Not s = 0 Then      この3行を入れると
        '  Exit For           全列の計算ではなく
        'End If                 最初に見つけた列だけ計算する。
    Next idx2
  End With
End Sub

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