Excel VBA質問箱 IV

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

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


334 / 13645 ツリー ←次へ | 前へ→

【80956】vbaの行の取得について 名無しの権兵衛 19/6/25(火) 17:16 質問[未読]
【80957】Re:vbaの行の取得について マナ 19/6/25(火) 17:50 発言[未読]
【80958】Re:vbaの行の取得について 名無しの権兵衛 19/6/25(火) 18:32 発言[未読]
【80959】Re:vbaの行の取得について マナ 19/6/25(火) 18:55 発言[未読]
【80960】Re:vbaの行の取得について マナ 19/6/25(火) 19:07 発言[未読]
【80961】Re:vbaの行の取得について マナ 19/6/25(火) 22:09 発言[未読]
【80964】Re:vbaの行の取得について 名無しの権兵衛 19/6/26(水) 14:51 お礼[未読]
【80962】Re:vbaの行の取得について 名無しの権兵衛 19/6/26(水) 10:07 回答[未読]

【80956】vbaの行の取得について
質問  名無しの権兵衛  - 19/6/25(火) 17:16 -

引用なし
パスワード
   例   A1でユーザ定義関数を使ったら1-5行目
     A2でユーザ定義関数を使ったら2-6行目
でループしたいのですが、どのように求めたら良いのでしょうか?

【80957】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 17:50 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

どんな関数か、もう少し具体的な例にできませんか。

Application.Callerでできると思いますが
引数に行を指定すればよいだけのような気がします。

【80958】Re:vbaの行の取得について
発言  名無しの権兵衛  - 19/6/25(火) 18:32 -

引用なし
パスワード
   funcに項目の種類を渡して
自分の一つ下の項目の種類の合計を求めたいです。
上の中項目 5
2個目の中項目 1
大項目   6
となるように求めたいです。
_____________________
大項目 | func(A1)
中項目 | func(A2)
小項目 | 3
小項目 | 2
中項目 | func(A5)
小項目 | 1
大項目 | func(A7)
中項目 | func(A8)
小項目 | 1
_____________________

【80959】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 18:55 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

よくわかりません。
どのセルに何が入力されているか
どのセルが数式で、そんな結果を期待しているか
説明してください。

   -A-   -B-
1        
2        
3        
4        
5        
5        
6        
7        
8

【80960】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 19:07 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

何をしたいは理解しました。
でも、それが、なぜ最初の質問につながるのか理解できません。

【80961】Re:vbaの行の取得について
発言  マナ  - 19/6/25(火) 22:09 -

引用なし
パスワード
   ▼名無しの権兵衛 さん:

こんな感じでしょうか。


Function func(集計項目 As Range) As Double
  Dim f As Range
  Dim r As Range
  Dim c As Range
  
  Application.Volatile
  
  With Range(集計項目, 集計項目.End(xlDown))
    Set f = .Find(集計項目.Value, 集計項目, , xlWhole)
    If f.Row = 集計項目.Row Then
       Set r = Range(集計項目.Offset(1), .Cells(.Count))
    Else
      Set r = Range(集計項目.Offset(1), f.Offset(-1))
    End If
  End With
    
  For Each c In r.Offset(, Application.Caller.Column - 集計項目.Column)
    If Not c.HasFormula Then
      func = func + c.Value
    End If
  Next

End Function

でも、func2がよいと思います。

Function func2(集計項目 As Range, データ範囲 As Range, 列番号 As Long) As Double
  Dim f As Range
  Dim r As Range
  Dim c As Range
  
  With データ範囲.Columns(1).Cells
    Set f = .Find(集計項目.Value, 集計項目, , xlWhole)
    If f.Row <= 集計項目.Row Then
       Set r = Range(集計項目.Offset(1), .Cells(.Count))
    Else
      Set r = Range(集計項目.Offset(1), f.Offset(-1))
    End If
  End With
  
  For Each c In r.Columns(列番号).Cells
    If Not c.HasFormula Then
      func2 = func2 + c.Value
    End If
  Next

End Function

【80962】Re:vbaの行の取得について
回答  名無しの権兵衛  - 19/6/26(水) 10:07 -

引用なし
パスワード
      -A-   -B-
1   大    func(A1) 
2   中    func(A2) 
3   小    1 
4   小    2 
5   中    func(A5)     
6   小    3 
7   大    func(A7) 

B1はB2B5の合計
B2はB3B4の合計
B5はB6の値
となるように実装したいです。

【80964】Re:vbaの行の取得について
お礼  名無しの権兵衛  - 19/6/26(水) 14:51 -

引用なし
パスワード
   ありがとうございました。

色々調べたところ、thiscellで実装できました。

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