Excel VBA質問箱 IV

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

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


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

【5370】おしえてください。 Coo 03/5/8(木) 21:12 質問
【5372】Re:おしえてください。 Nakamura 03/5/8(木) 23:28 回答
【5373】Re:おしえてください。 Coo 03/5/9(金) 2:38 発言
【5378】Re:おしえてください。 Jaka 03/5/9(金) 11:10 回答
【5380】Re:おしえてください。 Nakamura 03/5/9(金) 12:41 発言
【5398】Re:おしえてください。 Coo 03/5/9(金) 23:56 質問
【5402】Re:おしえてください。 Hirofumi 03/5/10(土) 9:10 回答
【5404】Re:おしえてください。 Coo 03/5/10(土) 14:52 質問
【5406】Re:おしえてください。 Hirofumi 03/5/10(土) 15:56 回答
【5438】Re:おしえてください。 Coo 03/5/13(火) 23:25 お礼

【5370】おしえてください。
質問  Coo  - 03/5/8(木) 21:12 -

引用なし
パスワード
   いつもお世話になっています。

A列に4行目からn行目まで数字が入っています。これらの値を読み込んで合計していくプログラムを作成しました。やりたいことはこれだけでなく後にもいろいろ計算が続くものです。
今、A列の任意の行に「Space」と入力するとC列の4行目の値を変わりに読み込むようにしたいのですが、「Space」を認識させるにはどのようにしたらよいのでしょうか?
いろいろやってみたのですがどうも上手くいきません・・・

どなたか教えていただけないでしょうか?

【5372】Re:おしえてください。
回答  Nakamura  - 03/5/8(木) 23:28 -

引用なし
パスワード
   こんばんは

セルの内容が変わったら発生するイベントがあります。
これを使って実現する事ができます。

シートモジュールに以下のように記述してください。

Private Sub Worksheet_Change(ByVal Target As Range)

  With Target
  
    If .Row >= 4 And .Column = 1 And .Value = "Space" Then
    
      Application.EnableEvents = False
      
        .Value = Range("C4").Value
        
      Application.EnableEvents = False
      
    End If
    
  End With
      
End Sub

それでは

【5373】Re:おしえてください。
発言  Coo  - 03/5/9(金) 2:38 -

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

レスありがとうございます。

A4に12・A5にSpace・C4に10を入れてA1にA4+A5の値を入れることで確認したのですが、上手くいきません。(一回上手く行ったのですが・・・)

シートモジュールに以下のように記載したのですが・・・


Private Sub Worksheet_Change(ByVal Target As Range)
With Target
    If .Row >= 4 And .Column = 1 And .Value = "S" Then
      Application.EnableEvents = False
        .Value = Range("C4").Value
      Application.EnableEvents = False
    End If
  End With
End Sub


Private Sub CommandButton1_Click()
     Cells(1, 1) = Cells(4, 1) + Cells(5, 1)
End Sub

【5378】Re:おしえてください。
回答  Jaka  - 03/5/9(金) 11:10 -

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

直して
If .Row >= 4 And .Column = 1 And .Value = "S" Then
  Application.EnableEvents = False
  .Value = Range("C4").Value
  Application.EnableEvents = True
End If

エクセルを再起動させるか、下記コードを実行してください。

標準モジュール
Sub akkj()
Application.EnableEvents = True
End Sub

【5380】Re:おしえてください。
発言  Nakamura  - 03/5/9(金) 12:41 -

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

Jakaさんフォロー有り難うございます。m(_ _)m
Cooさん動作確認不十分なコードを載せてしまい、申し訳有りませんでした。
コピペしてFalseからTrueに直すのを忘れました。^^;;;)

それでは

【5398】Re:おしえてください。
質問  Coo  - 03/5/9(金) 23:56 -

引用なし
パスワード
   Nakamuraさん・Jakaさんレスありがとうございます。
いつもながらありがとうございます。動作しました。勉強になりました。
しかし、こちらの説明不足でした。
セルにSと入れた部分は常にSを表示しておき、Sにはループで次々と違う値を入れて
いきたいのです。(またSの位置は変動します。)
例えば、以下のようにAn:Cnまでデータが入っているとき


  A  B  C

4  4  5  0.01
5  2  4  0.05
6  10 S  1
7  4  2  10
8  0  1  2
: : : :
n  4  5  1

ループ1回目(k=1)のときB6のSにC4の0.01を認識させてB列を合計し、A列の合計
値と掛け合わせる。
これをC列にデータが入っている限り順々にデータを読み込んで計算を繰り返す。
このような物を作りたいため常にB6にはSを表示させておきたいのです。
貴重なお時間をいただいているにもかかわらず申し訳ないのですがお教えいただけま
すでしょうか?

