Excel VBA質問箱 IV

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

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


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

【36137】合計の式を入力したいが、範囲を検索したい時は? もりもり 06/3/22(水) 10:39 質問[未読]
【36140】Re:合計の式を入力したいが、範囲を検索し... Statis 06/3/22(水) 13:18 発言[未読]
【36146】Re:合計の式を入力したいが、範囲を検索... もりもり 06/3/22(水) 16:56 質問[未読]
【36147】Re:合計の式を入力したいが、範囲を検索... Statis 06/3/22(水) 17:05 回答[未読]
【36153】Re:合計の式を入力したいが、範囲を検索... もりもり 06/3/22(水) 20:04 お礼[未読]
【36154】Re:合計の式を入力したいが、範囲を検索... Statis 06/3/22(水) 20:36 回答[未読]
【36156】Re:合計の式を入力したいが、範囲を検索... もりもり 06/3/22(水) 21:32 お礼[未読]
【36168】Re:合計の式を入力したいが、範囲を検索... Statis 06/3/23(木) 13:47 回答[未読]
【36171】Re:合計の式を入力したいが、範囲を検索... もりもり 06/3/23(木) 16:50 お礼[未読]

【36137】合計の式を入力したいが、範囲を検索した...
質問  もりもり  - 06/3/22(水) 10:39 -

引用なし
パスワード
    全くのVBA初心者です。
 "合計"の次行(直下)のセルを指定して、その左側の列(1月〜12月)までの
値の合計を出したい場合、
(1)「1月を検索」→「次行(直下)のセルに移動」→「1〜12月の値のセル番地を取得」

  Selection.Find(What:="1月").Select
  Selection.Offset(1, 0).Select
  ActiveCell.Resize(1, 12).Select
  Dim cellbanchi As String
  cellbanchi = Selection.Address

(2)「合計を検索」→「次行(直下)のセルに移動」→「合計のセル番地を取得」
  Selection.Find(What:="合計").Select
  Selection.Offset(1, 0).Select
  Dim goukei As String
  goukei = Selection.Address

そして、(1)で求めた値の合計を、(2)のセルに求めたいとき、どのようにすればいいか分かりません。
よろしくお願いします。

【36140】Re:合計の式を入力したいが、範囲を検索...
発言  Statis  - 06/3/22(水) 13:18 -

引用なし
パスワード
   こんにちは
どこの範囲を検索しているのかわかりませんシートのレイアウトを記載して
行いたいことを具体的に記載して下さい。

【36146】Re:合計の式を入力したいが、範囲を検索...
質問  もりもり  - 06/3/22(水) 16:56 -

引用なし
パスワード
   Statisさん初めまして。
ご指摘のとおりです。補足させていただきます。
やろうとしていることは、CSVのデータをEXCELに読み込んで、VBAで編集しようとしています。
何列目の何行目に目的のセルがあるのか分からない状態を想定しておりますので、検索場所も、シート全体を指定するものとして、記述したいと思っています。
読み込む表は下のようなイメージです。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
|年月日  |支出目的|1 月|2 月|3 月|4 月|5 月| ∫ | 11月| 12月|合計 |
−−−−−−−−−−−−−−−−−−−−−−−   −−−−−−−−
|16.01.02| 食糧費 | 1200|2000| 3000|2300| 1000| 略 |15000| 20000|    |
−−−−−−−−−−−−−−−−−−−−−−−   −−−−−−−−
|16.01.02| 活動費 | 1200|2000| 3000|1300| 1000| ∫ |35000| 20000|    |
−−−−−−−−−−−−−−−−−−−−−−−   −−−−−−−−
|16.01.02|高熱水費 | 1000|1000|    |    | 5000| ∫ | 5000|     |    |
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

雑ぱくですが、よろしくお願い致します。


> 全くのVBA初心者です。
> "合計"の次行(直下)のセルを指定して、その左側の列(1月〜12月)までの
>値の合計を出したい場合、
>(1)「1月を検索」→「次行(直下)のセルに移動」→「1〜12月の値のセル番地を取得」
>
>  Selection.Find(What:="1月").Select
>  Selection.Offset(1, 0).Select
>  ActiveCell.Resize(1, 12).Select
>  Dim cellbanchi As String
>  cellbanchi = Selection.Address
>
>(2)「合計を検索」→「次行(直下)のセルに移動」→「合計のセル番地を取得」
>  Selection.Find(What:="合計").Select
>  Selection.Offset(1, 0).Select
>  Dim goukei As String
>  goukei = Selection.Address
>
>そして、(1)で求めた値の合計を、(2)のセルに求めたいとき、どのようにすればいいか分かりません。
>よろしくお願いします。

【36147】Re:合計の式を入力したいが、範囲を検索...
回答  Statis  - 06/3/22(水) 17:05 -

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

これで如何かな?
データは2行目からで良いですか?

