Excel VBA質問箱 IV

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

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


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

【42043】教えてくださーい nobu 06/8/30(水) 11:45 質問[未読]
【42045】Re:教えてください かみちゃん 06/8/30(水) 12:28 発言[未読]
【42046】Re:教えてください nobu 06/8/30(水) 12:57 発言[未読]
【42066】Re:教えてください ponpon 06/8/30(水) 22:01 発言[未読]
【42070】Re:教えてください nobu 06/8/30(水) 23:37 発言[未読]
【42071】Re:教えてください nobu 06/8/31(木) 0:28 質問[未読]
【42072】Re:教えてください ponpon 06/8/31(木) 0:55 発言[未読]
【42073】Re:教えてください ponpon 06/8/31(木) 1:28 発言[未読]
【42075】Re:教えてください nobu 06/8/31(木) 1:51 発言[未読]
【42082】Re:教えてください ponpon 06/8/31(木) 10:32 発言[未読]
【42085】Re:教えてください ponpon 06/8/31(木) 12:46 発言[未読]
【42089】Re:教えてください nobu 06/8/31(木) 14:24 お礼[未読]

【42043】教えてくださーい
質問  nobu  - 06/8/30(水) 11:45 -

引用なし
パスワード
   VBA一年生です。勉強のために下記コード練習中ですが
うんともすんとも動きません。手助けお願いします。

1.表示で小数の場合は小数点以下2位まで表示したい。
2.2,5,8列目が未入力なら表示しない。
 たぶんベテランなら簡単なんでしょうが単純な計算ですから
 ちょっと考え込んでいます。よろしくお願いします。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As String
x = Range("A65536").End(xlUp).Row

For i = 1 To x
  Cells(i, 3).Value = Cells(i, 1) - Cells(i, 2)
  Cells(i, 6).Value = Cells(i, 4) * Cells(i, 5)
  Cells(i, 9).Value = Cells(i, 7) / Cells(i, 8)
Next
End Sub

【42045】Re:教えてください
発言  かみちゃん E-MAIL  - 06/8/30(水) 12:28 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> うんともすんとも動きません。

これは、どういう動作を期待しているのでしょうか?
コードを見る限り、シートのセルの値が変わると動かしたいように見えますが、
どこのセルの値が変わっても、まったく同じ計算をするコードになっています。
そういう動作でいいのであれば、シートモジュールに記述していますか?

それとも、標準モジュールに記述して、適当なタイミングでマクロを実行したい
けど、マクロの一覧に出てこないとかそういうことですか?

>1.表示で小数の場合は小数点以下2位まで表示したい。

一般操作で表示させる方法はわかりますか?
わかるのであれば、「マクロの記録」で記録してみることをおすすめします。

>2.2,5,8列目が未入力なら表示しない。

If文で分岐処理をすることになります。

If Cells(i, 2).Value = "" Then
 MsgBox "2列目の値はありません"
End If

【42046】Re:教えてください
発言  nobu  - 06/8/30(水) 12:57 -

引用なし
パスワード
   ▼かみちゃん さん:
>これは、どういう動作を期待しているのでしょうか?
>コードを見る限り、シートのセルの値が変わると動かしたいように見えますが、
はいそうなんですが
>どこのセルの値が変わっても、まったく同じ計算をするコードになっています。
>そういう動作でいいのであれば、シートモジュールに記述していますか?
>それとも、標準モジュールに記述して、適当なタイミングでマクロを実行したい
>けど、マクロの一覧に出てこないとかそういうことですか?
2列目(2,5,8列目)に値が入力された場合計算させたいのですが
>>1.表示で小数の場合は小数点以下2位まで表示したい。
>
>一般操作で表示させる方法はわかりますか?
>わかるのであれば、「マクロの記録」で記録してみることをおすすめします。

たぶんこういうことでは Format(z, "#,#.00")

>>2.2,5,8列目が未入力なら表示しない。

