Excel VBA質問箱 IV

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

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


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

【53613】Button1回押しも2回押しも同じ結果を出したいのですが・・・ nadatani 08/1/24(木) 19:50 質問[未読]
【53614】Re:Button1回押しも2回押しも同じ... ichinose 08/1/24(木) 20:19 発言[未読]
【53616】Re:Button1回押しも2回押しも同じ... VBWASURETA 08/1/24(木) 21:19 発言[未読]
【53618】Re:Button1回押しも2回押しも同じ... nadatani 08/1/24(木) 22:05 お礼[未読]
【53617】Re:Button1回押しも2回押しも同じ... nadatani 08/1/24(木) 22:02 質問[未読]
【53635】Re:Button1回押しも2回押しも同じ... ichinose 08/1/27(日) 20:05 発言[未読]
【53636】Re:Button1回押しも2回押しも同じ... nadatani 08/1/27(日) 20:27 お礼[未読]
【53643】Re:Button1回押しも2回押しも同じ... VBWASURETA 08/1/28(月) 10:03 発言[未読]
【53644】Re:Button1回押しも2回押しも同じ... ichinose 08/1/28(月) 20:53 発言[未読]

【53613】Button1回押しも2回押しも同じ結...
質問  nadatani  - 08/1/24(木) 19:50 -

引用なし
パスワード
   Buttonを押して
A列の合計をさせたいのですが、
4列目が「ABAB」のデータが
あるときは、A列の数字をマイナスに変えA列の合計をさせたいのです。
コード「総合計」は
一回ボタンを押せば「マイナス処理をした合計」になり正解なのですが
二回ボタンを押すと「マイナス*マイナス処理」→プラスになり最初の合計と
後の合計に差がマイナス分の2倍が
生じます。
これを避ける方法を教えてください。
自分なりにSelectCaseを使い
コード「総合計2」を作成したのですが、SelectCaseの使い方が間違っている
ためか
「総合計1」と同じ結果になります。
アドバイスをよろしくお願いします。

’・・・・・・・・・・・・・・・・・・・・・・・・・
Sub 総合計1()

Dim i As Integer, rng As Range, pvl As Long
pvl = Range("F4").Value

Set rng = Range(Cells(7, 1), Cells(Rows.Count, 1).End(xlUp))
For i = 7 To Cells(65536, 1).End(xlUp).Row
  If Cells(i, 4) = "ABAB" Then
    Cells(i, 4).Offset(, -3).Formula = Cells(i, 1) * -1
  End If
Next i
If rng.Row > 5 Then
 Range("F4").Formula = _
   "=SUBTOTAL(9," & rng.Address & ")"
 MsgBox "総合計は" & Format(Range("F4").Value, "#,##0")
End If
With Range("F4")
If .Value > pvl Then
  Range("F4").Value = pvl
End If
End With

End Sub
’・・・・・・・・・・・・・・・・
Sub 総合計2()

Dim i As Integer, rng As Range, j As Integer, MyC As Integer
For j = 1 To 2
    Select Case j
      Case Is = 1: MyC = -1
      Case Else: MyC = 1
    End Select
Next j

Set rng = Range(Cells(7, 1), Cells(Rows.Count, 1).End(xlUp))
For i = 7 To Cells(65536, 1).End(xlUp).Row
  If Cells(i, 4) = "ABAB" Then
    Cells(i, 4).Offset(, -3).Formula = Cells(i, 1) * MyC
  End If
Next i

If rng.Row > 5 Then
 Range("F4").Formula = _
   "=SUBTOTAL(9," & rng.Address & ")"
 MsgBox "総合計は" & Format(Range("F4").Value, "#,##0")
End If

End Sub
   ’・・・・・・・・・・・・・・・

【53614】Re:Button1回押しも2回押しも同...
発言  ichinose  - 08/1/24(木) 20:19 -

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

こんばんは。

>Buttonを押して
>A列の合計をさせたいのですが、
>4列目が「ABAB」のデータが
>あるときは、A列の数字をマイナスに変えA列の合計をさせたいのです。
>コード「総合計」は
>一回ボタンを押せば「マイナス処理をした合計」になり正解なのですが
>二回ボタンを押すと「マイナス*マイナス処理」→プラスになり最初の合計と
>後の合計に差がマイナス分の2倍が
>生じます。

