• 締切済み

Accessで縦と横を入れ替えたい

りんご みかん ぶどう バナナ いちご 佐藤 2   1    1   1  1 鈴木 1      1   1 田中 1   2       1 上記のようなテーブルがあるのですが、これを下記のようにしたいです。 担当者 種別 田中 りんご 鈴木 りんご 佐藤 りんご 田中 みかん 佐藤 みかん 佐藤 ぶどう 鈴木 バナナ 佐藤 バナナ 田中 いちご 鈴木 いちご 佐藤 いちご 佐藤 りんご 田中 みかん 種別の隣に数量がきてもOKです。 ご教授お願い致します。

みんなの回答

回答No.16

× DoCmd.RunSQL Replace(strRecord(I), XXXXX, strRecord(I)) 〇 DoCmd.RunSQL Replace(strSQL, ”XXXXX”, strRecord(I))

回答No.15

【続】DXSelect() DXSelect()の戻り値は添付図のようです。この戻り値をSplit関数で配列 strRecord()に格納。その後、For-Next でテーブルに挿入。 strSQL = "INSERT INTO テーブル3 (ID, 担当者, 種別, 数量) VALUES (XXXXX)" N=UBound(strRecord) For I = 0 To N   DoCmd.RunSQL Replace(strRecord(I), XXXXX, strRecord(I)) Next I DBSelect関数では敢えて数量0を除外していません。もし、仮にそういう希望であれば、最後に DoCmd.RunSQL "DELETE FROM ・・・・" の1行を。 Public Function DXSelect(ByVal strQuerySQL As String, _              Optional strPause As String = ";") As String On Error GoTo Err_DXSelect   Dim isTopField As Boolean   Dim I      As Integer   Dim J      As Integer   Dim N      As Integer   Dim rst     As ADODB.Recordset   Dim fld     As ADODB.Field   Dim strTanto  As String   Dim strList   As String   Dim strNewList As String      Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       J = 0       N = .RecordCount - 1       .MoveFirst       For I = 0 To N         isTopField = True         For Each fld In .Fields           If isTopField Then             strTanto = "'" & fld.Value & "'"             isTopField = False           Else             strList = strList & J & "," & _                  strTanto & "," & _                  "'" & fld.Name & "'" & "," & _                  fld.Value & Chr(13)           End If           J = J + 1         Next fld         .MoveNext       Next I     Else       strList = ""     End If   End With Exit_DXSelect: On Error Resume Next   rst.Close   Set rst = Nothing   DXSelect = IIf(Len(strList) > 0, Replace(strList & "[END]", Chr(13) & "[END]", ""), "")   Exit Function Err_DXSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DXSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DXSelect End Function

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.14

>数量がゼロのところを表示しないようにはできないでしょうか? (1) それでは、Nullの場合も0の場合もはじく、ということならば、   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim j As Long   Dim k As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("テーブルA")   Set rs2 = db.OpenRecordset("テーブルB", dbOpenDynaset)     For k = 1 To rs1.Fields.Count - 1       rs1.MoveFirst       Do Until rs1.EOF         If Not IsNull(rs1.Fields(k)) Then           If Not rs1.Fields(k).Value = 0 Then             rs2.AddNew             rs2!担当者 = rs1!名前             rs2!種別 = rs1.Fields(k).Name             rs2!数量 = rs1.Fields(k).Value             rs2.Update           End If         End If         rs1.MoveNext       Loop     Next k   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing (2) テーブルのデータにはNullがないので、0の場合を はじく、というのであれば、   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim j As Long   Dim k As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("テーブルA")   Set rs2 = db.OpenRecordset("テーブルB", dbOpenDynaset)     For k = 1 To rs1.Fields.Count - 1       rs1.MoveFirst       Do Until rs1.EOF           If Not rs1.Fields(k).Value = 0 Then             rs2.AddNew             rs2!担当者 = rs1!名前             rs2!種別 = rs1.Fields(k).Name             rs2!数量 = rs1.Fields(k).Value             rs2.Update           End If         rs1.MoveNext       Loop     Next k   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing 要するに、         If Not IsNull(rs1.Fields(k)) Then           If Not rs1.Fields(k).Value = 0 Then の条件式を両方入れるか一方にするかの違いです。