Sub Test()
Dim Ma As Variant, Da As Variant
Dim Co(1) As Long, i As Long, Ad As String
i = 0
With ActiveSheet
   For Each Da In Array("1月", "合計")
     Ma = Application.Match(Da, .Rows(1), 0)
     If IsError(Ma) Then
      MsgBox "データなし", vbCritical
      Exit Sub
     End If
     Co(i) = Val(Ma)
     i = i + 1
   Next Da
  Ad = .Range(.Cells(2, Co(0)), .Cells(2, Co(1) - 1)).Address(0, 0)
  With .Range(.Cells(2, Co(0)), .Cells(65536, Co(0)).End(xlUp)).Offset(, Co(1) - Co(0))
     .Formula = "=SUM(" & Ad & ")"
     .Value = .Value
  End With
End With
End Sub

【36153】Re:合計の式を入力したいが、範囲を検索...
お礼  もりもり  - 06/3/22(水) 20:04 -

引用なし
パスワード
   早速のご回答ありがとうございます。
すごい記述だな〜とビックリしている次第です。
恥ずかしながら、なにぶん素人なもので、コードを理解するのが難しいです。
少し分析させてください。
ちなみに、1〜3行目をブランクにして、4行目から表を開始している場合は、メッセージボックスが開き「データなし」が表示されました。
何行目から、表が始まるか分からないときは、どうすれば良いのでしょうか?
度々すみません。m(_ _)m

【36154】Re:合計の式を入力したいが、範囲を検索...
回答  Statis  - 06/3/22(水) 20:36 -

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

最終データ行を取得するのは「年月日」の列で良いですか?

このデータには「年月日」「1月」「合計」が無ければ処理しません。
上記項目は同じ行にあること。

ではお試しを。

Sub Test_1()
Dim Fi As Range, Ma As Variant
Dim Ro As Long, Ad As String

With ActiveSheet
   Set Fi = .Cells.Find("年月日", , xlValues, xlWhole)
   If Fi Is Nothing Then
    MsgBox "年月日がありません。", vbCritical
    Exit Sub
   End If
   Ro = .Cells(65536, Fi.Column).End(xlUp).Row
   Set Fi = Nothing
   Set Fi = .Cells.Find("1月", , xlValues, xlWhole)
   If Fi Is Nothing Then
    MsgBox "1月がありません。", vbCritical
    Exit Sub
   End If
   Ma = Application.Match("合計", .Rows(Fi.Row), 0)
   If IsError(Ma) Then
    MsgBox "合計がありません。", vbCritical
    Exit Sub
   End If
   Ad = .Range(.Cells(Fi.Row + 1, Fi.Column), .Cells(Fi.Row + 1, Ma - 1)).Address(0, 0)
   With .Range(.Cells(Fi.Row + 1, Fi.Column), .Cells(Ro, Fi.Column)).Offset(, Ma - Fi.Column)
     .Formula = "=SUM(" & Ad & ")"
     .Value = .Value
   End With
End With

End Sub

【36156】Re:合計の式を入力したいが、範囲を検索...
お礼  もりもり  - 06/3/22(水) 21:32 -

引用なし
パスワード
   スッゴいです。
バッチリです。
相変わらず、コードが難解ですが。(すみません。)
完璧です。
早速使わせていただきます。


ところで、余談ですが、最初の質問のとおり、selection.find〜〜ってのを2つ続けると、「実行エラー"91"」:「オブジェクト変数またはWithブロック変数が設定されていません」というメッセージが出るんですが、意味が分かりません。
さらにデバッグしているとSet〜〜とかなんとか表示されました。
これは、「二重に検索をしてしまうと、set〜〜を使ってはじめに検索したものをクリアする必要がある。」と自己流解釈しているんですが、この回避方法というのは、どのようにすれば良いのでしょうか?
今後も使う機会がありそうなので、ご教示頂けるとありがたいです。

【36168】Re:合計の式を入力したいが、範囲を検索...
回答  Statis  - 06/3/23(木) 13:47 -

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

Errの内容は検索値が無い場合にでますね。

間違いなくある場合は良いのですが。
今回のように範囲など不明で、値があるか無いかも判らない場合、もし値が無い場合はErrがでます
私はFindメソッドを使う場合は必ず「Set ステートメント」を使うようにしています。
なぜなら、無い場合の処理をするためです。
例:
Dim Fi As Range
Set Fi=Cells.Find("値",・・・・)

If分で確認します
If Not Fi is Nothing Then
  あったよ
Else
 なかったよ
End If

最後に変数を初期化します
Set Fi=Nothing

【36171】Re:合計の式を入力したいが、範囲を検索...
お礼  もりもり  - 06/3/23(木) 16:50 -

引用なし
パスワード
   こんにちは、
Statis さん、
基本的なところまで、丁寧にご教示くださり、本当にありがとうございます。
度々ご質問すると思いますが、今後ともよろしくお願い致します。

m(_ _)m

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