元データを変えてしまうと、そりゃあ、一回目と2回目では
計算結果が違ってきますよね!!


Sub 総合計1()
  Dim ans As Variant
  Dim i As Integer, rng As Range, pvl As Long
  pvl = Range("F4").Value
  Set rng = Range(Cells(7, 1), Cells(Rows.Count, 1).End(xlUp))
  With rng
    MsgBox "=if(offset(" & .Address & ",0,3,1,1)=""ABAB"",-1*(" & .Address & ")," & _
         .Address & ")" & vbCrLf & "こんな配列数式を評価します"
        
    ans = Evaluate("=if(offset(" & .Address & ",0,3)=""ABAB"",-1*(" & .Address & ")," & _
         .Address & ")")
    End With
  If rng.Row > 5 Then 'この5の意味がわかりませんが、そのままにしておきます
    Range("F4").Value = Application.Sum(ans)
    MsgBox "総合計は" & Format(Range("F4").Value, "#,##0")
    End If

End Sub

【53616】Re:Button1回押しも2回押しも同...
発言  VBWASURETA  - 08/1/24(木) 21:19 -

引用なし
パスワード
   ▼ichinose さん、 nadatani さん:

こんばんは。

ichinose さんみたいなすごいソースは無理ですが^^;


単純にマイナスになったところは除外すればいいだけでは?
例えば:

>  If Cells(i, 4) = "ABAB" Then
>    Cells(i, 4).Offset(, -3).Formula = Cells(i, 1) * -1
>  End If



  If Cells(i, 4) = "ABAB" And Cells(i, 1) > 0 Then
    Cells(i, 4).Offset(, -3).Formula = Cells(i, 1) * -1
  End If

ではダメでしょうか?

【53617】Re:Button1回押しも2回押しも同...
質問  nadatani  - 08/1/24(木) 22:02 -

引用なし
パスワード
   ▼ichinose さん:
今晩は。早速有難うございます。

>元データを変えてしまうと、そりゃあ、一回目と2回目では
>計算結果が違ってきますよね!!
 
ご指摘いただいたコードで動かさしていただきました。
いつも大きな数字をとらえるようです。
マイナスが発生しないのですが・・・
明日、再度会社にて時間をかけて見させていただき考えて見ます。

>Sub 総合計1()
>  Dim ans As Variant
>  Dim i As Integer, rng As Range, pvl As Long
>  pvl = Range("F4").Value
>  Set rng = Range(Cells(7, 1), Cells(Rows.Count, 1).End(xlUp))
>  With rng
>    MsgBox "=if(offset(" & .Address & ",0,3,1,1)=""ABAB"",-1*(" & .Address & ")," & _
>         .Address & ")" & vbCrLf & "こんな配列数式を評価します"
>        
>    ans = Evaluate("=if(offset(" & .Address & ",0,3)=""ABAB"",-1*(" & .Address & ")," & _
>         .Address & ")")
>    End With
>  If rng.Row > 5 Then 'この5の意味がわかりませんが、そのままにしておきます

これは6行目以降の意味なんですが・・・おかしいでしょうか?
   
>    Range("F4").Value = Application.Sum(ans)
>    MsgBox "総合計は" & Format(Range("F4").Value, "#,##0")
>    End If
>
>End Sub

【53618】Re:Button1回押しも2回押しも同...
お礼  nadatani  - 08/1/24(木) 22:05 -

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

今晩は。ご指摘有難うございました。
私のコード作成の甘さをつくづくと感じました。
ご指摘の通りです。なるほどと納得しました。
間違いなく、正しい合計が出来ました。

有難うございました。

【53635】Re:Button1回押しも2回押しも同...
発言  ichinose  - 08/1/27(日) 20:05 -

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

こんばんは。返事が遅れました(ちょっと、体調がわるくって)
土日で何とか回復しそうです。


>ご指摘いただいたコードで動かさしていただきました。
>いつも大きな数字をとらえるようです。
>マイナスが発生しないのですが・・・

セルA7から、データが入っているのですよね?

そして、対応するD列に 「ABAB」 が入っていたら+-の符号を付け替えて計算するのですよね?

Msgboxの数式には ちょっと誤りがありましたが、結果は正常に計算されますが・・・。

再度、新規ブックにて(あくまでも新規ブックです)。

標準モジュールに

