- 締切済み
Accessで縦と横を入れ替えたい
りんご みかん ぶどう バナナ いちご 佐藤 2 1 1 1 1 鈴木 1 1 1 田中 1 2 1 上記のようなテーブルがあるのですが、これを下記のようにしたいです。 担当者 種別 田中 りんご 鈴木 りんご 佐藤 りんご 田中 みかん 佐藤 みかん 佐藤 ぶどう 鈴木 バナナ 佐藤 バナナ 田中 いちご 鈴木 いちご 佐藤 いちご 佐藤 りんご 田中 みかん 種別の隣に数量がきてもOKです。 ご教授お願い致します。
- aaabbbccc05
- お礼率37% (6/16)
- その他(プログラミング・開発)
- 回答数16
- ありがとう数13
- みんなの回答 (16)
- 専門家の回答
みんなの回答
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
× DoCmd.RunSQL Replace(strRecord(I), XXXXX, strRecord(I)) 〇 DoCmd.RunSQL Replace(strSQL, ”XXXXX”, strRecord(I))
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【続】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)
>数量がゼロのところを表示しないようにはできないでしょうか? (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 の条件式を両方入れるか一方にするかの違いです。
- piroin654
- ベストアンサー率75% (692/917)
>のようにできればOKなので、(1)のほうでしょうか。 はい。(1)です。できましたか?
お礼
コードの実行はできましたが、数量がゼロのところを表示しないようにはできないでしょうか?
- piroin654
- ベストアンサー率75% (692/917)
失礼しました。訂正です。 No11の(2)の終わりに、 Nullのデータの処理については(1)と同じです。 としていますが、処理には多少コードを 変更しなければならないので、必要ならば 提示しますが。
お礼
何度も申し訳ありません。 元々のデータが 佐藤…りんご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)
担当者 種別 佐藤 りんご 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)
No9の追加ですが、 もし、数量を加えるならば、 担当者 種別 数量 田中 りんご 1 鈴木 りんご 1 佐藤 りんご 1 田中 みかん 1 佐藤 みかん 1 佐藤 ぶどう 1 鈴木 バナナ 1 佐藤 バナナ 1 田中 いちご 1 鈴木 いちご 1 佐藤 いちご 1 佐藤 りんご 1 田中 みかん 1 のようにすることですか? そのあたりがあいまいなのですが。
お礼
曖昧な記述になり申し訳ないです。 担当者 種別 佐藤 りんご 2 鈴木 りんご 1 田中 りんご 1 佐藤 みかん 1 田中 みかん 2 佐藤 ぶどう 1 鈴木 ぶどう 1 佐藤 バナナ 1 鈴木 バナナ 1 … といった感じにできれば。
- piroin654
- ベストアンサー率75% (692/917)
>何故かデータがダブって出てきてしまうところがありました どのようなことですか? 質問の並べ替えのデータは 担当者 種別 田中 りんご 鈴木 りんご 佐藤 りんご 田中 みかん 佐藤 みかん 佐藤 ぶどう 鈴木 バナナ 佐藤 バナナ 田中 いちご 鈴木 いちご 佐藤 いちご 佐藤 りんご 田中 みかん のように複数のデータがだぶっているので このような結果がほしいのだろうという意図で コードを作成しています。あとは単純に 数量をくっつけただけですが。このような 結果だけならば数量を除いてください、と 補足しています。 もし、 佐藤 みかん 2 佐藤 みかん 2 ならば、 佐藤 みかん 2 だけの表示にしたいのであれば そのようにしますが、 >上記のようなテーブルがあるのですが、これを下記のようにしたいです >種別の隣に数量がきてもOKです。 のような説明があれば、普通はこのように考えるのが 妥当だと思いますが。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【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() でも書けます。
お礼
ありがとうございます。 DBLookupで問題なく実行することができました。
- piroin654
- ベストアンサー率75% (692/917)
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フィールドを取り除けば単に「横を縦に」というだけのテーブルが できます。ただ、その場合も基本的なコードはほとんど同じで、 無駄なループをなくすだけです。このままでも使えますが。
お礼
ありがとうございます。 実行はできたのですが、何故かデータがダブって出てきてしまうところがありました。 なぜでしょうか。
- 1
- 2
関連する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 と、それぞれの合計数量を抽出結果として表示して管理を行いたいと思ってます。 教えてください
- ベストアンサー
- Windows XP
- 一つのテーブルの複数のフィールドから抜き出す方法について
一つのテーブルの複数のフィールドから抜き出す方法について 例えば下記のようなテーブルがあったとします。 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 バナナ □ : : というように、コード順に、それぞれの商品の件数を調べてこういった表を作りたいのですがどうしたらいいでしょうか。
- 締切済み
- オフィス系ソフト
お礼
できました。 いろいろとお世話になりました。ありがとうございました。