• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:二つのシートで同一IDのものをまとめる方法2)

二つのシートで同一IDのものをまとめる方法2

OrangeCup150の回答

回答No.2

初歩的なことですが Dim ID1, ID2, Code, EAN, VL, PU As String ではなく、 Dim ID1 As String, ID2 As String, Code As String, EAN As String, VL As String, PU As String と書きます。 ID1, ID2, Code, EAN, VL は型指定を省略したとみなされ Variant 型になります。 次に、 Dim row1, row2, c1, c2 As Integer ではなく、 Dim row1 As Long, row2 As Long, c1 As Long, c2 As Long と書きます。 Integer 型は -32768 から 32767 の範囲しか表現できません。つまり、 32767 行までしか処理できません。 Long 型を使用して下さい。 -2147483648 から 2147483647 の範囲を表現できるのですべての行を処理できます。 要約すると VB は Pascal ではありません。 VB の言語仕様(わりとひどい。といっても古い言語で古いPC(16ビット時代)との互換性だからしかたない)を確認して下さい。(とは言っても、公式資料も何年も修正されていない間違いがあるので注意が必要なんですが・・・。まあ、マイクロソフトが .NET を押しているからしかたないですね。 「VBA なんて使わず .NET 使ってね」な感じですからね。) あと、用語が一般的でないのが気になりますが・・・。 一般的には row = 行 で、段ではあまり数えません。 Word の場合には paragraph = 段 とするのが適当ですが・・・。 本題ですが Excel DB 状態なので、データ接続(SQL)を使うのが一般的だと思います。 以下の手順の説明はExcel2007です。 まず、製品表1(Items シート)に ITEM_TABLE と名前を定義します。 手順は、製品表1の範囲を選択して(列名を含めて選択します)、数式タブの定義された名前グループの名前の定義をクリックします。新しい名前ダイアログで名前欄に「ITEM_TABLE」と入力してOKで名前を定義します。 次に、製品表2(uom シート)に UOM_TABLE と名前を定義します。 手順は同様です。 ファイルを保存します。(仮に W:\Excel DB.xlsb とします。バイナリ形式です。) データタブの外部データの取り込みグループのその他のデータソースをクリックします。データ接続ウィザードをクリックします。 「ODBC DSN」を選択し次へ、「Excel Files」を選択し次へ、このファイルを選択します。 次へ、完了。 データのインポートダイアログでプロパティをクリック 接続のプロパティダイアログで「使用」タブの「バックグラウンドで更新する」のチェックを外します。 「定義」タブの「コマンド文字列」にSQLを指定します。 製品表1(ITEM_TABLE)は ID と NAME の2つの列を持ちます。以下、テストデータ ID NAME 000128 product1 0KV502 product2 製品表2(UOM_TABLE)は ID, CODE, QTY, EAN, VL, WEIGHT, PU と PP の8つの列を持ちます。以下、テストデータ ID CODE QTY EAN VL WEIGHT PU PP 000128 UNIT 000128 U QTY 000128 U EAN 000128 U VL 000128 U WEIGHT 000128 U PU 000128 U PP 000128 BOX 000128 B QTY 000128 B EAN 000128 B VL 000128 B WEIGHT 000128 B PU 000128 B PP 000128 PALLET 000128 P QTY 000128 P EAN 000128 P VL 000128 P WEIGHT 000128 P PU 000128 P PP 0KV502 UNIT 0KV502 U QTY 0KV502 U EAN 0KV502 U VL 0KV502 U WEIGHT 0KV502 U PU 0KV502 U PP 0KV502 PALLET 0KV502 P QTY 0KV502 P EAN 0KV502 P VL 0KV502 P WEIGHT 0KV502 P PU 0KV502 P PP 上記の構成に対して下のSQL文をコマンド文字列に指定します。 SELECT i.ID AS ITEM_ID, i.NAME AS ITEM_NAME, MAX(IIF(u.CODE = 'UNIT', u.CODE, null)) As Unit_Code, MAX(IIF(u.CODE = 'UNIT', u.EAN, null)) As Unit_EAN, MAX(IIF(u.CODE = 'UNIT', u.VL, null)) As Unit_VL, MAX(IIF(u.CODE = 'UNIT', u.PU, null)) As Unit_PU, MAX(IIF(u.CODE = 'UNIT', u.QTY, null)) As Unit_QTY, MAX(IIF(u.CODE = 'UNIT', u.WEIGHT, null)) As Unit_WEIGHT, MAX(IIF(u.CODE = 'UNIT', u.PP, null)) As Unit_PP, MAX(IIF(u.CODE = 'BOX', u.CODE, null)) As Box_Code, MAX(IIF(u.CODE = 'BOX', u.EAN, null)) As Box_EAN, MAX(IIF(u.CODE = 'BOX', u.VL, null)) As Box_VL, MAX(IIF(u.CODE = 'BOX', u.PU, null)) As Box_PU, MAX(IIF(u.CODE = 'BOX', u.QTY, null)) As Box_QTY, MAX(IIF(u.CODE = 'BOX', u.WEIGHT, null)) As Box_WEIGHT, MAX(IIF(u.CODE = 'BOX', u.PP, null)) As Box_PP, MAX(IIF(u.CODE = 'PALLET', u.CODE, null)) As Pallet_Code, MAX(IIF(u.CODE = 'PALLET', u.EAN, null)) As Pallet_EAN, MAX(IIF(u.CODE = 'PALLET', u.VL, null)) As Pallet_VL, MAX(IIF(u.CODE = 'PALLET', u.PU, null)) As Pallet_PU, MAX(IIF(u.CODE = 'PALLET', u.QTY, null)) As Pallet_QTY, MAX(IIF(u.CODE = 'PALLET', u.WEIGHT, null)) As Pallet_WEIGHT, MAX(IIF(u.CODE = 'PALLET', u.PP, null)) As Pallet_PP FROM `W:\Excel DB.xlsb`.ITEM_TABLE i, `W:\Excel DB.xlsb`.UOM_TABLE u WHERE i.ID = u.ID GROUP BY i.ID, i.NAME 「このブックの接続先は~」が表示されたら「はい」をクリックします。 出力先はとりあえず新規シートにでもしておいて下さい。 備考 XML形式よりもバイナリ形式の方がパフォーマンスがいいはずです。 SQL文のファイルパスを指定(変更)する箇所が2カ所なので注意して下さい。 ここまで、解説しておいてなんですが、Excelファイル(ADO、ODBC)に対してSQL文を実行するのではなく大本のデータベースに対してSQL文を実行してExcelにデータを返すようにしてください。 まあ、セキュリティの都合でExcelファイルにダウンロードしたデータベースのデータしか操作できないなら別ですが・・・。