Sub 総合計1()
  Dim ans As Variant
  Dim rng As Range
  Call mk_sample
  MsgBox "サンプルデータ作成"
  Set rng = Range(Cells(7, 1), Cells(Rows.Count, 1).End(xlUp))
  With rng
    MsgBox "=if(offset(" & .Address & ",0,3)=""ABAB"",-1*(" & .Address & ")," & _
         .Address & ")" & vbCrLf & "こんな配列数式を評価します"
    
    ans = Evaluate("=if(offset(" & .Address & ",0,3)=""ABAB"",-1*(" & .Address & ")," & _
         .Address & ")")
    End With
  If rng.Row > 5 Then 'この5の意味がわかりませんが、そのままにしておきます
    Range("F4").Value = Application.Sum(ans)
    MsgBox "総合計は" & Format(Range("F4").Value, "#,##0")
    End If

End Sub
Sub mk_sample()
  Range("a7:a20").Value = Application.Transpose(Array(1, 2, 3, _
              4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14))
  Range("d20").Value = "ABAB"
End Sub


として、mainを実行してみてください。

サンプルデータもコードで作成していますから、真っ白なシートを
アクティブにして実行してみてください。

セルA7からA20に数値が表示され D20に ABAB 

というサンプルデータにて計算します。

結果は 77と表示されるはずですが、いかがですか?

正しく表示されたら、前回正しく計算されなかった理由を探ってみてください。

尚、

>If rng.Row > 5 Then 'この5の意味がわかりませんが、そのままにしておきます

は、計算データは、A7からですよね?
だとしたら、

私なら、

If rng.Row > 6 Then

こういうコードはよく書きますけどねえ!!

【53636】Re:Button1回押しも2回押しも同...
お礼  nadatani  - 08/1/27(日) 20:27 -

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

>こんばんは。返事が遅れました(ちょっと、体調がわるくって)
>土日で何とか回復しそうです。
>
体調の悪い中、ご回答頂き恐縮しています。
したいことが、全部コードで出来ました。
これから、コードをじっくり理解したいと思います。

大寒の最中、日本中が冷え切っています、
くれぐれもお体を大事にしてください。
貴重な時間を割いていただき、感謝しています。
失礼します。

【53643】Re:Button1回押しも2回押しも同...
発言  VBWASURETA  - 08/1/28(月) 10:03 -

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

おはようございます。

多分ですが、nadataniさんは途中結果のマイナス値も必要で元を
書き換えたいということだと思います。
集計結果としては、自分もichinoseさんのソースで確認しましたけど
正しかったですよ^^

【53644】Re:Button1回押しも2回押しも同...
発言  ichinose  - 08/1/28(月) 20:53 -

引用なし
パスワード
   ▼VBWASURETA さん:
こんばんは。

>多分ですが、nadataniさんは途中結果のマイナス値も必要で元を
>書き換えたいということだと思います。
なるほど・・・、
VBWASURETA さんのコードも拝見しました。
ということは、

D列に「ABAB」と入力されている対応するA列の値は、0又は、正の数値である
という条件なのですね!!

私は、ここには、負の数が入る可能性もあり、その時は正の数に変換した後に
計算する という仕様だと思っていました。

0又は、正の数値である と言う条件なら・・、

'====================================
Sub 総合計1()
  Dim rng As Range
  Set rng = Range(Cells(7, 1), Cells(Rows.Count, 1).End(xlUp))
  With rng
   
    Debug.Print "=if(offset(" & .Address & ",0,3)=""ABAB"",abs(" & .Address & ")," & _
         .Address & ")" & vbCrLf & _
         "という数式で初期化します"
    .Value = Evaluate("=if(offset(" & .Address & ",0,3)=""ABAB"",abs(" & .Address & ")," & _
         .Address & ")")
    Debug.Print "=if(offset(" & .Address & ",0,3)=""ABAB"",-1*(" & .Address & ")," & _
         .Address & ")" & vbCrLf & "こんな配列数式を評価します"
  
    .Value = Evaluate("=if(offset(" & .Address & ",0,3)=""ABAB"",-1*(" & .Address & ")," & _
         .Address & ")")
    End With
  If rng.Row > 6 Then
    Range("F4").Value = Application.Sum(rng)
    MsgBox "総合計は" & Format(Range("F4").Value, "#,##0")
    End If

End Sub

こんなコードで
D列に「ABAB」と入力されている対応するA列の値は、0又は、負の数値に
なると思います。

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