aaabbbccc05
質問者

お礼

できました。 いろいろとお世話になりました。ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.13

>のようにできればOKなので、(1)のほうでしょうか。 はい。(1)です。できましたか?

aaabbbccc05
質問者

お礼

コードの実行はできましたが、数量がゼロのところを表示しないようにはできないでしょうか?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.12

失礼しました。訂正です。 No11の(2)の終わりに、 Nullのデータの処理については(1)と同じです。 としていますが、処理には多少コードを 変更しなければならないので、必要ならば 提示しますが。

aaabbbccc05
質問者

お礼

何度も申し訳ありません。 元々のデータが 佐藤…りんご2、みかん1、ぶどう1、バナナ1、いちご1 鈴木…りんご1、バナナ1、いちご1 田中…りんご1、みかん2、いちご1  となっているテーブルを ID  担当者  種別  数量 1   佐藤   りんご 2 2   鈴木   りんご 1 3   田中   りんご 1 4   佐藤   みかん 1 5   田中   みかん 2 6   佐藤   ぶどう 1 7   佐藤   バナナ 1 8   鈴木   バナナ 1 9   佐藤   いちご 1 10   鈴木  いちご  1 11   田中  いちご  1 のようにできればOKなので、(1)のほうでしょうか。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.11

担当者 種別 佐藤 りんご 2 鈴木 りんご 1 田中 りんご 1 佐藤 みかん 1 田中 みかん 2 佐藤 ぶどう 1 鈴木 ぶどう 1 佐藤 バナナ 1 鈴木 バナナ 1 … といった感じにできれば。 の、.... 以下がどのようになっているのかが 問題なのですが・・・・。 質問のデータでは「鈴木」には「ぶどう」は無かったような・・・。 (1) ともあれ、以下では   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim j As Long   Dim k As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("テーブルA")   Set rs2 = db.OpenRecordset("テーブルB", dbOpenDynaset)     For k = 1 To rs1.Fields.Count - 1       rs1.MoveFirst       Do Until rs1.EOF         If Not IsNull(rs1.Fields(k)) Then           rs2.AddNew           rs2!担当者 = rs1!名前           rs2!種別 = rs1.Fields(k).Name           rs2!数量 = rs1.Fields(k).Value           rs2.Update         End If         rs1.MoveNext       Loop     Next k   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing データは、 ID  担当者  種別  数量 1   佐藤   りんご 2 2   鈴木   りんご 1 3   田中   りんご 1 4   佐藤   みかん 1 5   田中   みかん 2 6   佐藤   ぶどう 1 7   佐藤   バナナ 1 8   鈴木   バナナ 1 9   佐藤   いちご 1 10   鈴木  いちご  1 11   田中  いちご  1 のように、単純に「テーブルA」の先頭レコードから データを取り出し、「テーブルB」に格納します。 なお、「テーブルA」でデータがNullのものも表示するならば、    rs2!数量 = rs1.Fields(k).Value を、    rs2!数量 = Nz(rs1.Fields(k).Value) Nullを0とするならば、    rs2!数量 = Nz(rs1.Fields(k).Value, 0) とします。 (2) 以下では、   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim i As Long   Dim iMax As Long   Dim j As Long   Dim k As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("テーブルA")   Set rs2 = db.OpenRecordset("テーブルB", dbOpenDynaset)   iMax = 1   rs1.MoveFirst   Do Until rs1.EOF     For i = 1 To rs1.Fields.Count - 1       If Not IsNull(rs1.Fields(i)) Then         If rs1.Fields(i).Value > iMax Then           iMax = rs1.Fields(i).Value         End If       End If     Next i     rs1.MoveNext   Loop   For j = 1 To iMax     For k = 1 To rs1.Fields.Count - 1       rs1.MoveFirst       Do Until rs1.EOF         If Not IsNull(rs1.Fields(k)) Then           If rs1.Fields(k).Value >= j Then             rs2.AddNew             rs2!担当者 = rs1!名前             rs2!種別 = rs1.Fields(k).Name             rs2!数量 = rs1.Fields(k).Value             rs2.Update           End If         End If         rs1.MoveNext       Loop     Next k   Next j   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing 取り出したデータは、 ID  担当者  種別  数量 1   佐藤   りんご 2 2   鈴木   りんご 1 3   田中   りんご 1 4   佐藤   みかん 1 5   田中   みかん 2 6   佐藤   ぶどう 1 7   佐藤   バナナ 1 8   鈴木   バナナ 1 9   佐藤   いちご 1 10   鈴木  いちご 1 11   田中  いちご 1 12   佐藤  りんご 2 13   田中  みかん 2 のように、「テーブルB」に格納されます。 Nullのデータの処理については(1)と同じです。 (1)と(2)のどちらのデータの並びが必要なのかを もう少し・・・。 以上です。たぶん動くと思いますが。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.10

