- ベストアンサー
エクセルのマクロをスッキリさせたい
Sub 範囲指定() A下 = Range("A65536").End(xlUp).Row B下 = Range("B65536").End(xlUp).Row If A下 > B下 Then 仮下 = A下 Else 仮下 = B下 End If If 仮下 > 4 Then 下 = 仮下 Else 下 = 4 End If Range(Cells(4, 3), Cells(下, 3)).Select Range("C3").Copy.Paste End Sub もっと良い方法が有ると思うのですが、どうしたら良いでしょうか。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>>Dim AB下(2) As Long >>Dim 下 As Long >が、何の事か分かっていませんが 配列変数というものです。 VBAでは変数を必ず宣言するようにしてください。 配列なんて簡単だ――上級編(1) http://pc.nikkeibp.co.jp/article/NPC/20070803/279043/
その他の回答 (7)
- hanka2
- ベストアンサー率38% (15/39)
要するに最大を求めたいのですよね? Sub 範囲指定() A下 = Range("A65536").End(xlUp).Row B下 = Range("B65536").End(xlUp).Row 下 = 最大(最大(A下, B下), 4&) Range(Cells(4, 3), Cells(下, 3)).Select Range("C3").Copy.Paste End Sub Function 最大(引数1 As Long, 引数2 As Long) As Long 最大 = (引数1 And CLng(引数1 > 引数2)) Or (引数2 And CLng(引数1 <= 引数2)) End Function
お礼
最終的には、 Sub テスト() Dim AB下(2) As Long Dim 下 As Long AB下(1) = Range("A65536").End(xlUp).Row AB下(2) = Range("B65536").End(xlUp).Row 下 = WorksheetFunction.Max(AB下, 4) Range(Cells(3, 3), Cells(下, 3)).Formula = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" End Sub のようにしてみました。 14行が半分以下の6行になり、マクロの動きも良くなりました。 ありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
マクロの前半は Sub 範囲指定() A下 = Range("A65536").End(xlUp).Row B下 = Range("B65536").End(xlUp).Row 下 = Application.Max(A下, B下, 4) ~以下省略~ End Sub でもよさそうですね でも後半がわかりません。コピー元は「Range("C3")」と「Range(Cells(4, 3), Cells(下, 3))」のどちらでしょう? いずれにせよマクロをすっきりさせるのが目的なら、Selectメソッドを用いないで Range(Cells(4, 3), Cells(下, 3)).Copy Destination:=Range("C3") のような書き方をすればよいでしょう (ただしこの事例だとコピー元とコピー先の範囲に重複がでるので、少し変な気がしますが…)
お礼
前半はこれで更に短くなりました、ありがとうございます。 後半は誤りで、本来は Range("C3").Select ActiveCell.FormulaR1C1 = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" Range(Cells(4, 3), Cells(下, 3)).Select Range("C3").Copy ActiveSheet.Paste でしたので、前の方に頂いた回答で Range(Cells(3, 3), Cells(下, 3)).Formula = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" にしようと思います。
補足
最終的には、 Sub テスト() Dim AB下(2) As Long Dim 下 As Long AB下(1) = Range("A65536").End(xlUp).Row AB下(2) = Range("B65536").End(xlUp).Row 下 = WorksheetFunction.Max(AB下, 4) Range(Cells(3, 3), Cells(下, 3)).Formula = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" End Sub のようにしてみました。 14行が半分以下の6行になり、マクロの動きも良くなりました。 ありがとうございました。
- xls88
- ベストアンサー率56% (669/1189)
>やはりIF文を繰り返す方法しかないのでしょうか。 >関数のMAX見たいに、一発でと思っているのですが そういうことなら、下記でどうでしょうか。 Sub 範囲指定() Dim AB下(2) As Long Dim 下 As Long AB下(0) = Range("A65536").End(xlUp).Row AB下(1) = Range("B65536").End(xlUp).Row If AB下(0) > 4 Or AB下(1) > 4 Then 下 = WorksheetFunction.Max(AB下) Else 下 = 4 End If Range(Cells(3, "C"), Cells(下, "C")).Formula = Cells(3, "C").Formula End Sub
お礼
>Dim AB下(2) As Long >Dim 下 As Long が、何の事か分かっていませんが Sub テスト() Dim AB下(3) As Long AB下(0) = Range("A65536").End(xlUp).Row AB下(1) = Range("B65536").End(xlUp).Row AB下(2) = 4 下 = WorksheetFunction.Max(AB下) Range(Cells(3, 3), Cells(下, 3)).Formula = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" End Sub としたらとってもスッキリ、上手く動いてくれました。 ご教授ありがとうございます。
- xls88
- ベストアンサー率56% (669/1189)
> Range(Cells(4, 3), Cells(下, 3)).Select > Range("C3").Copy.Paste 上記のところは Range(Cells(3, 3), Cells(下, 3)).Formula = Cells(3, 3).Formula あるいは Range(Cells(3, "C"), Cells(下, "C")).Formula = Cells(3, "C").Formula
お礼
実は直前に Range("C3").Select ActiveCell.FormulaR1C1 = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" が有ったので、 Range(Cells(3, 3), Cells(下, 3)).Formula = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" としてみました。 5行が1行にまとまりすっきりた上、マクロの動きもこちらの方が良い様です。 ”Formula”知りませんでした、ありがとうございます。
- xls88
- ベストアンサー率56% (669/1189)
下記でどうでしょうか。 If A下 > 4 Or B下 > 4 Then If A下 > B下 Then 下 = A下 Else 下 = B下 End If Else 下 = 4 End If
お礼
やはりIF文を繰り返す方法しかないのでしょうか。 関数のMAX見たいに、一発でと思っているのですが、 それと Range("C3").Copy.Paste も誤りで Range("C3").Copy ActiveSheet.Paste としないと、エラーが出ます。
引数などは良く判りません。 考え方のみです。
Sub 範囲指定() A下 = Range("A65536").End(xlUp).Row B下 = Range("B65536").End(xlUp).Row If A下 > B下 Then 仮下 = A下 Else 仮下 = B下 End If XXXX() Range(Cells(4, 3), Cells(下, 3)).Select Range("C3").Copy.Paste End Sub Sub XXXX() If 仮下 > 4 Then 下 = 仮下 Else 下 = 4 End If End Sub 関数は、繰り返される手続きを一まとめにしてコードを簡略化する場合に有用・・・。 が、ただ単に、コードを見やすくするために関数化することもある・・・。 (某教科書より)
お礼
()を取ってみたのですが Range(Cells(4, 3), Cells(下, 3)).Select でエラーが出てしまいました? 回答ありがとうございました。
お礼
重ね重ねありがとうございます、あっちこち見てたのですが、 リンク先のはとても分かりやすかったです。 Dim 下 As Long も有ったほうが良いみたいですね。 教えてもらえる人がいなくて、本など読まず、ネットと直感 だけでやってきたものですから、大変勉強になりました。
補足
最終的には、 Sub テスト() Dim AB下(2) As Long Dim 下 As Long AB下(1) = Range("A65536").End(xlUp).Row AB下(2) = Range("B65536").End(xlUp).Row 下 = WorksheetFunction.Max(AB下, 4) Range(Cells(3, 3), Cells(下, 3)).Formula = "=R2C+SUM(R3C[-2]:RC[-2])-SUM(R3C[-1]:RC[-1])" End Sub のようにしてみました。 14行が半分以下の6行になり、マクロの動きも良くなりました。 ありがとうございました。