>If文で分岐処理をすることになります。
>
>If Cells(i, 2).Value = "" Then
> MsgBox "2列目の値はありません"
>End If
こうですか?
If Cells(i, 2).Value = "" Then
  Cells(i, 3).Value = Cells(i, 1) - Cells(i, 2)
If Cells(i, 5).Value = "" Then
  Cells(i, 6).Value = Cells(i, 4) * Cells(i, 5)
よくわかりませんが
いかがですか

【42066】Re:教えてください
発言  ponpon  - 06/8/30(水) 22:01 -

引用なし
パスワード
   やりたいことがいまいちよくわからないのですが、

こんな感じでいかがでしょう。
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As String
  
  x = Range("A65536").End(xlUp).Row
  With Target
    If IsEmpty(.Value) Then Exit Sub
    If .Count > 1 Then Exit Sub
    If .Column = 2 Or .Column = 5 Or .Column = 8 Then
      Application.EnableEvents = False
       For i = 1 To x
        If Cells(i, 2).Value <> "" And Cells(i, 5).Value <> "" _
          And Cells(i, 8).Value <> "" Then
         Cells(i, 3).Value = Round(Cells(i, 1) - Cells(i, 2), 2)
         Cells(i, 6).Value = Round(Cells(i, 4) * Cells(i, 5), 2)
         Cells(i, 9).Value = Round(Cells(i, 7) / Cells(i, 8), 2)
        End If
       Next
      Application.EnableEvents = True
    End If
  End With
End Sub

【42070】Re:教えてください
発言  nobu  - 06/8/30(水) 23:37 -

引用なし
パスワード
   ▼ponpon さん:
回答ありがとうございます。
>こんな感じでいかがでしょう。
>Private Sub Worksheet_Change(ByVal Target As Range)
>  Dim x As String
>  
>  x = Range("A65536").End(xlUp).Row
>  With Target
>    If IsEmpty(.Value) Then Exit Sub
>    If .Count > 1 Then Exit Sub
>    If .Column = 2 Or .Column = 5 Or .Column = 8 Then
>      Application.EnableEvents = False
>       For i = 1 To x
>        If Cells(i, 2).Value <> "" And Cells(i, 5).Value <> "" _
>          And Cells(i, 8).Value <> "" Then
>         Cells(i, 3).Value = Round(Cells(i, 1) - Cells(i, 2), 2)
>         Cells(i, 6).Value = Round(Cells(i, 4) * Cells(i, 5), 2)
>         Cells(i, 9).Value = Round(Cells(i, 7) / Cells(i, 8), 2)
>        End If
>       Next
>      Application.EnableEvents = True
>    End If
>  End With
>End Sub
H列入力後全て計算されるのですが
B列入力時C列計算答え E列入力時F列計算答え・・・・・
ということができますか?
よろしくお願いします。
A    B    C     D    E     F    G  H     I
500    200    300    150    100    15000    500  100     5
300    100    200    120    50    6000    300  125       2.4

【42071】Re:教えてください
質問  nobu  - 06/8/31(木) 0:28 -

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

