[[20220930163153]] 『マクロ 最終行を取得した割り算と掛け算について』(初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロ 最終行を取得した割り算と掛け算について』(初心者)

マクロの初心者です。下記についてご確認頂きたいです。

A列の最終行数に応じて、E列へ売上金額が出力できるようにしたいです。
A列:商品コード B列:受注金額 C列:総数量 D列:個別数量 E列:売上金額
と各項目があり、下記の式で算出するようにしてます。
この式のマクロを宜しくお願いします。

E列.売上金額=B列.受注金額 ÷ C列.総数量 × D列.個別数量

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 マクロ 最終行 取得
 で過去ログ検索してみましたか?
(MK) 2022/09/30(金) 16:41

MKさま

見よう見まねで似たようなものを下記でやってみたのですが、
エラーとなってしまいました。
ご確認宜しくお願いします。

Dim LastRow As Long

 Dim n As Long
 LastRow = Cells(Rows.Count, "A").End(xlUp).Row
 Worksheets(1).Select
 For n = 2 To LastRow
 Range("E" & n).Formula = "="B & n & "/C" & n*D" & n
 Next n
(初心者) 2022/09/30(金) 16:53

何がどうエラーになったのか、
エラーメッセージは何のかを
書かないと誰も答えてくれないと思うよ。
(ngk) 2022/09/30(金) 17:19

 >A列の最終行数に応じて

 A列の最終行の行番号を数式に組み込むのかと
 思ったら違うみたいですね。

 変数で取得した行番号をA1形式の数式に組み込む場合は

 "A" & myrow
 ="=A" & myrow

 のようにします。

(MK) 2022/09/30(金) 17:20


ワザワザ数式をマクロで入力するくらいなら
マクロ内で計算したらいいと思いました。

sub 計算

    with worksheet(1)
        dim n as long,B列 as long,C列 as long,D列 as long,E列 as long
        for n = 2 to .cells(.rows.count,1).end(xlup).row
      B列 = .cells(r,2).value
            C列 = .cells(r,3).value
            D列 = .cells(r,4).value
            E列 = B列 / C列 * D列
            .cells(r,5).value = E列
        next n
    end with

end sub

(ngk) 2022/09/30(金) 17:32


 Range("E" & n).Value = "=B" & n & "/C" & n & "*D" & n

こんな風にしてみたり

 Sub Sample()
    Range("E2").Value = "=B2/C2*D2"
    Range("E2", Cells(Rows.Count, "A").End(xlUp).Offset(, 4)).FillDown
End Sub

こんな風にしてみたり。
(下手の横好き) 2022/09/30(金) 17:34


 Dim lstrw As Long
  lstrw = Cells(Rows.Count, "A").End(xlUp).Row
  Range("E1:E" & lstrw).FormulaR1C1 = "=RC[-3]/RC[-2]*RC[-1]"
(MK) 2022/09/30(金) 18:09

 >Range("E1:E" & lstrw).FormulaR1C1 = "=RC[-3]/RC[-2]*RC[-1]"

 2行目からでした。

Range("E2:E" & lstrw).FormulaR1C1 = "=RC[-3]/RC[-2]*RC[-1]"
(MK) 2022/09/30(金) 18:10


 2022/09/30(金) 18:09のコメントの冒頭に↓を入れるのを忘れてました。

 R1C1形式の数式を使った方法です。
(MK) 2022/09/30(金) 18:13

MK様、下手の横手様

ご返答頂き誠にありがとうございます。
どのコードも思い通りに展開致しました。
感謝申し上げます。
本当にありがとうございました。

ngk様
ご返信ありがとうございます。
下記1行目のWorksheet箇所が青くなり、コンパイルエラーが表示され「SubまたはFunctionが定義されていません」となりました。

sub 計算

    with worksheet(1)
        dim n as long,B列 as long,C列 as long,D列 as long,E列 as long
        for n = 2 to .cells(.rows.count,1).end(xlup).row
      B列 = .cells(r,2).value
            C列 = .cells(r,3).value
            D列 = .cells(r,4).value
            E列 = B列 / C列 * D列
            .cells(r,5).value = E列
        next n
    end with
end sub

(初心者) 2022/09/30(金) 19:23


>コンパイルエラー
 誤 with worksheet(1)
 正 with worksheets(1)

とりあえず↑ですかね。
なお、所々小文字になっているので、手打ちしていると思いますが、極力エディタから、そのまま貼り付けできませんか?
実際にミスしているのか、投稿時のタイプミスなのか区別しにくいです。

(もこな2) 2022/09/30(金) 19:50


失礼。「2022/09/30(金) 19:23」は、ngkさんのコードをそのまま実行したという意味でしたか。
修正点は既に述べた通りですが、変数「n」も、ループ中では「r」と打ち間違ってますから、そちらも修正が必要でしょう。

また、整理すると↓のようになるわけですが

    Sub 計算_整理()
        Dim n As Long
        With Worksheets(1)
            For n = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
                .Cells(n, "E").Value = .Cells(n, "B").Value / .Cells(n, "C").Value * D列.Cells(n, "D").Value
            Next n
        End With
    End Sub

データ数にもよりますが、1セルずつ処理するよりは、数式で一気に計算した方が速度的に有利だとおもいます。
(数式が残るのがいやなら一工夫するだけで済みます。)

    Sub さんぷる()
        Dim 最終行 As Long

        With Worksheets(1)
             最終行 = .Cells(.Rows.Count, "A").End(xlUp).Row
             If 最終行 >= 2 Then
                With .Range("E2:E" & 最終行)
                    .Formula = "=B2/C2*D2"
                    .Value = .Value
                End With
            End If
        End With
    End Sub

(もこな2) 2022/09/30(金) 20:23


もこな2様

仰る通りにsを付けr→nへ変更すると展開しました!
また新たにご提示頂きましたコードも全て思い通りでした。
色々なやり方があるんですね。本当に凄いです。
ありがとうございました。
(初心者) 2022/09/30(金) 20:31


>仰る通りにsを付けr→nへ変更すると展開しました!
>また新たにご提示頂きましたコードも全て思い通りでした。
ネットで見かけたコードや提示されたコードを鵜呑みにするんじゃなくて、【ステップ実行】するなどして、きちんと仕組みを理解されたほうが良いと思います。

※ステップ実行という言葉を聞いたことが無ければ↓を読んでみてください。

 【ステップ実行】
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html

 【ブレークポイント】
https://www.239-programing.com/excel-vba/basic/basic022.html
https://www.tipsfound.com/vba/01010

また↓も覚えておいて損はないでしょう。

 【イミディエイトウィンドウ】
https://www.239-programing.com/excel-vba/basic/basic024.html
https://excel-ubara.com/excelvba1/EXCELVBA486.html

 【ローカルウィンドウ】
https://excel-ubara.com/excelvba4/EXCEL266.html
http://excelvba.pc-users.net/fol8/8_2.html

また、お勧めするわけではありませんが、最終行が必ず2行目以降になることが担保されているなら↓のようにしてもよいとおもいます。

    Sub さんぷる2()
        With Worksheets(1).Range("E2:E" & Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row)
            .Formula = "=B2/C2*D2"
            .Value = .Value
        End With
    End Sub

(もこな2) 2022/10/01(土) 09:37


すみません。
タイプミスしました。
(ngk) 2022/10/03(月) 07:41

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.