関連するQ&A

  • VBA (Row とRowsの違いについて)

    いつもお世話になっております。 VBA初心者ですが、RowとRowsの違いについて今一つ分かりません。 添付ファイルのように、A2:A25まで数字を入れた表を作って、今ある知識で行数をカウントするコードをいくつか書いてみました。 test1:A2から始まる表を構成するトータル行数を返す。 test2:?? test3:A2から始まる表の最終行番号を返す。 test4:test1と同じ test5:??? (1)test2、5は同じ内容のコードになると思いますが・・結果の『2』は何を意味しているのか分かりません。 (2)RowとRowsの違いは簡単に言うとどういう事でしょうか? まとまりの無い文章で申し訳ありませんが、よろしくお願いいたします。 Sub test1() Cells(2, 2).Value = Cells(2, 1).CurrentRegion.Rows.Count End Sub Sub test2() Cells(2, 3).Value = Cells(2, 1).CurrentRegion.Row End Sub Sub test3() Cells(2, 4).Value = Cells(2, 1).End(xlDown).Row End Sub Sub test4() Cells(2, 5).Value = Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Rows.Count End Sub Sub test5() Cells(2, 6).Value = Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Row End Sub

  • エクセル、マクロにて月を指定して別シートに表示はできるのでしょうか?

    エクセル、マクロにて月を指定して別シートに表示はできるのでしょうか? 毎度毎度申し訳ありません。開始日の検索で、5月と打っただけ5月分だけ表示6月とうったら6月が出て来る方法なんてあるのでしょうか?ありましたら、下記のコードをどう直せいいか教えて頂けますでしょうか?宜しくお願い致します。 【作業内容:場所と月を検索、さらに要らない列を消し、別シートに表示】【検索月はC】  A B   C     D     E     F   G   H    I   J    K 部署 No.  開始日  終了日   担当者  設備  刃名 枚数  内容 工数 備考 茨城 1 2010/5/7  2010/5/10  B緒  L型   K  16枚  研削 6.00 東和電気 東京 2 2010/6/7  2010/6/8   B緒  L型   K  16枚  研削 6.83 東和電気 茨城 3 2010/5/18  2010/5/19  B緒  L型   K  16枚  研削 1.50 東和電気 茨城 4 2010/5/16  2010/5/19  B緒  L型   K  16枚  研削 6.83 東和電気 茨城 5 2010/6/10  2010/6/10  B緒  L型   K  16枚  研削 6.83 東和電気 ↓ A  B   C     D    E     F   部署 No.  開始日  担当者  内容   工数 茨城 1 2010/5/7  B緒   研削   6.00 茨城 3 2010/5/16  B緒  掃除   6.83 茨城 4 2010/5/18  B緒  出荷   1.50 【コード】 Sub 検索() Dim R As Long Dim Row2 As Long '●Sheet2書込み行 Sheets("集計表").Range("A5").CurrentRegion.Clear Sheets("集計表").Range("A5:F5").Value = Array("依頼部署", "依頼書No.", "研磨開始日", "担当者", "作業内容", "作業内容", "工数") Row2 = 5 For R = 2 To Sheets("日報").Cells(Rows.Count, "A").End(xlUp).Row If Sheets("日報").Cells(R, "A") = Sheets("集計表").Range("A2") And _ Sheets("日報").Cells(R, "C") >= Sheets("集計表").Range("B2") And _ Sheets("日報").Cells(R, "C") <= Sheets("集計表").Range("C2") Then Row2 = Row2 + 1 Sheets("集計表").Cells(Row2, "A").Value = Sheets("日報").Cells(R, "A").Value Sheets("集計表").Cells(Row2, "B").Value = Sheets("日報").Cells(R, "B").Value Sheets("集計表").Cells(Row2, "C").Value = Sheets("日報").Cells(R, "C").Value Sheets("集計表").Cells(Row2, "D").Value = Sheets("日報").Cells(R, "E").Value Sheets("集計表").Cells(Row2, "E").Value = Sheets("日報").Cells(R, "I").Value Sheets("集計表").Cells(Row2, "F").Value = Sheets("日報").Cells(R, "J").Value End If Next R '●結果の並べ替え If Row2 = 5 Then MsgBox "該当データなし!" Else Sheets("集計表").Range("A5:D" & Row2).Sort _ Key1:=Range("B6"), Order1:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin Sheets("集計表").Select End Sub

  • excel VBA コンボボックスでシート選択後エラー

    どなたかご教授願います。 ユーザーフォームにコンボボックスを配置し、ブック内のシートすべて選択できるようにしてます。選択後シートに移動するのですが、同じユーザーフォームのテキストボックス等に入力した後、コマンドボタンをクリックするとエラーとなります。しかしテキストボックス等の値は間違いなく入力されています。よろしくお願いします。 Private Sub ComboBox1_Change() → Sheets(Me.ComboBox1.Value).Select       この部分が黄色になってしまいます End Sub Private Sub CommandButton1_Click() Dim myRow As Long ActiveSheet.Select myRow = Range("B65536").End(xlUp).Offset(1, 0).Row '各テキストボックの値をセルに入力 Cells(myRow, 2).Value = TextBox1.Value Cells(myRow, 3).Value = TextBox1.Value Cells(myRow, 4).Value = ComboBox2.Value Cells(myRow, 6).Value = TextBox2.Value Cells(myRow, 7).Value = TextBox3.Value Cells(myRow, 8).Value = TextBox4.Value 'Cells(myRow, 9).Value = TextBox5.Value '書式設定 Cells(myRow, 2).NumberFormatLocal = "m" Cells(myRow, 3).NumberFormatLocal = "dd" Cells(myRow, 6).NumberFormatLocal = "#,###" 'セルに入力が各テキストボックの値をクリア ComboBox1.Value = "" ComboBox2.Value = "" TextBox2.Value = "" TextBox3.Value = "" TextBox4.Value = "" 'フォーカス移動 ComboBox2.SetFocus End Sub

  • エクセルVBAとmsg関数

    こんばんは。 エクセルVAB初心者です。 現在、エクセル2003で以下の画像のような 表を作成しました。 上段が請求書データ(シート1)で、 下段が請求書の印刷フォーム(シート2)です。 VBAで実行する処理は、請求書データNOをそれぞれ 任意でクリックし、選択しているNOの行データをシート2にそれぞれ 転記していき、一括で印刷するものです。 以下のように、コードを作りました。 Sub 発行() Dim i As Range Dim m As Integer Dim W1 As String With Selection W1 = Cells(.Row, 1).Value & " ~ " & _ Cells(.Rows.Count + .Cells(1, 1).Row - 1, 1).Value & vbCrLf & _ " の請求書を発行しますか?" m = MsgBox(W1, vbYesNoCancel) If m <> vbYes Then Exit Sub For Each i In .Resize(, 1) With Sheets("Sheet2") .Range("b1").Value = Cells(i.Row, 1).Value .Range("e1").Value = Cells(i.Row, 2).Value .Range("c5").Value = Cells(i.Row, 3).Value .Range("b3").Value = Cells(i.Row, 4).Value .Range("c6").Value = Cells(i.Row, 5).Value .PrintOut End With Next End With End Sub ここで質問なのですが、"の請求書を発行しますか?" の後に、選択している行の数を(合計O枚)のように 表示したいのですが、どのようなコードを入れればいいのでしょうか。 また、メッセージボックスのウインドウの中の文字が 小さいので、もう少し大きくしたいのです。 以上の2点ですが、お願いします。

  • エクセルVBA教えて下さい

    エクセルの表で -AB C D E F 1年月--1801 2------ 3------ 4------ (-)は空欄でセルE1=18、F1=1とします。 コントロールボックスをつかって Private Sub Command登録_Click() d1 = Range("A65536").End(xlUp).Row d2 = Range("B65536").End(xlUp).Row Cells(d1 + 1, 1) = Range("E1").Value Cells(d2 + 1, 2) = Range("F1").Value End Sub とすると、登録コマンドを押すたびに次々セルA,Bに同じ数値が登録されるのですが、一回登録した数値を2度登録できないようにする方法はありませんか?  要は、この表だと18と1という条件では、2度登録できないようにしたいのです。よろしくお願いします。

  • エクセルVBAで最小値を求めたいのですが

    下記はある表の最大値を求めるものですが 同様の条件で最小値を求めようと思い 「MAX」の箇所を「MIN」差し替えてできると思っていたのですが 最小値がのかわりに「0」が表示されてしまいます。 そのように修正すればよいでしょうか? private sub worksheet_change(byval Target as excel.range)  if target.cells(1) = "" then exit sub  if target.address = "$A$1" then   Range("C10:C65536").ClearContents   With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C"))    .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)"    .Value = .Value   End With  elseif target.address = "$E$1" then   Range("G10:G65536").ClearContents   With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G"))    .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)"    .Value = .Value   End With  end if end sub

  • QNo.2826776の質問の続き 表から別シートに一覧表を作成したいのですが

    質問の続きになってしまうのですが sheet1からsheet2へ転記するVBA Private Sub Worksheet_Change(ByVal Target As Range) Sheets("Sheet2").Cells.ClearContents Sheets("Sheet2").Cells(1, 1).Value = "日付" Sheets("Sheet2").Cells(1, 2).Value = "応援に行く人" Sheets("Sheet2").Cells(1, 3).Value = "応援をもらう店舗" r2 = 1 For r = 2 To Range("A65536").End(xlUp).Row For c = 2 To 256 If Cells(r, c) <> "" Then r2 = r2 + 1 Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r, 1) Sheets("Sheet2").Cells(r2, 2).Value = Sheets("Sheet1").Cells(1, c) Sheets("Sheet2").Cells(r2, 3).Value = Sheets("Sheet1").Cells(r, c) End If Next c Next r End Sub と教えていただきました。 もうひとつ条件を入れたいのですが「"休"を無視する」 座標やシート名の入れ替えは理解できたのですが、やはり難しく ここを頼ってしまいました。教えてください。よろしくお願いします。

  • マクロ 一覧からシートを作成する

    いつも回答して頂き、とても感謝しています。 似た様な質問を過去にしていますが、 前回の質問は、一列にシート名が記載しており、これを参照してシートを次々と挿入するマクロの作り方でしたが、今回は、複数列にシート名が記載されている場合のマクロ記述についてです。 自分なりに考えてみましたが、set = s の値がNOTHINGになり、挿入したシートに名前を記載する事ができませんでした。原因がさっぱり分からないので御教授の程宜しくお願い致します。 Sub シートの挿入() Dim s As Worksheet Dim r As Long Dim c As Long On Error GoTo errhandle c = 2 With Worksheets("作業名一覧") For r = 2 To .Cells(Rows.Count, c).End(xlUp).Row Do While .Cells(r, c).Value <> "" Set s = Worksheets(Cells(r, c).Value) c = c + 1 Loop Next r End With Exit Sub errhandle: Worksheets.Add after:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = Cells(r, c).Value Worksheets(h.Value).Cells.ColumnWidth = 1 Worksheets(h.Value).Cells.RowHeight = 15 Resume End Sub

  • マクロの修正について

    マクロの修正について教えてください! ある文書を作成するのに必要なマクロのシートがあります。 抽出元の表を一部修正したため、現在のマクロでは正しく抽出されず、修正しています。 下記に詳細一部コピーしますが、これで抽出すると、同じデータが何度か繰り返し抽出され、重複してしまいます。 マクロの知識が全くなく、修正しているので、お力貸していただけると幸いです。 Application.ScreenUpdating = False '●●書 作成 Sheets("テンプレート").Select Sheets("テンプレート").Copy After:=Sheets(1) ActiveSheet.Name = "●●書" Sheets("まとめ").Select OutPutRow = 19 OutPutSheetCount = 1 'D列で最終行を確認 LastRow = Cells(1, 4).End(xlDown).Row For Row = 2 To LastRow datacount = Cells(Row, 27).Value For i = 1 To datacount If Cells(Row, 28 + (i - 1) * 7).Value <> "" Then '△データがあれば▲情報も出力 (1) = Cells(Row, 11).Value '代理店 (2) = Cells(Row, 26 + (i - 1) * 7).Value 'A (3) = Cells(Row, 5).Value 'B (4) = Cells(Row, 6).Value 'C (5) = Cells(Row, 25 + (i - 1) * 7).Value 'D (6) = Cells(Row, 18).Value 'E (7) = Cells(Row, 4).Value 'F (8) = Cells(Row, 10).Value 'G (9) = Cells(Row, 27 + (i - 1) * 7).Value 'H (10) = Cells(Row, 30 + (i - 1) * 7).Value 'I (11) = Cells(Row, 31 + (i - 1) * 7).Value 'J End If Sheets("●●書").Select Cells(OutPutRow, 2).Value = (11) Cells(OutPutRow + 1, 2).Value = (1) Cells(OutPutRow, 3).Value = (2) Cells(OutPutRow + 1, 3).Value = (3) Cells(OutPutRow, 4).Value = (5) Cells(OutPutRow + 1, 4).Value = (4) Cells(OutPutRow + 1, 5).Value = (6) Cells(OutPutRow, 6).Value = (7) Cells(OutPutRow + 1, 6).Value = (8) Cells(OutPutRow + 1, 7).Value = (9) Cells(OutPutRow + 1, 8).Value = (10) OutPutRow = OutPutRow + 2

  • VBAについて教えて下さい

    EXCEL2010を使用中。 独学で、Web上で色々検索したものをパクリながら VBAを組んでるようなレベルです。 今回教えて頂きたい内容ですが、 カード型の入力シート「Sheet名:入力」を作成して、 登録ボタンでデータベースシート「Sheet名:スケジュール」に 書き足していくような業務スケジュール表を作成中です。 わざわざそんな手のこんだものを 作らなくてもと思われるかもしれませんが 諸事情があっての事なので 登録ボタンのVBAは Private Sub 登録_Click() Dim row As Integer row = WorksheetFunction.CountA(Sheets("スケジュール").Columns(1)) + 1 Sheets("スケジュール").Cells(row, 1).Value = Range("Q2").Value Sheets("スケジュール").Cells(row, 2).Value = Range("G6:G7").Value Sheets("スケジュール").Cells(row, 3).Value = Range("G8:G9").Value Sheets("スケジュール").Cells(row, 4).Value = Range("G10:G11").Value Sheets("スケジュール").Cells(row, 5).Value = Range("G12:G13").Value Sheets("スケジュール").Cells(row, 6).Value = Range("G14:G15").Value Sheets("スケジュール").Cells(row, 7).Value = Range("G16:G17").Value Sheets("スケジュール").Cells(row, 8).Value = Range("G18:G19").Value Sheets("スケジュール").Cells(row, 9).Value = Range("G20:G21").Value Sheets("スケジュール").Cells(row, 10).Value = Range("G22:G23").Value Sheets("スケジュール").Cells(row, 11).Value = Range("G24:G25").Value Sheets("スケジュール").Cells(row, 12).Value = Range("M6:M7").Value Sheets("スケジュール").Cells(row, 13).Value = Range("M8:M9").Value Sheets("スケジュール").Cells(row, 14).Value = Range("M10:M11").Value Sheets("スケジュール").Cells(row, 15).Value = Range("M12:M13").Value Sheets("スケジュール").Cells(row, 16).Value = Range("M14:M15").Value Sheets("スケジュール").Cells(row, 17).Value = Range("M16:M17").Value Sheets("スケジュール").Cells(row, 18).Value = Range("M18:M19").Value Sheets("スケジュール").Cells(row, 19).Value = Range("M20:M21").Value Sheets("スケジュール").Cells(row, 20).Value = Range("M22:M23").Value Sheets("スケジュール").Cells(row, 21).Value = Range("M24:M25").Value Sheets("スケジュール").Cells(row, 22).Value = Range("S6:S7").Value Sheets("スケジュール").Cells(row, 23).Value = Range("S8:S9").Value Sheets("スケジュール").Cells(row, 24).Value = Range("S10:S11").Value Sheets("スケジュール").Cells(row, 25).Value = Range("S12:S13").Value Sheets("スケジュール").Cells(row, 26).Value = Range("S14:S15").Value Sheets("スケジュール").Cells(row, 27).Value = Range("S16:S17").Value Sheets("スケジュール").Cells(row, 28).Value = Range("S18:S19").Value Sheets("スケジュール").Cells(row, 29).Value = Range("S20:S21").Value Sheets("スケジュール").Cells(row, 30).Value = Range("S22:S23").Value Sheets("スケジュール").Cells(row, 31).Value = Range("S24:S25").Value Sheets("スケジュール").Cells(row, 32).Value = Range("S26:S27").Value Range("Q1").Select End Sub としています。 この時、移行するセル内の文字数が指定文字数を超えると、 移行した先のセルの書式設定を「折り返して全体を表示する」に 設定変更をしたいですのですが、その方法について ご教授いただけないでしょうか? 因みに現在の設定は、「縮小して全体を表示する」としています。