[[20100312203656]] 『マクロを体裁よく書く方法は?』(?) ページの最後に飛ぶ

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

 

『マクロを体裁よく書く方法は?』(?)
 Excel2003 WindowsXP 

 私はマクロコードをこんな長いものを書いています。短く書く方法を教えてください。
book1.xlsSheet1に次の1.の表を作成、Sheet2に2.の表を作成、Sheet3に3.の
表を作成しています。

 1.

 図番	 納入月日	 製品名	数	  単価	    金額	  分類	得意先	発注先
H1	 2009/4/6	 ABC	1        50,000	  50,000	 サンプル	  鰍`	  A社
H2	 2009/4/7	    DE	1     1,650,000  1,650,000	  本品	  鰍a	  B社
S1	2009/4/10    F-G	1       220,000	 220,000	  本品	C商店	  C社
S2	2009/4/10    Hij	1       230,000	 230,000	  本品	C商店	  C社
S3	2009/4/10	   klms	1        50,000	  50,000	 サンプル	C商店	  C社

 2.

 '09年	12月度					
		A社				
本品						
図番	  納入月日       製品名	数	   単価	   金額	
H5	2009/12/25	  abc	 1	 90,000	 90,000	
H7	2009/12/25	 B-3G	 1	120,000	120,000	
H3	2009/12/25	 DD8A	 1	100,000	100,000	       
H11	2009/12/25	HA320	 1	 75,000	 75,000	
H18	2009/12/25	10&BB	 1	100,000	100,000	
			       本品合計	485,000	
サンプル						
図番	  納入月日       製品名	数	   単価	   金額	
S22	2009/12/18	 ip13	1	 20,000	 20,000		
			    サンプル合計	 20,000	

				合計	505,000

 3.

 メーカー月別金額			
月	     A社	        B社	     C社
 6	\586,000	   \978,000	 \986,000
 7	\774,500	  \2,198,000	\2,151,000
 8     \1,227,000     \1,801,800	\4,155,000
 9	\122,000	    \1,752,900	\2,209,000
10	\634,000	    \1,245,000	\3,990,000
11	\160,000	       \98,000	\1,395,000
12	\505,000	    \1,541,000	\1,140,000
 1	      \0	            \0	        \0
 2			
 3			
 4			
 5			
計     \4,008,500	    \9,614,700	\16,026,000

 表3にまとめるため次のような長いマクロコードを作成しています。マクロは正常に
作動しますが、あまりにも長すぎます。短くまとめる方法があれば、教えてください。

 Private Sub CommandButton3_Click()
 Sheets(UserForm2.ComboBox1.Text).Select
    Range("g60").Select
    Selection.Copy
    If Range("b3").Text = "6" Then
    Sheets("まとめ").Select
      If UserForm2.ComboBox1.Text = "A社" Then
    Range("d4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     If UserForm2.ComboBox1.Text = "B社" Then
    Range("b4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     If UserForm2.ComboBox1.Text = "C社" Then
    Range("c4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     End If
     End If
     End If
     End If

    If Range("b3").Text = "7" Then
    Sheets("まとめ").Select
    If UserForm2.ComboBox1.Text = "A社" Then
    Range("d5").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     If UserForm2.ComboBox1.Text = "B社" Then
    Range("b5").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     If UserForm2.ComboBox1.Text = "C社" Then
    Range("c5").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
         End If
     End If
     End If
     End If
     End If
        Else
    If Range("b3").Text = "8" Then
    Sheets("まとめ").Select
    If UserForm2.ComboBox1.Text = "A社" Then
    Range("d6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     If UserForm2.ComboBox1.Text = "B社" Then
    Range("b6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets(UserForm2.ComboBox1.Text).Select
    Application.CutCopyMode = False
    Else
     If UserForm2.ComboBox1.Text = "C社" Then
    Range("c6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        ・
      ・
      ・

 と6から初めて5まで1年分続けています。 

 下から20行目位の
    If Range("b3").Text = "8" Then
 の上の
     End If
        Else
 はどのIfと対応していますか。
 インデントをしっかりつけてください。
 Selectionが多くて対象がどれかわかりにくいです。
    Range("g60").Select
    Selection.Copy
 は Range("g60").Copy と書けます。
 それから大まかな処理の流れを日本語で書いていただけませんか。
 また、コードを短く書くために表1、2のレイアウトの変更は可能ですか。
 (semm)

 こんな事かな。。。?

 '------
Private Sub CommandButton3_Click()
Dim 行 As Long, 列 As String
    Sheets(UserForm2.ComboBox1.Text).Select
    If Range("B3").Value <= 5 Then
        行 = Range("B3").Value + 10
    Else
        行 = Range("B3").Value - 2
    End If
    Select Case UserForm2.ComboBox1.Text
        Case "A社"
            列 = "D"
        Case "B社"
            列 = "B"
        Case "C社"
            列 = "C"
    End Select
    Sheets("まとめ").Range(列 & 行).Value = Range("G60").Value
End Sub
 '------

 まず、コピー(転記元の値のセル)は
  UserForm2.ComboBox1.Text のシートの G60 セルの値

 貼り付け先は
  シート名・・・・・・まとめ
   セル番地(行)・・・UserForm2.ComboBox1.Text のシートのB3セルの値が
              5以下の場合  B3セルの値 +10 の行
                         5より大の場合 B3セルの値 - 2 の行
  セル番地(列)・・・UserForm2.ComboBox1.Text で選んである会社が
              A社の場合 D列
              B社の場合 B列
              C社の場合 C列

 例えば、
  UserForm2.ComboBox1.Text で、A社が選ばれており
   A社のシートのB3セルの値が 12 だった場合
  A社のシートのG60セルの値を
  まとめシートの D10セルに転記

 ちなみに Select Case ・・・〜 Case ・・・〜 Csase ・・・ の部分は
 If ・・・ Then 〜 ElseIf ・・・ Then 〜 の様にもかけますし
 現在やって居られるように、Ifの中にIfを入れても良いと思います。

 (HANA)


 確かにシートの表示、マクロコードが多く流れの説明がありませんでした。

 1.シート1は A列に図番、B列に納入月日 ・・・ とし行には対応項目が発生するごとに
記入してゆきます。

 2.シート2は発注先別に月ごとのデータを、本品、サンプルに分けてまとめています。
現物はシート3にB社、シート4にC社のまとめを設定しマクロと関数で記入するようにして
います。

 3.シート3と表示しているシート名の現物は「まとめ」としています。ここには
発注先別月別各社の本品、サンプル金額の合計を記入しています。

 流れは、シート1にユーザーフォームを作成しそこにテキストボックス2個を置き、
検索開始日と検索終了日を書き込むようにし、またコンボボックスで発注先を選ぶように
しています。さらにコマンドボタンを2個おき「コマンドボタン1」でシート2、3、4に
転記し、「コマンドボタン2」でシート「まとめ」に転記するようにしています。

 この「コマンドボタン2」に登録しているマクロコードが上記コードです。毎月、月初に
前月のデータをまとめるのにこの2個のボタンをクリックするだけで短時間で処理できるので
非常に便利に利用しております。ただifを使用して1年分まとめようとしているので
非常に長いマクロコードになってしまいました。正常に作動しているのでこれでもいいのですが、
今後同様のマクロ作成のときの参考のため、ほかの簡潔なマクロコード作成方法があれば
教えてください。

 HANAさんの答えの最初に記入されているコードがこれに対応するコードですか?非常に簡単な
コードですね。(内容は非常に濃いですが。)
(?)

 HANAさん有難うございます。

 返事を書いた後、教えていただいたコードを使用中のコードに貼り付け、一部修正し(社名等)
実行したところ完璧です。私の作成したコードは何だったのだろうと、私のマクロに対する
勉強不足を痛感させられました。

 これは、Sheet1のデータを集計するものでしょうか?
 データ数がそれほど多くなく、SUMPRODUCT関数で処理できる程度の物なら
 関数で計算させればよくはないでしょうか、簡単に考えすぎでしょうか?  (Hatch)
Sub Macro1()
    With Sheets("まとめ")
        .Range("B2:D13").Formula = _
            "=SUMPRODUCT((MONTH(Sheet1!$B$2:$B$10000)=$A2)*(Sheet1!$I$2:$I$10000=C$1)*(Sheet1!$F$2:$F$10000))"
        .Range("B2:D13").Value = .Range("B2:D13").Value
    End With
End Sub


 Hatchさんご指導のマクロを実際のデータにあわせる様、一部修正して、実行してみました。
 するとシート「まとめ」の指定すべてのセルに「#NUM!」が表示されました。

 確認です。

 $B$2:$B$10000 は「納入月日」の列をさし、$I$2:$I$10000は「発注先」の列をさし、また
$F$2:$F$10000は金額の列をさしているのですね。
 それと$A2とC$1の意味を教えてください。(?)

 数式を間違っていました。以下のように修正。
 C$1→B$1です。申し訳ありません。
Sub Macro1()
    With Sheets("まとめ")
        .Range("B2:D13").Formula = _
            "=SUMPRODUCT((MONTH(Sheet1!$B$2:$B$10000)=$A2)*(Sheet1!$I$2:$I$10000=B$1)*(Sheet1!$F$2:$F$10000))"
        .Range("B2:D13").Value = .Range("B2:D13").Value
    End With
End Sub
 まとめシートの構成は以下のようになっているとの仮定です。
 B2:D13に=SUMPRODUCT((MONTH(Sheet1!$B$2:$B$10000)=$A2)*(Sheet1!$I$2:$I$10000=B$1)*(Sheet1!$F$2:$F$10000))
 と数式を入れて計算したのと同じです。
	A	B	C	D
1	月	A社	B社	C社
2	6	0	0	0
3	7	0	0	0
4	8	0	0	0
5	9	0	0	0
6	10	0	0	0
7	11	0	0	0
8	12	0	0	0
9	1	0	0	0
10	2	0	0	0
11	3	0	0	0
12	4	50,000	1,650,000	500,000
13	5	0	0	0

 元データのシート(Sheet1) は、以下の構成を仮定しています。
 	A	B	C	D	E	F	G	H	I
1	図番	納入月日	製品名	数	単価	金額	分類	得意先	発注先
2	H1	2009/4/6	ABC	1	50,000	50,000	サンプル	鰍`	A社
3	H2	2009/4/7	DE	1	1,650,000	1,650,000	本品	鰍a	B社
4	S1	2009/4/10	F-G	1	220,000	220,000	本品	C商店	C社
5	S2	2009/4/10	Hij	1	230,000	230,000	本品	C商店	C社
6	S3	2009/4/10	klms	1	50,000	50,000	サンプル	C商店	C社

 以上のようなシートでのコードです。(Hatch)

 Hatchさん再度ご指導のように変更してテストしても同様に「#NUM!」がまとめの各セルに表示され