No9の追加ですが、 もし、数量を加えるならば、 担当者 種別 数量 田中 りんご  1 鈴木 りんご  1 佐藤 りんご  1 田中 みかん  1 佐藤 みかん  1 佐藤 ぶどう  1 鈴木 バナナ  1 佐藤 バナナ  1 田中 いちご  1 鈴木 いちご  1 佐藤 いちご  1 佐藤 りんご  1 田中 みかん  1 のようにすることですか? そのあたりがあいまいなのですが。

aaabbbccc05
質問者

お礼

曖昧な記述になり申し訳ないです。 担当者 種別 佐藤 りんご 2 鈴木 りんご 1 田中 りんご 1 佐藤 みかん 1 田中 みかん 2 佐藤 ぶどう 1 鈴木 ぶどう 1 佐藤 バナナ 1 鈴木 バナナ 1 … といった感じにできれば。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

>何故かデータがダブって出てきてしまうところがありました どのようなことですか? 質問の並べ替えのデータは 担当者 種別 田中 りんご 鈴木 りんご 佐藤 りんご 田中 みかん 佐藤 みかん 佐藤 ぶどう 鈴木 バナナ 佐藤 バナナ 田中 いちご 鈴木 いちご 佐藤 いちご 佐藤 りんご 田中 みかん のように複数のデータがだぶっているので このような結果がほしいのだろうという意図で コードを作成しています。あとは単純に 数量をくっつけただけですが。このような 結果だけならば数量を除いてください、と 補足しています。 もし、  佐藤 みかん 2  佐藤 みかん 2 ならば、  佐藤 みかん 2 だけの表示にしたいのであれば そのようにしますが、 >上記のようなテーブルがあるのですが、これを下記のようにしたいです >種別の隣に数量がきてもOKです。 のような説明があれば、普通はこのように考えるのが 妥当だと思いますが。

回答No.8

【ADOと参照設定】 http://accessvba.pc-users.net/ado/ 紹介のサイトを一読下さい。 ========================================= PS、DLookup()関数でもOK! ========================================= http://www.accessclub.jp/samplefile/help/help_166_1.htm DBLookup()は、Access が提供している DLookup() のADO版です。 (1)Select文を生で書く。 (2)DLookup()の重さを克服する。 この二つの目的で開発したものでDLookup()の三倍速で動作します。今回は、DLookup()を多用するので高速版であるDBLookup()を利用しています。そういうことですから、該当部分は当然にDLookup() でも書けます。

aaabbbccc05
質問者

お礼

ありがとうございます。 DBLookupで問題なく実行することができました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

