Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Microsoft 365)
繰り返し計算させる方法
投稿日時: 23/06/14 15:10:13
投稿者: 破傷庵

いつもお世話になっております。よろしくお願いします。
 
Sub Macro7()
'
' Macro7 Macro
'
 
'
   Sheets("試算表").Select
        Range("D8").Select
     
    ActiveCell.FormulaR1C1 = _
        "=IF(R[-7]C[-3]=5,SUMIFS(仕訳!R6C9:R25000C9,仕訳!R6C1:R25000C1,""<220601"",仕訳!R6C17:R25000C17,RC[-3]))"
       
                    'R[-7]C[-3] D8から見て 6行目上 3列目左
     
    Range("D8").Select
 
End Sub
自動記録で作りました。A1に入っている数値は5で5月です。
4がつから翌年3月までで <220601 これも月ごとに変わります。月が変わるごとに下記の通りの
計算式を入れています。VBAで出来る方法を教えてください。82歳の手習い、よろしくお願いいたします。
 
 
 4月 =IF($A$1=4,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<220501",仕訳!$Q$6:$Q$25000,A8))
 
 5月 =IF($A$1=5,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<220601",仕訳!$Q$6:$Q$25000,A8))
 
 6月 =IF($A$1=6,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<220701",仕訳!$Q$6:$Q$25000,A8))
 
 7月 =IF($A$1=7,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<220801",仕訳!$Q$6:$Q$25000,A8))
 
 8月 =IF($A$1=8,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<220901",仕訳!$Q$6:$Q$25000,A8))
 
 9月 =IF($A$1=9,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<221001",仕訳!$Q$6:$Q$25000,A8))
 
 10月 =IF($A$1=10,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<221101",仕訳!$Q$6:$Q$25000,A8))
 
 11月 =IF($A$1=11,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<221201",仕訳!$Q$6:$Q$25000,A8))
 
 12月 =IF($A$1=12,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<230101",仕訳!$Q$6:$Q$25000,A8))
 
 1月 =IF($A$1=1,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<230201",仕訳!$Q$6:$Q$25000,A8))
 
 2月 =IF($A$1=2,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<230301",仕訳!$Q$6:$Q$25000,A8))
 
 3月 =IF($A$1=3,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<230401",仕訳!$Q$6:$Q$25000,A8))
 

回答
投稿日時: 23/06/14 16:30:02
投稿者: simple

余りしっかり検証していませんが。こんなことでしょうか。
 

Sub test()
    Dim ws    As Worksheet
    Dim s     As String
    Dim n     As String
    Dim k     As Long

    Set ws = Sheets("試算表")
    For k = 4 To 15
        n = Format(DateSerial(2023, k, 1), "m")
        s = Format(DateSerial(2023, k+1, 1), "yymmdd")
        ws.Cells(k + 3, "D").FormulaR1C1 = _
            "=IF(R1C1=" & n & ",SUMIFS(仕訳!R6C9:R25000C9,仕訳!R6C1:R25000C1" _
          & ",""<" & s & """,仕訳!R6C17:R25000C17,RC[-3]))"
    Next
End Sub

回答
投稿日時: 23/06/14 16:36:34
投稿者: WinArrow

 
最初の数式と
 
下で説明の数式の関連が分かりませんし、
何故、数式を入力するVBAを作成する理由も分かりません。
 
下の数式は、どこのセルに入力するのですか?
 
 
少なくとも、下の数式については
空いているセルをうまく使えば、
をVBAで作成しなくても対応可能エス。
 
セルA1の値で変化する箇所は、'220601のところなので、
「4」と「220501」が対応しているが、年を参照できれば、
数式をVBAで作成する必要はありません。

回答
投稿日時: 23/06/14 16:46:31
投稿者: 半平太

>A1に入っている数値は5で5月です。
>4がつから翌年3月までで <220601 これも月ごとに変わります。
 
220601 に違和感があるのですが、今年の話なら、
230601 と思うのですが、去年のデータを処理しているのですか?
 

回答
投稿日時: 23/06/14 16:57:36
投稿者: WinArrow

疑問
 
4月のときは、4月分のデータを集計するのではないでしょうか?
<220501
この指定では、3月分以前のデータも集計されてしまいませんか?

回答
投稿日時: 23/06/14 17:11:57
投稿者: simple

ああ、大幅に勘違いしているようです。
式は一つだけでいいんでしたか。
没ですな。
 
考え方で使えるところがあれば使ってください。

回答
投稿日時: 23/06/14 17:28:32
投稿者: WinArrow

簡単なはなし
 
セルA1に、1〜12を入力する
セルB1に、年を入力する(ex2022)
セルC1に、=TEXT(DATE(B1,A1+1,1),"yymmdd")*1
 
セルA2の数式
=SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<"&C1,仕訳!$Q$6:$Q$25000,A8)
 
セルC1の結果を確認して、セルB1を変更すれば、VBAで数式を作成なくても対応できると思います。
 

回答
投稿日時: 23/06/14 17:50:13
投稿者: WinArrow

追加レス
 
A1セルの判定は、対象月を求めるだけなので、
A2セルの数式の中のIF関数は必要なし。
A1の値が「1」の時には、年を変更する必要があります。
年の情報が参照できれば、B1セルも必要ないかも?

回答
投稿日時: 23/06/14 20:43:05
投稿者: WinArrow

最初の質問に戻りますが、
VBAで数式を組み立てるにしても、
説明の中に「年」情報がありませんので、
「年」情報がない限り無理です。

投稿日時: 23/06/15 01:19:27
投稿者: 破傷庵

Simpleさん WinnArrowさん 半平太さん
皆さん有難うございます。これから、お答えをいただいたものを、よく見て少しは考えて、お返事を致します。
よろしくお願いします。

投稿日時: 23/07/07 19:10:37
投稿者: 破傷庵

体調不良で申し訳ございません。
 
会員500名ほどの老人会の会計処理です。
毎月のを試算表を作成したいと考えました。
それぞれの月の試算表には前月残高が必要な事から思い立ったことです。
7月の試算表を作成するには、前記繰越残高から6月迄の残高がなければ、7月の試算表が作れないと思い、
A1に数値が入れば計算が出来る様にと思いこの式を作りました。
こんなに多くの式を作るのかと思い短く出来る方法がないかと思い質問を致しました。
時間が一杯ありますので、何時でもよろし御座いますので教えてください。
 
自動記録の方法は少しばかり解ります。
よろしくお願いいたします。
 

回答
投稿日時: 23/07/07 23:15:43
投稿者: simple

(1)
・会計年度(今であれば、2023)は、コードのなかに定数NENDOで持つ。
・A1セルには、対象とする月を、整数で入力する(4月なら、 4)。
・D8セルに入力する式は、
  =SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<230501",仕訳!$Q$6:$Q$25000,A8)
  であり、
・これをマクロでD8セルに書き込みたい、
ということでいいですか?
 
(2)
それなら、例えば、以下のように書けます。

Sub test()
    Dim ws    As Worksheet
    Dim s     As String
    Dim k     As Long

    Set ws = Sheets("試算表")
    k = ws.Range("A1")
    If k <= 3 Then k = k + 12
    s = Format(DateSerial(NENDO, k + 1, 1), "yymmdd")

    ws.Range("D8").Formula = _
            "=SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000," _
            & """<" & s & """," _
            & "仕訳!$Q$6:$Q$25000,A8)"
End Sub

(3)
こうした月に依存した数式は色々なところで出現するはずです。
WinArrowさんから 23/06/14 17:28:32に指摘があったように、
シート上の数式で対応したほうが間違いが無いし、幅広い担当者が扱えるのではないかとも思います。
(C1セルに"翌月1日"のような"名前"を定義しておけば、数式も判別しやすくなるでしょう。)
ご検討下さい。
 
 
前回の発言の訂正のつもりで、メモ書きをしました。(一応、これで区切りをつけた積りです)
参考になれば幸いです。
繰り越し残高の話は具体的に出てきませんでしたが、それは別途ですかね。

回答
投稿日時: 23/07/08 07:53:04
投稿者: WinArrow

状況に関する情報が不足しています。
 
ここに記述されているシートは「試算表」と「仕訳」です。
(1)「仕訳」シートには、年度単位の仕訳データが記録されていると解釈してよいですか?
とすれば、
➀「収入」金額が記録されている列はどこですか?
A「支出」金額が記録されている列はどこですか?
➂A列の出納日(?)は、どの様な形式で記録されているのですか?
 説明のコードにるように「yymmdd」形式なんですか?
 
(2)試算表シートは、指定月の出納明細を抽出する出納帳と解釈してよいですか?
とすれば、
➀前期末繰越残高は、何処に記録されているのですか?
A掲示のセルD8は、指定日前日までの「収入額」/「支出額」・・・どちらなんでしょう?
➂仕訳データが記録されている最終日付(抽出用日付)と、操作日は、異なることはお分かりだと思います。
 もし、操作日から抽出用日付を求めるのでしたら、「月」も指定する必要ありません。
 抽出用の日付は、"220601"のように「年」が含まれています。
 この年情報は、どのように取得するのですか?
C数式の中の「A8」セルは、何が入っているのですか?
 
※今回の数式は、可変部分はあるにしても、1つの数式です。
 わざわざ、VBAで作成する必要はあるとは思えません。
 可変部分は、「月」です。抽出用日付も、「月から計算」できます。
 1回数式を埋め込んでおけば、わざわざ、マクロを起動する必要のないですよね? 

投稿日時: 23/07/26 16:17:57
投稿者: 破傷庵

体調不良で遅くなり申し訳ございません。
帳票は試算表、各月残高、仕訳表の3点です。
試算表は
前月残高 借方コード 借方額 適用 貸方コード 貸方額 残高の7列です。
 
各月残高表は
前記繰越残高 4月集計額 5月集計額・・・・翌年3月集計額 合計額 前月残高設定の15列です。
 
仕訳表は
年 月 日 借方コード 借方金額 適用 貸方コード 貸方金額の8列です。
A1に10とあれば
10月 =IF($A$1=10,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<221101",仕訳!$Q$6:$Q$25000,A8))
 
10月の試算表を出したい時に、各月残高表の前記繰越残高から9月迄の残高を集計額を試算表の前月残高に記入
する為に最初の計算式を作りました。計算式が長いので短くする方法があればと思い質問させていただきました。
 
皆さんからの回答をしっかり理解してない事がありますので、もう一度読ませていただいて、時間がかかりますが、お返事をさせて頂きたいと思います。

回答
投稿日時: 23/07/27 08:54:55
投稿者: WinArrow

説明に矛盾があるように思います。
 

引用:

仕訳表は
年 月 日 借方コード 借方金額 適用 貸方コード 貸方金額の8列です。
A1に10とあれば
10月 =IF($A$1=10,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<221101",仕訳!$Q$6:$Q$25000,A8))

 
まず、
>仕訳表は
は、次の行の
>年 月 日 借方コード 借方金額 適用 貸方コード 貸方金額の8列です。
だけですよね?
その下の
>A1に10とあれば
>10月 =IF($A$1=10,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<221101",仕訳!$Q$6:$Q$25000,A8))
は、試算表の話ですよね?
 
よく整理してから、記述願います。
 
次に
仕訳シートは。8列(A〜H)と説明しているにも関わらず、
参数式の中では、I列、Q列を照しています。
 
また、仕訳シートのA列は、「年」の列と説明していますが、
数式の中では、「"<221101"」という条件が市営されています。
 
それから、いままでの回答の中に
検索条件の「年」の情報は、どこにあるのですか?
という質問には、全く、回答していません。
 
試算表のレイアウトの説明はしなくてよいのでしょうか?

回答
投稿日時: 23/07/27 09:33:07
投稿者: WinArrow

追加の質問
 
 
仕訳シートに記録されているデータの期間は、

回答
投稿日時: 23/07/28 07:49:33
投稿者: WinArrow

>試算表のレイアウトの説明はしなくてよいのでしょうか?
 
と質問しましたが、
レイアウトの説明されていました。
 
どのシートにも言えることですが、
項目名だけではなく、列と行も一緒に説明して頂きたいですね。
 
試算表についていえば、
試算表は、明細データ表ですよね?
そうすると、最初の「前月残高」は、最初の行だけかな?
そのあたりも説明しましょう。

回答
投稿日時: 23/07/28 17:40:43
投稿者: WinArrow

なかなか進みませんね?
  
再度質問します。
  
試算表のセルD8に入力すると思われる数式

引用:

=IF($A$1=4,SUMIFS(仕訳!$I$6:$I$25000,仕訳!$A$6:$A$25000,"<220501",仕訳!$Q$6:$Q$25000,A8))

この数式で参照しているセル
1つ目:$A$1・・・試算表のセルA1
 
2つ目:仕訳!$I$6:$I$25000・・・・仕訳シートのセルI6〜I25000
    これは、仕訳表の説明の8列のどこですか?
3つ目:仕訳!$A$6:$A$25000・・・・仕訳シートのセルA6〜A25000
    これは、仕訳表の説明の8列のどこですか?
    8列の内、最初の項目とすると、「年」という項目になります。
    しかし、条件に「<220501」と指定しているから、矛盾していますね?
  
4つ目:仕訳!$Q$6:$Q$25000・・・・仕訳シートのセルQ6〜Q25000
    これは、仕訳表の説明の8列のどこですか?
 
5つ目:A8・・・・・試算表のセルA8
   これは、なんですか?
      試算表のデザインでは、「前月残高」と思われますが・・・列情報を説明しましょう。
  
あなたが説明してくれた仕訳表のデザイン
引用:
年 月 日 借方コード 借方金額 適用 貸方コード 貸方金額の8列です。

この説明に列が書かれていないので、理解不能です。
矛盾しない説明をお願いします。
  
更に、条件で指定している「220501」の「22](年の下2桁)のデータはどこにあるのですか?
これが解決しないと、VBAでも、手入力でも、解決には進まないと思います。

投稿日時: 23/07/28 20:31:26
投稿者: 破傷庵

皆様にご回答頂いて、感謝の限りです。ありがとうございます。
商業簿記も初心者で、何をどのように説明すればいいのか、理解できていません。
ご回答いただいて、大変恐縮ですが、もう少し勉強して、出直します。
本当に申し訳ございません。
よく考えて、よく考えて。又、質問させてください。
ありがとうございました。
 
WinArrowさん、Simpleさん、半平太さん。深く感謝申し上げます。
とりわけ、WinArrowさんには親切にご回答いただいているのに、ご質問にもお答えできない事に伏して
お詫び申し上げます。