>回答ありがとうございます。
>>こんな感じでいかがでしょう。
>>Private Sub Worksheet_Change(ByVal Target As Range)
>>  Dim x As String
>>  
>>  x = Range("A65536").End(xlUp).Row
>>  With Target
>>    If IsEmpty(.Value) Then Exit Sub
>>    If .Count > 1 Then Exit Sub
>>    If .Column = 2 Or .Column = 5 Or .Column = 8 Then
>>      Application.EnableEvents = False
>>       For i = 1 To x
>>        If Cells(i, 2).Value <> "" And Cells(i, 5).Value <> "" _
>>          And Cells(i, 8).Value <> "" Then
>>         Cells(i, 3).Value = Round(Cells(i, 1) - Cells(i, 2), 2)
>>         Cells(i, 6).Value = Round(Cells(i, 4) * Cells(i, 5), 2)
>>         Cells(i, 9).Value = Round(Cells(i, 7) / Cells(i, 8), 2)
>>        End If
>>       Next
>>      Application.EnableEvents = True
>>    End If
>>  End With
>>End Sub
H列入力後全て計算されるのですが
B列入力時C列計算答え E列入力時F列計算答え・・・・・
ということができますか?
よろしくお願いします。
> A    B    C     D    E     F    G  H     I
>500    200    300    150    100    15000    500  100     5
>300    100    200    120    50    6000    300  125       2.4
追伸ですが
下記のように修正してみたのですが
仮に1行目計算終了していてC1の300を一度消去した場合
2行目の100を入れると1行目の数値も再計算されまた300という
答えが返ってしまいます。これを行毎に計算させることは出来ないでしょうか
また、たとえば1行目の200をdeleteした場合300も消したいと思っているのですが
以下右項も同様です。いかがでしょうか。
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As String
 
  x = Range("A65536").End(xlUp).Row
  With Target
    If IsEmpty(.Value) Then Exit Sub
    If .Count > 1 Then Exit Sub
    If .Column = 2 Or .Column = 5 Or .Column = 8 Then
      Application.EnableEvents = False
       For i = 1 To x
        If Cells(i, 2).Value <> "" Then
         Cells(i, 3).Value = Round(Cells(i, 1) - Cells(i, 2), 2)
        If Cells(i, 5).Value <> "" Then
         Cells(i, 6).Value = Round(Cells(i, 4) * Cells(i, 5), 2)
         If Cells(i, 8).Value <> "" Then
         Cells(i, 9).Value = Round(Cells(i, 7) / Cells(i, 8), 2)
        End If
      
      Application.EnableEvents = True
    End If
   End If
   Next
  End If
  End With
End Sub

【42072】Re:教えてください
発言  ponpon  - 06/8/31(木) 0:55 -

引用なし
パスワード
   ▼nobu さん:
>H列入力後全て計算されるのですが
>B列入力時C列計算答え E列入力時F列計算答え・・・・・
>ということができますか?
>よろしくお願いします。
>> A    B    C     D    E     F    G  H     I
>>500    200    300    150    100    15000    500  100     5
>>300    100    200    120    50    6000    300  125       2.4
>追伸ですが
>下記のように修正してみたのですが
>仮に1行目計算終了していてC1の300を一度消去した場合
>2行目の100を入れると1行目の数値も再計算されまた300という
>答えが返ってしまいます。これを行毎に計算させることは出来ないでしょうか
>また、たとえば1行目の200をdeleteした場合300も消したいと思っているのですが

>やりたいことがよくわからない
と書いていたと思います。

>>       For i = 1 To x
>>        If Cells(i, 2).Value <> "" And Cells(i, 5).Value <> "" _
>>          And Cells(i, 8).Value <> "" Then
>>         Cells(i, 3).Value = Round(Cells(i, 1) - Cells(i, 2), 2)
>>         Cells(i, 6).Value = Round(Cells(i, 4) * Cells(i, 5), 2)
>>         Cells(i, 9).Value = Round(Cells(i, 7) / Cells(i, 8), 2)
>>        End If
>>       Next

ここの部分で、2,5,8列に入力があれば、すべて再計算されてしまいます。
マクロでするより、数式ではダメなのでしょうか?
C1に「=IF(B1="","",A1-B1)」と入力し必要なだけフィル
FIに「=IF(E1="","",D1*E1)」と入力し必要なだけフィル
I1に「=IF(ISERR(ROUND(G1/H1,2)),"",ROUND(G1/H1,2))」と入力し必要なだけフィル
これだと、再計算されず、計算を自動にしていれば、望むものになると思いますが・・
数式は、苦手なので間違いがあるかも??

【42073】Re:教えてください
発言  ponpon  - 06/8/31(木) 1:28 -

引用なし
パスワード
   どうしてもマクロなら、