No5です。 「数量」が必要なければ、「テーブルB」の 「数量」フィールドを除き、コードの    rs2!数量 = rs1.Fields(k).Value をコメントアウトするか、削除してください。 なお、「テーブルB」は、コードを実行すると、 ID 担当者 種別    数量 1  田中  りんご   1 2  鈴木  りんご   1 3  佐藤  りんご   2 4  田中  みかん   2 5  佐藤  みかん   1 6  佐藤  ぶどう   1 7  鈴木  バナナ   1 8  佐藤  バナナ   1 9  田中  いちご   1 10  鈴木  いちご   1 11  佐藤  いちご   1 12  佐藤  りんご   2 13  田中  みかん   2 のようにデータが格納されます。 当然ながら、数量はたとえば、まちまち であっても同じことです。 なお、コードについて若干補足しますと、 「テーブルA」は、 名前 りんご みかん  ぶどう  バナナ  いちご 佐藤  2     1      1     1     1 鈴木  1                 1     1 田中  1      2                  1 のようになっていますが、コードでは「テーブルA」のフィールドを     For i = 1 To rs1.Fields.Count - 1       If Not IsNull(rs1.Fields(i)) Then         If rs1.Fields(i).Value > iMax Then           iMax = rs1.Fields(i).Value         End If       End If     Next i のようにして追いかけていますが、フィールドのIndexは0から はじまるので、先頭の「名前」フィールドは rs1.Fields(0) です。したがってこの先頭の「名前」フィールドを除くため For i = 1 To rs1.Fields.Count - 1 のようにして1からデータを取得するようにしています。 その他、あれやこれやの説明が必要であれば、補足してください。 なお、このコードは、フィールドがいくら増えてもこのまま 使用できます。コードを変更する必要はありません。たとえば、 データのフィールドが、 りんご みかん  ぶどう  バナナ  いちご メロン すいか トマト・・・・ のようになってもこのままです。 IDフィールドは順序を確定するだけなので、順序の確保が必要なければ IDフィールドを取り除けば単に「横を縦に」というだけのテーブルが できます。ただ、その場合も基本的なコードはほとんど同じで、 無駄なループをなくすだけです。このままでも使えますが。

aaabbbccc05
質問者

お礼

ありがとうございます。 実行はできたのですが、何故かデータがダブって出てきてしまうところがありました。 なぜでしょうか。

