• ベストアンサー

エクセル VBA

Sheet1(データベース)のA列に会社名(約30社) B列に管理番号0001~9999の番号 C列に取扱い品名(同じ会社名で複数あります) D列以降はその他の詳細(列は不規則)があります。 Sheet1をもとに会社名ごとのシートを作成し、管理番号順に並べ替えをしたいのですがうまくいきません。 どなたかお知恵をお貸し下さい。

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

Sub test() With ActiveSheet .Columns("B:B").Select .Range("A1:D" & .Range("A" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("B1"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal For Each mRange In .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row) Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = mRange.Value Rows(mRange.Row).Copy Worksheets(mRange.Value).Rows(1).PasteSpecial Next End With End Sub でいかがですか

penacW
質問者

お礼

返答ありがとうございます。 早速実行してみましが・・・ .Range("A1:D" & .Range("A" & Rows.Count).End(xlUp).Row).Sort Key1:=Range("B1"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal この部分で 実行時エラー 1004 この操作には、同じサイズの結合セルが必要です。 と、なります。 やり方は色々とあると思うのですが、 imogasiさんのおっしゃる通り、もっと悩んで、考えて、勉強してみます。 ありがとうございました。

その他の回答 (4)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

No4です 質問者さんのパターンだとこちらのほうが分かりやすいかもですね Do 中略 Loop Until ActiveSheet.Range(場所).Row = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row A列最後の行とアクティブな行が一致するまで繰り返す。

penacW
質問者

お礼

細かいところまでありがとうございました。 もう少し自分で勉強してみます。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

> この部分で > 実行時エラー 1004 > この操作には、同じサイズの結合セルが必要です。 > と、なります。 具体的な状態がわからないのでこの部分の回答はできませんが 並び替えは出来たみたいですね。 > これだと会社名の数だけ同じコードを作らないといけなくて・・・' ループを利用すればいかがですか イメージとしては以下のようになります イメージですので未検証ですから細かいところは修正してください。 Sub test() 移動 = 0 場所 = Range("A5").Offset(移動).Address 'A列の最後のデータがある行分ループする For i = 5 To ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row Range(場所).Select Do Until 値 <> Range(場所).Offset(移動).Value 移動 = 移動 + 1 Range("A5").Resize(移動, 27).Select Loop '↑最初の会社名から会社名が変わるセルを検索' Selection.Copy Sheets.Add ActiveSheet.Name = 値 Range("A5").Select Selection.PasteSpecial Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False '列幅と行数も同じにコピーしたいので↑のようなコードに・・・' '行数は取得してコピー先シートに活かすまではわかりませんでした' 元シート.Select 値 = Range("A5").Offset(移動).Value 場所 = Range("A5").Offset(移動).Address 移動 = 0 Next i End Sub

penacW
質問者

お礼

返答ありがとうございます。 試してみましたが、うまく起動しませんでした>< いまいち For Next の構文が理解できません・・・ もっと勉強して出直してきます。

回答No.3

一時的な作業ならVBA書くまでもありません。 (1)Ctrl+*で範囲を選択して管理番号順に並べ替え (2)フィルタを掛け、会社名でフィルタ。Ctrl+*で範囲を選択してコピー。 (3)新シートを挿入して貼り付け。不要な列を削除。シート名を変更。 (4)2と3を会社名毎にくりかえす。 約30社なので1時間程度で終わりそうです。 あるいは通常業務としての作業なら、上記の手順をマクロで記録して手直しすればいいでしょう。

penacW
質問者

お礼

返答ありがとうございます。 一時的な作業ではなく、会社名や取扱い品名等が頻繁に変わる為、 マクロで出来ないか考えてます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

処理ロジックはどう考えた? それも書いてなくて、考えたのかどうかもわからない。 この訓練をしないと、VBAの文法やメソッド・プロパティ・関数の勉強をしてもだめ。ロジックの勉強は、自分で考え抜いて、(他人のものや、自分の過去のものと比べよいものを学ぶ)経験をつむしかない。 うまく行かないといってコードでも作って見たのカナ。 形の上では丸投げ質問。 ーー 私が思う、一番簡単なのは 元シートを保存のためコピー(以下コピー先シートで考える) (1)会社名+管理番号でソート(ー>マクロの記録で判る) (2)上の行から順次For Nextで各行データを処理し、会社名が変わった行を捉える(直前行の会社名と(IF文で)比べるとよい)。 その前に、会社名が変わった行を記録する1つの変数を儲け、そこに記録しておく。一前だけの記録でよい。 (最初はデータ開始行の第2行目や、第3行目の2や3をセット する) (3)前の、会社名が変わった行(記録した行番号)から、「今回会社名の変わった行」ー1(直前ぎょうまで)をコピーして、別シートのA2(データの最初のセル)などを起点にに貼り付ける。 (4)前述の「会社名が変わった行を記録する1つの変数」に今回の会社名が変わった行数をセットする(置き換える)。 (5)(2)-(4)を繰り返す。 ーー 会社名が変わったとき、新しいシートを追加し、新しいシート名を設定するコードを勉強のこと。 Googleで「VBA Add.Name」で照会のこと。 ーー シートがたくさんできるが、それを特定するコードの書き方を勉強すること。

penacW
質問者

お礼

返答ありがとうございます。 imogasiさんのおっしゃる通りです>< 色々と考えた挙句コードが組めず、質問の丸投げをしてしまいました。 反省し下記のようなコードを考えてみました。 Sub 並べ替えとシート作成() Dim 元シート As Worksheet Dim 移動 As Long Dim 値 As String Set 元シート = Sheets("データベース") 移動 = 0 値 = Range("A5").Value '正確にはA4から見出しの入った表になってます' Range("A4").CurrentRegion.Select Selection.Sort Key1:=Range("A5"), Order1:=xlAscending, Key2:=Range("B5"), Order2:=xlAscending, Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin '↑ これで並べ替えは出来ました' Range("A5").Select Do Until 値 <> Range("A5").Offset(移動).Value 移動 = 移動 + 1 Range("A5").Resize(移動, 27).Select Loop '↑最初の会社名から会社名が変わるセルを検索' Selection.Copy Sheets.Add ActiveSheet.Name = 値 Range("A5").Select Selection.PasteSpecial Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False '列幅と行数も同じにコピーしたいので↑のようなコードに・・・' '行数は取得してコピー先シートに活かすまではわかりませんでした' 元シート.Select 値 = Range("A5").Offset(移動).Value 場所 = Range("A5").Offset(移動).Address 移動 = 0 Do Until 値 <> Range(場所).Offset(移動).Value 移動 = 移動 + 1 Range(場所).Resize(移動, 27).Select Loop Selection.Copy Sheets.Add ActiveSheet.Name = 値 Selection.PasteSpecial Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False 'これだと会社名の数だけ同じコードを作らないといけなくて・・・' End Sub

関連するQ&A

  • エクセルVBAでのvlookup関数の使い方

    エクセルでvlook up関数を用いたVBAを書こうと思っているのですが上手くいきません。 詳しい方がいらっしゃいましたら教えて頂けませんでしょうか。 使用しているエクセルは2010です。 いろいろ調べながら書いてみたのですが、繰り返しの処理かエラー処理が悪いようでVBAを実行することが出来ませんでした。 シート1にあるコマンドボタンを押すことで別シート(シート2、3)に入力されている値をもってくるというVBAを考えています。 Sheet1(取扱商品)にはA列に商品番号、B列に商品名、C列に管理者が入力されています。 D~H列には属性1~5というヘッダーだけがあり、コマンドボタンを押すことで、別シートから商品の属性が入ります。 Sheet1(取扱商品) 商品番号 商品名 管理者 属性1 属性2 属性3 属性4 属性5 001  桜   安部 002  薔薇  安部 002  薔薇  伊藤 004  梅   上田 007  水仙  伊藤 010  牡丹  榎本 ...(以下続く) Sheet2(データベース1) 商品番号 属性1 属性4 001  A1  A4 002      B4 004  D1     008  H1  H4 ...(以下続く) Sheet3(データベース2) 商品番号 属性2 属性3 属性5 001  A2      A5 003  C1  C3  C5 004      D3 011  K1  K3 ...(以下続く) 各シートの商品番号は1対1で対応していません。 Sheet1は商品番号が重複する場合があります。Sheet2、3は重複しません。 コマンド実行後のイメージは下記のような形です。 対応する商品番号、属性がない場合はnull入るようにしたいと思っています。 Sheet1(取扱商品) 商品番号 商品名 管理者 属性1 属性2 属性3 属性4 属性5 001  桜   安部  A1  A2      A4  A5 002  薔薇  安部              B4     002  薔薇  伊藤              B4     004  梅   上田  D1      D3         007  水仙  伊藤                     010  牡丹  榎本                     ...(以下続く) 要領が得ないところがあるかと思いますが、皆様のお知恵を拝借致したく、教えて頂ければ幸いです。 どうかよろしくお願い致します。

  • 【Excel VBA】複数範囲の並べ替えは可能でしょうか?

    【Excel VBA】複数範囲の並べ替えは可能でしょうか? Excel2003を使用しています。 CSVデータを元に作成された下記のような表があります。 A列…日付、B列…受注番号、C列…摘要(会社名・品名等)、D列…金額となっています。 6行目以下に上記の内容でデータが入力されていますが、会社ごとのデータ内で日付順に並べ替えをしたいのですが、VBAで複数の範囲を選択して、それぞれの範囲内での並べ替えは可能でしょうか?     A     B     C    D 6             ○○会社 7   1/20   123   AAA   1,000 8   1/15   120   BBB   2,000 9 10              計     3,000 11 12            ××会社 13 計の1行上と下は空欄行で、以下、会社名の後にデータが続くというパターンの繰り返しで数十社分あります。 Excelのデータ⇒並べ替えでは複数選択した状態での並べ替えはできないので、VBAで可能であればと思い、質問させていただきました。 よろしくお願いします。

  • エクセルのマクロについて教えて下さい。

    皆様よろしくお願いします。シート1に5桁の管理番号が不規則に並んでいます。およそ230個の管理番号があります。シート2には管理番号とデータが一覧表になっています。シート1の管理番号の下2行にシート2を参照する式(=sheet2!H3および=sheet2!W3)を手打ちで入れています。エクセルのマクロを使ってシート1の管理番号の下に値を入れるのではなく式を入れることはできますか。なお、シート1は横のセルが80、縦のセル150の中に管理番号が不規則に並んでいます。シート2にはB列に管理番号H・W列にデータが並んでいます。このようなファイルが80位ありますので手打ちではなくマクロで自動化を図りたいと思います。officeXPを使用しています。よろしくお願いします。

  • エクセルの関数、式教えてください。

    難しくてどうしてもわかりません。 無知で見よう見まねでやっております。 売上管理シートのE列 商品番号を入力すると その商品番号の 入出庫表シートJ列にある価格を 売上管理シートのT列に自動で入力するには どうしたらよいでしょうか??? 売上管理シートのT列に色々やってみたのですが、 できません。どうしてもわかりません((+_+)) 分かる方、教えてください!よろしくお願いいたします。 ≪売上管理シート≫  (E列)       ・・・・省略      (T列) 商品番号   品名   販売価格  仕入価格 1111111    スイカ   500円    200円 22222     メロン    1000円    600円 ≪入出庫表シート≫  (D列)     ・・・・省略     (J列) 商品コード   品名      仕入価格      1111111     スイカ      500円       5555555      メロン       300円   

  • エクセル 昇順並び替えの方法について

    質問させていただきます。今のところ受注した日をB列に 品名をC列に、注文者をD列に、E列に1回目の発送日、F列に 2回目発送予定日と3回目以降については列ごとで順に記載しています。   受注日     品名    注文者 1回目発送日 2回目発送日 A___B ________________C__________D__________E_______________F___________・・・ 1,,,,,,2005/03/01  とまと  あ さん 2005/04/01 2005/05/01 .... 2,,,,,,2005/03/02 なすび  い さん 2005/03/20 2005/04/10 ..... ・ ・ ・ といった感じです。 これを自動的にE列以降の日付の若い順に別のsheetもしくは同じ sheetの違う場所に昇順でB列に並べ替えをして、C列と D列は発送日に合致した品名と注文者、E列に受注した日としたいのですが 関数を組み合わせて別表を作成することは可能でしょうか?     発送日   品名    発注者   受注日 A___B______________C___________D___________E____________ 1,,,,,,2005/03/20 なすび   い さん  2005/03/02  2,,,,,,2005/04/01 とまと   あ さん  2005/03/01 3,,,,,,2005/04/10 なすび   い さん   2005/03/02 ・ ・ ・ 表は上記のイメージで作りたいということです。   易しく教えてくださる方がいましたら宜しくお願い 致します。

  • VBAで検索して、行をコピー&追加したい

    Excel2010で以下のことをしたいのですが、VBAがあまりできないのでやれません。 どうか助けてください。 ・sheet1のA列に検索用の番号(例として商品番号)が入力されています。 ・sheet2はデータベースで、A列に商品番号B列に商品名、C列に国名、D列に価格・・~その後J列まで情報が入っています。(行数は1万行) ・sheet1に入っている商品番号でデータベースから行をピックアップし、該当の行をsheet1のB列以降にコピーしたいのです。 (シート3を新しく作っても構いません。やりやすい方で) ・ただし、同じ商品番号で複数の行がヒットしますので、複数の行がヒットしたら行を追加しながら、行をコピーしたいです。 どのように書いたら良いか参考になるURLだけでもご教授ください。 よろしくお願いします。

  • エクセル この場合のVBAの書き方教えてください。

    顧客情報がsheet2にデータベース化されていて、そのシートのR列に管理上、属性によって顧客を分類する番号が1から8までそれぞれ入力されています。 教えていただきたいのは、シート1上でその分類の数字を入力すれば、別シート、例えばsheet3にそれに該当する顧客だけをsheet2と同じ書式で自動でコピーしてくれるマクロを作りたいのですが、詳しい方いましたらご面倒でしょうがVBAのコードをそのままコピーできるように書いていただけないでしょうか? 情報が不足でしたら補足させていただきますので宜しくお願いします。

  • エクセルの並べ替え

    エクセルデータの番号順の並べ替えをしたいのですが A列に37、54,22,1・・・などの数字が入っており これを1から順番に並べたいです。 ただ、A列1行目に37が入っていますが 次の54はA列5行目に入っています。 B列以降に他のデータ(名前、住所等)を入れる際 一行では間に合わず、それぞれ2~5行程を使用している為なのですが この状態で並べ替えをすると、数字の入っている行のみが並べ替えられ 入っていない行は後ろの方にまとめられてしまいます。 数行まとめて並べ替えをするにはどのようにすればよいでしょうか。 お詳しい方、よろしくお願い致します。

  • EXCEL VBA 複数シートを指定回数印刷

    お世話になります。 添付の様なEXCELがあります。 [管理シート]が一番左にあって、[商品番号]毎のシートが右にずらっと並んできます。 [管理シート]には「商品番号」(B4)と「商品名」(C4)と「数量」(D4)が記述されています。 商品数は可変で、増えたり減ったりします。それに伴いシートも増減します。 この商品番号は不規則にブランクがあったりしますので、この場合は読み飛ばしたいのです。 (管理シートの商品番号と商品番号シートの関係を分かり易くするため添付画像では黄色に塗りつぶしてあります) ■やりたい事 [管理シート]に「印刷」というボタンを作成します。 この「印刷」ボタンがクリックされたら、商品番号をチェックして、この商品番号と同じシートを開いてその「数量」に記述されている数字 + 1の回数分、選択されたシートを印刷したいのです。 (わかりづらくてスイマセン・・) 例)D1 ピーナッツパンならD1シートを7(6+1)回印刷したい ただし、[管理シート]の「商品番号」と「商品番号」のシートの順番は一致しないため、管理シートの商品番号を順にチェックするたびに[管理シート]以外の全シートを毎回READする必要があるかと思います。 会社でこの様な仕事を依頼されて、困っています。 どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 WindowsXP SP3 Excel2003

  • エクセルのVBAについて

    エクセルのVBAに詳しい方がいらっしゃれば、助けて頂きたい事がございます! ・Sheet1(以下S1と記載)の、1列目に、A1セルより、項目として、「ID、地区、住所、電話番号、資産名、耐用年数、取得日」が記載(=S1は項目のみ) ・Sheet2(以下S2と記載)の、1列目に、A1セルより、項目(住所、設備、資産名、区域、備考)と2列目以降にそのデータが記載 【やりたいこと】 S1の項目と完全一致するS2の項目(上記では、住所、資産名のみ)の2列目以降のデータを、S1の2列目以降に張り付ける作業を自動化するコードを書きたいのですが、上手くいかず・・・ どなたかコードを記載して頂けないでしょうか?また下記の前提を考慮したコードであると、なお助かります! 【前提】 ・「S1の項目が空欄にぶつかったら、検索を終了」という事をループに入れる(S1の項目数は変動するため) ・「S2の2列目以降の全てのデータをS1に張り付ける」という事をコードに入れる(S2の2列目以降のデータの列数も変動する且つ途中に空欄も含むため) ・S1の「地区」に、S2の「区域」を反映できるようなコードを入れる 宜しくお願いいたします_(._.)_

専門家に質問してみよう