ました。そこでサンプルと同じSheet1、まとめを作成し元データの12,1月のデータを貼り付け
このマクロで実行したところ表示月はあっていますが、集計データは違っていました。

 そこでまとめシートの各セルにこの関数を貼り付けたところ正解のデータが表示されました。

 これで各セルの関数を確認したところ=$A2の数値が行により変化し=B$1の数値が列により変化
しています。マクロで実行するには、変化する数値も定義しないといけないのではないでしょうか。

 私にはこのマクロ表現の仕方はわかりませんが。(?)


 数式をセルに書き込んで計算しているだけです。
 > そこでまとめシートの各セルにこの関数を貼り付けたところ正解のデータが表示されました。
 一応、計算式は間違っていないようですね。

 ややこしく考えるより、数式でも計算できるのですから、それを利用した方が簡易かな。。。
 と、思ったまでです。
 列見出し、行見出しは一応固定のものと思ったので、A列と1行目の値は
 あらかじめ入力されているものと仮定しています。
 また、数式のままですと、再計算で重くなるといけないので、値に書き換えています。

 あと、
 > これで各セルの関数を確認したところ=$A2の数値が行により変化し=B$1の数値が列により変化
 > しています。マクロで実行するには、変化する数値も定義しないといけないのではないでしょうか。
 どのようなことなのか私には理解できません。
 セル範囲を選択して、数式を入力後Ctrl+Enterですべての選択セルに数式を入力すると
 いったことをマクロで書いているだけですから、
 当然、列や行の位置によって$のついていない部分は変化しているはずです。

 お書きのコードはシート2の計算結果の値を見て、それを転記するように読みましたが、
 各社ごと、もしくは各月ごとにコードを動かすのは面倒そうだと思いました。
 また、元データを修正したときはどうするのだろう、再計算させるなりしないといけないので
 該当する会社や月についてコードを実行するというのもちょっと面倒そう。と思ったりしました。
 元データから関数で割と容易に計算できそうでしたので、上記のようなものは使えないのかな
 と思い書いたまでです。   (Hatch)

コメント返信:

[ 一覧(最新更新順) ]


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