関連するQ&A

  • EXCELピボットテーブルの集計項目を追加したい

    ピボットテーブルで集計した結果に集計項目を追加したいのですが、 可能でしょうか? 追加したい項目は、数量合計÷担当件数です。 <元データ> 担当 支店 種目 数量 川上 東京  りんご 50 川上 名古屋 りんご 20 川上 埼玉  みかん 10 川上 埼玉  りんご 5 鈴木 大阪  りんご 25 鈴木 神戸  みかん 10 佐藤 福岡  みかん 30 <ピボットテーブル>       みかん  みかん  りんご   りんご 担当 合計数量 件数 合計数量 件数 佐藤 30  1 川上 10 1 75    3 鈴木 10   1 25    1 計 50 3 100    4     上記このテーブルに「みかん合計数量÷みかん件数」「りんご合計数量÷りんご件数」で 計算した項目「みかん平均」「りんご平均」を追加して、以下のようにしたいと思っています。 担当 みかん みかん平均 りんご りんご平均 佐藤 30 30.0 川上 10 10.0        75 25.0       鈴木 10 10.0        25 25.0       総計 50 16.7        100 25.0       以上

  • エクセルでの重複データの抽出とフラグ

    エクセルでのデータの作成で困っております 下記のように「送り主」と「届け先」の重複データを抽出し数字を与えたいのですが、どうしてよいか判らず困っております。 教えて頂けますでしょうか ギフト配送先のデータ抽出 送り主     届け先  商品 田中太郎  1 佐藤花子(りんご1個) 田中太郎  1 佐藤花子(みかん1個) 田中太郎  1 佐藤花子(バナナ1本) 田中太郎  2 山本○子(みかん1個) 田中太郎  2 山本○子(バナナ1本) 山本○次  1 鈴木△子(りんご詰め合わせ) 山本○次  2 高橋×子(みかん詰め合わせ) 山本○次  3 田中□子(りんご詰め合わせ) 宜しくお願い致します

  • 1対多結合で多を絞り込み条件とするSQLについて

    sqlalchemy を使用 親テーブル id name 1 スズキ 2 タナカ 3 マイク 4 ルイ 5 ジャック 子テーブル id user_id pname number 1 1 リンゴ 2 2 1 バナナ 1 3 1 ブドウ 3 4 2 リンゴ 2 5 2 バナナ 2 6 2 ブドウ 1 7 3 イチゴ 5 8 3 バナナ 3 9 3 ブドウ 1 リンゴを持っている且バナナのnumberで並べ替えしたいので実現方法おしえていただければと思います。

  • エクセルでの質問です

    毎度お世話になっております。 エクセルで下記のような事は出来ますでしょうか? シート1に品名、数量が記載されておりますがシート2に抽出された結果のみ表示する 例)シート1    りんご 100    みかん 200    バナナ 200    りんご 200    バナナ 300    いちご 200 シート2(結果表示)     りんご 300     みかん 200     バナナ 500     いちご 200 と、それぞれの合計数量を抽出結果として表示して管理を行いたいと思ってます。 教えてください

  • 一つのテーブルの複数のフィールドから抜き出す方法について

    一つのテーブルの複数のフィールドから抜き出す方法について 例えば下記のようなテーブルがあったとします。       1     2     3     4 A商店  りんご   みかん   バナナ B商店  みかん   イチゴ   くり    パイナップル C商店  イチゴ   パイナップル バナナ D商店  イチゴ   バナナ   りんご のようなテーブルがありフィールド1~4いずれかにみかんを含むクエリーを作成し次のような結果をACCESSで作成したいのですが、簡単な方法はあるのでしょうか?       1     2     3     4 A商店  りんご   みかん   バナナ B商店  みかん   イチゴ   くり    パイナップル よろしくお願いいたします。 尚、使用しているデータベースはACCESS2000です。

  • Accessでテーブルの文字列フィールドを連結する

    次のようなフィールドが2列のデータがあります。 1:りんご 1:みかん 1:バナナ 2:みかん 2:ぶどう 3:りんご 3:バナナ それを 1:りんご、みかん、バナナ 2:みかん、ぶどう 3:りんご、バナナ とクエリーでまとめたいのですが どのようにしたらよろしいでしょうか?

  • 重複データを除外する際に条件をつけたい

    下記(A)の状態から(B)のような結果を出したくて、group by やサブクエリなどで試行錯誤しましたが、 欲しい結果が取れず困っております。 どなたかわかる方、ご教授いただけましたら助かります。よろしくお願いいたします。 (MYSQLバージョン:4.1.21) (A)  NO|入荷日付|種別|名称   3|20080730|2|りんご   4|20080801|2|りんご   5|20080728|2|りんご   8|20080801|2|りんご  10|20080812|2|りんご   7|20080811|25|ぶどう   9|20080811|25|ぶどう   1|20080731|36|みかん   2|20080728|36|みかん   6|20080808|50|いちご (B)抽出結果  NO|入荷日付|種別|名称  10|20080812|2|りんご   9|20080811|25|ぶどう   1|20080731|36|みかん   6|20080808|50|いちご ■抽出条件  ・【種別】ごとに【入荷日付】が最新のデータを1件だけ抽出。  ・ NO:7やNO:9のデータのように、【種別】と【入荷日付】が同じ場合は、【NO】が最大のデータを抽出。

    • ベストアンサー
    • MySQL
  • 行と列の条件に一致したら印を付けたい

    シート1に名前と商品のリストがあります 名前 商品 佐藤 りんご 佐藤 みかん 佐藤 ぶどう 加藤 みかん 山本 バナナ 山本 みかん 小林 りんご 小林 ぶどう 小林 みかん 小林 バナナ シート2の行に名前、列に商品名の表があり、シート1のリストを元に 行と列の条件に一致した箇所に印をつけたいのですが、 何か適当な関数はありますでしょうか? りんご みかん ぶどう バナナ 佐藤 加藤 山本 小林

  • エクセルで、スペースで区切られた言葉をわける。

    たとえば、セルのA1に、  りんご■バナナ■みかん■ぶどう■いちご (■=半角スペース) とあったときに、 B1のセルにりんご C1のセルにバナナ D1のセルにみかん E1のセルにぶどう F1のセルにいちご となるようにB1~F1に入力する関数があれば教えてください。

  • エクセルで何件もあるコードと商品の件数を調べたい

    エクセルで コード 名称 009 りんご 005 みかん 009 りんご 003 バナナ 010 イチゴ 005 みかん 003 バナナ 001 ぶどう : : というようなデータが一万件近くあって、 コード 商品  件数 001 ぶどう  ○ 002 すもも  △ 003 バナナ  □ : : というように、コード順に、それぞれの商品の件数を調べてこういった表を作りたいのですがどうしたらいいでしょうか。