こんな感じかな?

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If IsEmpty(.Value) Then Exit Sub
    If .Count > 1 Then Exit Sub
    If Application.Intersect(Target, Range("B:B,E:E,H:H")) Is Nothing Then Exit Sub
      Application.EnableEvents = False
        Select Case .Column
         Case 2
            .Offset(, 1).Value = Round(.Offset(, -1).Value - .Value, 2)
         Case 5
            .Offset(, 1).Value = Round(.Offset(, -1).Value * .Value, 2)
         Case 8
            .Offset(, 1).Value = Round(.Offset(, -1).Value / .Value, 2)
        End Select
      Application.EnableEvents = True
  End With
End Sub

【42075】Re:教えてください
発言  nobu  - 06/8/31(木) 1:51 -

引用なし
パスワード
   ▼ponpon さん:
ありがとうございます。ほぼ希望通りなのですが
たとえば2列目の200をdeleteした場合3列目300も消したいと思っているのですが

一度クリアすると言うことですができますか。?

追伸 [#42074] はタイミングがずれてしまいました気にしないでください。
コードの構成が前とは驚くほど変わってしまうんですね。(*_*)
>どうしてもマクロなら、
>こんな感じかな?
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  With Target
>    If IsEmpty(.Value) Then Exit Sub
>    If .Count > 1 Then Exit Sub
>    If Application.Intersect(Target, Range("B:B,E:E,H:H")) Is Nothing Then Exit Sub
>      Application.EnableEvents = False
>        Select Case .Column
>         Case 2
>            .Offset(, 1).Value = Round(.Offset(, -1).Value - .Value, 2)
>         Case 5
>            .Offset(, 1).Value = Round(.Offset(, -1).Value * .Value, 2)
>         Case 8
>            .Offset(, 1).Value = Round(.Offset(, -1).Value / .Value, 2)
>        End Select
>      Application.EnableEvents = True
>  End With
>End Sub

【42082】Re:教えてください
発言  ponpon  - 06/8/31(木) 10:32 -

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

おはようございます。

>ありがとうございます。ほぼ希望通りなのですが
>たとえば2列目の200をdeleteした場合3列目300も消したいと思っているのですが
>
>一度クリアすると言うことですができますか。?

これではどうでしょう?
条件分岐 If Then Else や Slect Case を ヘルプや過去ログを参考に
勉強されるといいですよ。

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .Count > 1 Then Exit Sub
    If Application.Intersect(Target, Range("B:B,E:E,H:H")) Is Nothing Then Exit Sub
      Application.EnableEvents = False
      If IsEmpty(.Value) Then
        .Offset(, 1).ClearComments
      Else
       Select Case .Column
        Case 2
          .Offset(, 1).Value = Round(.Offset(, -1).Value - .Value, 2)
        Case 5
          .Offset(, 1).Value = Round(.Offset(, -1).Value * .Value, 2)
        Case 8
          .Offset(, 1).Value = Round(.Offset(, -1).Value / .Value, 2)
       End Select
      End If
      Application.EnableEvents = True
  End With
End Sub

【42085】Re:教えてください
発言  ponpon  - 06/8/31(木) 12:46 -

引用なし
パスワード
   訂正です。
>      If IsEmpty(.Value) Then
>        .Offset(, 1).ClearComments
        .Offset(, 1).ClearContents
>      Else

【42089】Re:教えてください
お礼  nobu  - 06/8/31(木) 14:24 -

引用なし
パスワード
   ▼ponpon さん:
>訂正です。
>>      If IsEmpty(.Value) Then
>>        .Offset(, 1).ClearComments
>        .Offset(, 1).ClearContents
>>      Else
ponponさん長いことご指導ありがとうございました。
ようやく思い通りになりました。感謝です また下記の件も
これから勉強してみます。
>条件分岐 If Then Else や Slect Case を ヘルプや過去ログを参考に
>勉強されるといいですよ。
解決しました。(^_^)/~

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