【5402】Re:おしえてください。
回答  Hirofumi E-MAIL  - 03/5/10(土) 9:10 -

引用なし
パスワード
   マクロで集計だけすれば善いなら
こんな、かな?
結果は、D列に書き込んでます

Public Sub TestCalc()

  Dim i As Long
  Dim lngTop As Long
  Dim lngEnd As Long
  Dim vntData As Variant
  Dim vntResult As Variant
  Dim vntSumA As Variant
  Dim vntSumB As Variant
  
  'データ先頭行
  lngTop = 4
  'データ最終行取得
  lngEnd = Cells(65536, 1).End(xlUp).Row
  '結果書き込み用配列の確保
  ReDim vntResult(1 To (lngEnd - lngTop + 1), 1 To 1)
  
  'データを配列に取得
  vntData = Range(Cells(lngTop, 1), Cells(lngEnd, 3)).Value
  'A列の合計とB列の"S"を除く合計の取得
  For i = 1 To lngEnd - lngTop + 1
    'A列の合計
    vntSumA = vntSumA + vntData(i, 1)
    'B列の"S"を除く合計
    If vntData(i, 2) <> "S" Then
      vntSumB = vntSumB + vntData(i, 2)
    End If
  Next i
  
  '集計用配列に計算結果を代入
  For i = 1 To lngEnd - lngTop + 1
    vntResult(i, 1) = vntSumA * (vntSumB + vntData(i, 3))
  Next i

  '集計用配列をセルに書き込み
  Range(Cells(lngTop, 4), Cells(lngEnd, 4)).Value = vntResult
  
End Sub

【5404】Re:おしえてください。
質問  Coo  - 03/5/10(土) 14:52 -

引用なし
パスワード
   ▼Hirofumi さん:
こんにちは。
レスありごとうございます。

>    'B列の"S"を除く合計
>    If vntData(i, 2) <> "S" Then

〈〉でS以外のデータとすればいいのですね。

しかし疑問が沸きました。
教えていただいたようにSは後で換算することで合計となりますが、以下のような場合はどうしたら良いのでしょうか?

  A  B  ・・ D
1  4  5    10
2  2  4    0.05
3  10 S    1
4  4  2    10
5  0  1    2
:  :  :    :
n  4  5    1

いま、Sの位置は変動します。
ループ1回目(k=1)のときA1とB1、A2とB2、A3とB3・・・AnとBnの値を掛け合わせる。このときB3にはSが入っているのでSの変わりにD1の10の値を計算に用いる。
これをC列にデータが入っている限り順々にデータを読み込んで計算を繰り返す。Findメソッドを使用してみようと過去レスやヘルプを見てみたんですが良くわかりません。
Sの位置をみつけてSに数字を認識させるにはどうしたらよいのでしょうか?御教授お願いいたいます?

【5406】Re:おしえてください。
回答  Hirofumi E-MAIL  - 03/5/10(土) 15:56 -

引用なし
パスワード
   チョット、意味が理解できない部分が有り怪しいのですけれど?
乗算の結果をE列以降に、D列の行数だけ書き込みます

Public Sub TestCalc2()

  Dim i As Long
  Dim j As Long
  Dim lngTop As Long
  Dim lngEnd As Long
  Dim vntData As Variant
  Dim vntResult As Variant
  
  'データ先頭行
  lngTop = 4
  'データ最終行取得
  lngEnd = Cells(65536, 1).End(xlUp).Row
  '結果書き込み用配列の確保
  ReDim vntResult(1 To (lngEnd - lngTop + 1), _
            1 To (lngEnd - lngTop + 1))
  
  'データを配列に取得
  vntData = Range(Cells(lngTop, 1), Cells(lngEnd, 4)).Value
  
  '最終行まで繰り返し
  For i = 1 To lngEnd - lngTop + 1
    'D列の最終行まで繰り返し
    For j = 1 To lngEnd - lngTop + 1
      '集計用配列に計算結果を代入
      If vntData(i, 2) <> "S" Then
        'B列が"S"以外の場合
        vntResult(i, j) = vntData(i, 1) * vntData(i, 2)
      Else
        'B列が"S"の場合、D列の値に因り計算
        vntResult(i, j) = vntData(i, 1) * vntData(j, 4)
      End If
    Next j
  Next i
  
  '集計用配列をセルに書き込み
  Range(Cells(lngTop, 5), _
      Cells(lngEnd, 5 + lngEnd - lngTop)).Value = vntResult
  
End Sub

【5438】Re:おしえてください。
お礼  Coo  - 03/5/13(火) 23:25 -

引用なし
パスワード
   ▼Hirofumi さん:
こんばんわ。
参考にさせていただき、求めたものができました。
お礼が遅れて申し訳ありませんでした。

Nakamuraさん・Jakaさん・Hirofumiさんありがとうございました。

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