• ベストアンサー

エクセルのマクロをスッキリさせたい

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 もっと良い方法が有ると思うのですが、どうしたら良いでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.6

>>Dim AB下(2) As Long >>Dim 下 As Long >が、何の事か分かっていませんが 配列変数というものです。 VBAでは変数を必ず宣言するようにしてください。 配列なんて簡単だ――上級編(1) http://pc.nikkeibp.co.jp/article/NPC/20070803/279043/

gen_ma
質問者

お礼

重ね重ねありがとうございます、あっちこち見てたのですが、 リンク先のはとても分かりやすかったです。 Dim 下 As Long も有ったほうが良いみたいですね。 教えてもらえる人がいなくて、本など読まず、ネットと直感 だけでやってきたものですから、大変勉強になりました。

gen_ma
質問者

補足

最終的には、 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行になり、マクロの動きも良くなりました。 ありがとうございました。

その他の回答 (7)

  • hanka2
  • ベストアンサー率38% (15/39)
回答No.8

要するに最大を求めたいのですよね? 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

gen_ma
質問者

お礼

最終的には、 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)
回答No.7

マクロの前半は 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") のような書き方をすればよいでしょう (ただしこの事例だとコピー元とコピー先の範囲に重複がでるので、少し変な気がしますが…)

gen_ma
質問者

お礼

前半はこれで更に短くなりました、ありがとうございます。 後半は誤りで、本来は  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])" にしようと思います。

gen_ma
質問者

補足

最終的には、 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)
回答No.5

>やはり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

gen_ma
質問者

お礼

>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)
回答No.4

>  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

gen_ma
質問者

お礼

実は直前に  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)
回答No.3

下記でどうでしょうか。   If A下 > 4 Or B下 > 4 Then     If A下 > B下 Then       下 = A下     Else       下 = B下     End If   Else     下 = 4   End If

gen_ma
質問者

お礼

やはりIF文を繰り返す方法しかないのでしょうか。 関数のMAX見たいに、一発でと思っているのですが、 それと  Range("C3").Copy.Paste  も誤りで Range("C3").Copy ActiveSheet.Paste としないと、エラーが出ます。

noname#140971
noname#140971
回答No.2

引数などは良く判りません。 考え方のみです。

noname#140971
noname#140971
回答No.1

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 関数は、繰り返される手続きを一まとめにしてコードを簡略化する場合に有用・・・。 が、ただ単に、コードを見やすくするために関数化することもある・・・。 (某教科書より)

gen_ma
質問者

お礼

()を取ってみたのですが   Range(Cells(4, 3), Cells(下, 3)).Select でエラーが出てしまいました? 回答ありがとうございました。

関連するQ&A