「夫を成功」へ導く妻の秘訣 座談会

お世話になります。アクセスの超初心者です。

数値型であれば同じ列の合計できますが、テキスト型で以下のように
連結できる方法がございませんでしょうか?

<元テーブル>
レコード番号  列:キーワード(テキスト型)  列:抽出条件
  1      "山,川"                AAA
  2      "海外,国内"             AAA
  3      "熊,馬"                BBB

  ↓このテーブルを元にクエリをかける

<クエリ出力結果> 列:抽出条件にAAAを指定

  列:キーワードの合計(連結)
  "山,川、海外,国内"
      ^^
     ↑連結の境目には"、"などの区切りを入れたい。

宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

クエリに DBSelect関数を組み込む場合は、次のように書きます。



・SELECT文で使う。
・TOP 1 を使う。

がミソです。

SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'","、") AS 式1
FROM テーブル2;

<クエリ3>
山,川、海外,国内、

という実行結果を得ます。

さて、この場合、区切り子が最後にも付いています。
これが、邪魔であれば DBSelect 関数を修正します。

修正後の実行結果です。

[イミディエイト]
? DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'", "、")
山,川、海外,国内
? DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'")
山,川;海外,国内

念のために DBSelect 関数を再度示して置きます。

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
  Dim I   As Integer
  Dim J   As Integer
  Dim R   As Integer
  Dim C   As Integer
  Dim M   As Integer
  Dim N   As Integer
  Dim rst  As ADODB.Recordset
  Dim fld  As ADODB.Field
  Dim Datas As String
  
  Set rst = New ADODB.Recordset
  ' =================
  ' Begin With: rst
  ' -----------------
  With rst
     .Open strQuerySQL, _
        CurrentProject.Connection, _
        adOpenStatic, _
        adLockReadOnly
     If Not .BOF Then
      M = .RecordCount - 1
      N = .Fields.Count - 1
      .MoveFirst
      For R = 0 To M
        For C = 0 To N
          Datas = Datas & .Fields(C) & strSeparator
        Next C
        .MoveNext
      Next R
     End If
  End With
  ' ---------------
  ' End With: rst
  ' ===============
Exit_DBSelect:
On Error Resume Next
  DBSelect = Left(Datas, Len(Datas) - 1) & ""
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function
    • good
    • 0
この回答へのお礼

すごい!!
できましたーーー!
ありがとうございます!!

欲張りついでにもう一点、お伺いしたいのですが。
こちらはお時間ある時に可能であればご教示ください。

抽出条件を、特定のフォームのテキストボックスに入力した文字を参照させるように変更可能でしょうか?

だめもとで以下のように指定してみましたが、やっぱりできませんでした。。。根本的にSQLを勉強しないとだめですね・・・

SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='[Forms]![抽出条件]![テキストボックス]'","、") AS 式1
FROM テーブル2;

お礼日時:2007/05/24 10:10

SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='" & Forms!抽出条件!条件文 & "'","、") AS 式1


FROM テーブル2;

ビルドを利用してフォームを参照するようにした場合に生成されたSQL文です。
結果は、同じです。

<バグのお知らせ>

Exit_DBSelect:
DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0))
Exit Function

Exit_DBSelect:ブロックで Left関数のエラー対策にバグがありました。

上述の訂正で、 Forms!抽出条件!条件文="AAC" でもエラーが出なくなります。
    • good
    • 0
この回答へのお礼

VBAができるとできることが広がりますね。
最後までお付き合いいただきありがとうございました。
ほんとうに助かりました!!

お礼日時:2007/05/24 13:34

最大でも4まで用意しておけばいいというぐらいなら


クロス集計クエリの列見出しプロパティーに1~4をセットしておけばいいですね
レコードの有無にかかわらず何時も4までのフィールドができます

連結式は

[1] & IIf(IsNull([2]),"","、" & [2]) & IIf(IsNull([3]),"","、" & [3]) & IIf(IsNull([4]),"","、" & [4])
    • good
    • 1
この回答へのお礼

とても参考になりました!
迅速なご回答で助かりました!

ありがとうございました!!

お礼日時:2007/05/24 13:37

失礼、後段が欠落していたようです。



Exit_DBSelect:
  DBSelect = Datas & ""
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。

教えていただきました構文をモジュールに貼り付け
クエリで関数から指定してみました。

式1: DBSelect("SELECT キーワード FROM テーブル1 WHERE 抽出条件='AAA'","、")

実行結果は、エラーはでないのですが、全て空欄でした。

根本的に使い方を間違えているのでしょうか?
もう少しご教示いただけると幸いです。
宜しくお願い致します。

お礼日時:2007/05/23 16:31

<テーブル2>



ID___キーワード___抽出条件
1____山,川___________AAA
2____海外,国内_____AAA
3____熊,馬___________BBB

[イミディエイト]
? DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'", "、")
山,川、海外,国内、

このような結果を得たいということでしょうか?
No2さんのアドバイスに従って関数を作成してみました。
これを提示することが妥当かどうかは疑問の残るところです。
が、知らなければ、なかなかでしょう。
これを機会にさらに自分で勉強されるという前提で上述の DBSelect関数を紹介しておきます。

Public Function DBSelect(ByVal strQuerySQL As String, _
             ByVal strSeparator As String) As String
On Error GoTo Err_DBSelect
  Dim I   As Integer
  Dim J   As Integer
  Dim R   As Integer
  Dim C   As Integer
  Dim M   As Integer
  Dim N   As Integer
  Dim rst  As ADODB.Recordset
  Dim fld  As ADODB.Field
  Dim Datas As String
  
  Set rst = New ADODB.Recordset
  ' =================
  ' Begin With: rst
  ' -----------------
  With rst
     .Open strQuerySQL, _
        CurrentProject.Connection, _
        adOpenStatic, _
        adLockReadOnly
     If Not .BOF Then
      ' --------------
      ' 配列を再宣言
      ' --------------
      M = .RecordCount - 1
      N = .Fields.Count - 1
      ' ------------------------------------
      ' 列情報を For-Next で配列に代入する
      ' ------------------------------------
      .MoveFirst
      For R = 0 To M
        For C = 0 To N
          Datas = Datas & .Fields(C) & strSeparator
        Next C
        .MoveNext
      Next R
     End If
  End With
  ' ---------------
  ' End With: rst
  ' ===============
Exit_DBSelect:
On Error Resume Next
    • good
    • 0

レコード番号というフィールドがあるのですね


抽出条件(変なフィールド名ですね)ごとにレコード番号の順に連番を振るクエリを作ります

連番:DCount("*","元テーブル","レコード番号<=" & [レコード番号] & " and 抽出条件='" & [抽出条件] & "'")

このクエリをクロス集計クエリに変え、
抽出条件:行見出し
連番:列見出し
キーワード:値:先頭

これで
抽出条件 1   2
--------------------------
AAA  "山,川" "海外,国内" 
BBB  "熊,馬"  
のような結果が得られます
ひとつのフィールドにしたければこれからもう一段クエリを組んでください
              
    • good
    • 0
この回答へのお礼

ご親切にありがとうございます。
やってみてできました!クロス集計は苦手で今まであまり手を出さなかったので、こうやって使うのかぁーと感嘆してます。。

大変恐縮ですがもう少しご教示いただけますでしょうか。

>ひとつのフィールドにしたければこれからもう一段クエリを組んでください

同じデータを読み込む際はクエリに以下の式を入れてできました。
結合: [1] & "、" & [2] & "、" & [3]

処理を自動化したいと思います。
毎回、読み込むデータ量が異なる場合に"もう一段"のクエリで
指定する式に困りました。
クロス集計クエリの結果で、抽出条件の横軸が増えたり減ったりしますよね?
抽出条件 1   2
--------------------------
AAA  "山,川" "海外,国内" 
BBB  "熊,馬" 

  ↓

抽出条件 1   2      3    4 ←増えた
----------------------------------------------------
AAA  "山,川" "海外,国内" "町,都市" "鳥,魚"
BBB  "熊,馬" 

このような場合はどうやってクエリに結合する式を書けばいいのか困りました。

宜しくお願い致します。

お礼日時:2007/05/23 17:18

adoなどでレコードを開き、


対象データのレコードセットを作り、
ループを作ってデータを読み、
結果のストリングを作る。

VBA中級位の知識が必要です。
    • good
    • 0

こんにちは。



文字列の連結は"&"や"+"で可能です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qアクセスで複数のレコード情報を1レコードにまとめる方法 

アクセスにおいて
例えば以下のような1~6までのレコードを

1.Aさん,犬
2.Aさん,猫
3.Bさん,犬
4.Bさん,鳥
5.Bさん,豚
6.cさん,牛



1.A,犬,猫
2.B,犬,鳥,豚
3.C,牛

このように、この場合だったら、~さんを軸に、
ひとつのレコードとしてまとめることは可能でしょうか。

仕事で使いたいのですが、やり方がわからず非常に困っています。
お手数ですがご教示いただけると幸いです。

よろしくお願いいたします。

Aベストアンサー

通常のクエリーだけでは無理です

このテーブルをTBL(名前,ペット)とすると

モジュールに
Public Function PetNameAdd(pName) As String
Dim iRS As Recordset
Dim strSQL As String
Dim strRet As String

strRet = ""
strSQL = "SELECT ペット FROM TBL WHERE 名前 = '" & pName & "'"
Set iRS = CurrentDb.OpenRecordset(strSQL)

While iRS.EOF = False
If strRet = "" Then
strRet = iRS(0)
Else
strRet = strRet & "," & iRS(0)
End If
iRS.MoveNext
Wend

iRS.Close
Set iRS = Nothing
PetNameAdd = strRet
End Function

を登録しておいてクエリーで
SELECT 名前, PetNameAdd(名前) AS 全ペット
FROM (SELECT DISTINCT 名前 FROM TBL)

と書けば近いものは出来ます
しかしながらクエリーは頻繁に関数を呼び出すのであまりお勧めは出来ません

一度、全ペット用のテーブルをこの関数を利用して作り、後の操作をする方がマシンに対する負荷は少ないです

通常のクエリーだけでは無理です

このテーブルをTBL(名前,ペット)とすると

モジュールに
Public Function PetNameAdd(pName) As String
Dim iRS As Recordset
Dim strSQL As String
Dim strRet As String

strRet = ""
strSQL = "SELECT ペット FROM TBL WHERE 名前 = '" & pName & "'"
Set iRS = CurrentDb.OpenRecordset(strSQL)

While iRS.EOF = False
If strRet = "" Then
strRet = iRS(0)
Else
strRet = strRet & "...続きを読む

Q複数のレコードを1つのレコードにまとめる方法

いつもお世話になりますm(__)m

Access2003で、以下のテーブルがあるとします。

例)tableA

項目1|項目2
---------
部署1|あいうえお
部署2|かきくけこ
部署1|さしすせそ
部署1|たちつてと
部署2|なにぬねの

上記のテーブルの項目1が同じものを、別テーブルの1つのフィールドにスペースでまとめたいと思っています。

例)結果テーブル

項目1|項目3
---------
部署1|あいうえお さしすせそ たちつてと
部署2|かきくけこ なにぬねの


可能であればクエリで処理したいのですが、無理でしたらVBA他でも結構です。

お詳しい方、ご教授のほど宜しくお願い致しますm(__)m

Aベストアンサー

見るだけなら、
TRANSFORM First(項目2) AS 値
SELECT 項目1 FROM
(SELECT tableA.項目1, tableA.項目2, Count(*) AS Temp番号
FROM tableA INNER JOIN tableA AS TT ON (tableA.項目2 >= TT.項目2) AND (tableA.項目1 = TT.項目1)
GROUP BY tableA.項目1, tableA.項目2) AS WW
GROUP BY 項目1 PIVOT "項目2" & "-" Temp番号;


このクエリからデータを抜き取ってもいいのですが、
方法はそれこそいろいろですが。ベタにレコードセットから。
NoMatchプロパティを利用してもいいのですが、
思いっきりループの入れ子で。

(1)
以下を標準モジュールに貼り付けます。
DAOを使っているので、コード表のツールから
参照設定を選択して、
Microsoft DAO xx Object Library
にチェックを入れて、OKとします。xxは3.6のような数字です。
このとき、
Microsoft ActiveX Data Objects xx Library
にチェックが入っていたらはずしてください。

Sub test()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
Dim strSQL As String
Dim myStr1 As String
Dim myStr2 As String

strSQL = "SELECT tableA.項目1 FROM tableA GROUP BY tableA.項目1;"
Set db = CurrentDb
Set rs1 = db.OpenRecordset("tableA")
Set rs2 = db.OpenRecordset("結果テーブル", dbOpenDynaset)
Set rs3 = db.OpenRecordset(strSQL)

If rs3.RecordCount > 0 Then
rs3.MoveFirst
Do Until rs3.EOF
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
If rs3!項目1 = rs1!項目1 Then
myStr1 = rs1!項目1
myStr2 = myStr2 & " " & rs1!項目2
End If
rs1.MoveNext
Loop
rs3.MoveNext
End If
rs2.AddNew
rs2!項目1 = myStr1
rs2!項目2 = myStr2
rs2.Update
myStr1 = ""
myStr2 = ""
Loop

End If
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
rs3.Close: Set rs3 = Nothing
db.Close: Set db = Nothing
End Sub

(2)
フォームにコマンドボタンを設定し、そのクリックイベントで

Private Sub コマンド0_Click()
Call test
End Sub

以上です。

見るだけなら、
TRANSFORM First(項目2) AS 値
SELECT 項目1 FROM
(SELECT tableA.項目1, tableA.項目2, Count(*) AS Temp番号
FROM tableA INNER JOIN tableA AS TT ON (tableA.項目2 >= TT.項目2) AND (tableA.項目1 = TT.項目1)
GROUP BY tableA.項目1, tableA.項目2) AS WW
GROUP BY 項目1 PIVOT "項目2" & "-" Temp番号;


このクエリからデータを抜き取ってもいいのですが、
方法はそれこそいろいろですが。ベタにレコードセットから。
NoMatchプロパティを利用してもいいのですが、
思いっきりループの入れ...続きを読む

QAccessのフィールド結合について

Accessのフィールド結合について

Access2002を使用していますが、
「姓」と「名」というフィールドがあります。
クエリにて、「姓」と「名」を結合することは出来ますか?
「姓」と「名」の間にスペースも1つ入れたいです。

例えば下記のような場合
「姓」:田中
「名」:一郎

↓↓↓↓↓↓↓

仮に「名前」という演算フィールドを作ったとして、
「名前」:田中 一郎

といったようにするにはどうすればよろしいでしょうか?

Aベストアンサー

クエリのデザインビューで、左端に『フィールド』と表示された欄があると思いますが、
そこに式を指定すればOkです。

具体的には、

「名前: [テーブル名].[姓] & " " & [テーブル名].[名]」
(1つのテーブルのみなら、「名前: [姓] & " " & [名]」でもOk)

といった形になります。
(先頭の「名前:」で指定した「:」の左側が、フィールド名になります)

※Excelと違い、「&」の前後には半角スペースが必須です。念のため。
※間に入れるスペースには、Space関数も使用可能です。
 (「名前: [姓] & Space(1) & [名]」)

QAccess:クエリーにて集計後に文字列結合したい。

Accessのクエリーでレコードのグループ化を行っている状態で、あるフィールドに対してだけ文字列の結合を行いたいのですが、集計部分をどのように指定すればよいかわからず困っています。

イメージとしては、SQLビューにて、グループ化されたレコードの合計が、
 SUM([テーブル名].[フィールド名])
で求められる様に、
エクセルの文字列結合関数
 CONCATENATE([テーブル名].[フィールド名])
が使いたい、という感じです、、

Accessにおける文字列結合は"&"を使うとありましたが、この場合どのように記述するべきでしょうか?

Aベストアンサー

Excelでの「同一行の各列のテキストデータを連結」と同様の操作であれば、No.1の方が答えられている方法でできます。

例)
ID GrNo テキスト1 テキスト2 テキスト3
1  1 テスト1   テスト2  テスト3
2  1 テスト4   テスト5  テスト6

→GrNoでグループ化して集計を掛ける際、
 「[テキスト1] & [テキスト2] & [テキスト3]」の式をフィールドとして指定すれば
  ID=1では「テスト1テスト2テスト3」が返される。


ただ、もし「同一列の各行のテキストデータを連結」を想定されているのだとすると、これはAccessに備え付けの関数では対処できません。
・・・もしかしたら私が知らないだけかもしれませんが(汗)

例)
ID GrNo テキスト
1  1   テスト1
2  1   テスト2
3  1   テスト3
4  2   テスト4
5  2   テスト5

→GrNoでグループ化して集計をかけた場合に、
  GrNo=1で「テスト1テスト2テスト3」を返す式は用意されていない。
  (あるのは「First(先頭)」などの1レコードのデータを参照する式か、
   「SUM」などの数値の演算結果を表示させる式のみ)


なので、どうしても下側の例のようなデータを作成したいということでしたら、
一旦フォームなどで同GrNoのレコードを表示させた上で、そのフォームを
順次レコード移動しながら「テキスト」フィールドを連結させ、
それをGrNoとセットにして別のテーブルに保存、
といった回りくどいことをするぐらいしか、今のところ思いつきません。

Excelでの「同一行の各列のテキストデータを連結」と同様の操作であれば、No.1の方が答えられている方法でできます。

例)
ID GrNo テキスト1 テキスト2 テキスト3
1  1 テスト1   テスト2  テスト3
2  1 テスト4   テスト5  テスト6

→GrNoでグループ化して集計を掛ける際、
 「[テキスト1] & [テキスト2] & [テキスト3]」の式をフィールドとして指定すれば
  ID=1では「テスト1テスト2テスト3」が返される。


ただ、もし「同一列の各行のテキストデータを連結」を想定されて...続きを読む

QACCESSでひとつのフィールドに内容をまとめる

Accessのテーブルで以下のようなデータがあります。
【年月】   【内容】
2013年11月 A
2013年11月 BC
2013年11月 D
2013年11月 EFGH
2013年12月 I
2013年12月 J
2013年12月 KL
2013年12月 MNO
2013年12月 PQRST

上記を、クエリで
【年月】   【内容】
2013年11月 A BC D EFGH
2013年12月 I J KL MNO PQRS
と、年月ごとに、内容をひとつのフィールドにまとめて表示させたいです。

集計でもカウントでもないのに、
クエリでこのようなことは可能でしょうか?

最終的にこのクエリを、エクセルにエクスポートしようと考えているので
最悪、エクセルで数式を組んでこのような形に仕上がるんでもいいです。

ただ、何度も行う作業になりますので
なるべく簡単な操作でこのような表が完成できるようにしたいです。

よろしくお願いいたします!

Aベストアンサー

1、クエリにOrder BY 句の追加必要。
2、DBSelect関数のSQL文のOrder BY 句の見直し必要。

先の回答はあくまでもテストのそれ。
2つの見直しは必須かと思います。

【DBSelect関数】

(1)標準モジュールに追加してください。
(2)参照設定を追加してください。

*標準モジュールも配布に含まれるので配布可能ですよ。

Public Function DBSelect(ByVal strQuerySQL As String) As String
On Error GoTo Err_DBSelect
  Dim I As Integer
  Dim J As Integer
  Dim R As Integer
  Dim C As Integer
  Dim M As Integer
  Dim N As Integer
  Dim rst As ADODB.Recordset
  Dim fld As ADODB.Field
  Dim strList As String

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
      CurrentProject.Connection, _
      adOpenStatic, _
      adLockReadOnly
    If Not .BOF Then
      ' --------------
      ' 配列を再宣言
      ' --------------
      M = .RecordCount - 1
      N = .Fields.Count - 1
      If M > 99 Then
        MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", _
          vbInformation, _
          " お知らせ"
        M = 99
      End If
      ReDim DataValues(M, N)
      ' ------------------------------------
      ' 列情報を For-Next で配列に代入する
      ' ------------------------------------
      .MoveFirst
      For R = 0 To M
        C = -1
        For Each fld In .Fields
          With fld
            C = C + 1
            ' --------------------------
            ' 列データを表示形式に変換
            ' --------------------------
            Select Case .Type
              Case adBoolean ' ブール型
                DataValues(R, C) = IIf(.Value = -1, "Yes", "No")
              Case adChar, adVarChar ' 文字列型
                DataValues(R, C) = Nz(.Value, "")
              Case adDBDate, adDBTimeStamp ' 日付型、日付/時刻型
                DataValues(R, C) = .Value
              Case adSmallInt, adInteger ' 整数
                DataValues(R, C) = FormatNumber(.Value, 0)
              Case adSingle, adDouble ' 浮動小数点型
                DataValues(R, C) = FormatNumber(.Value, 2)
              Case adCurrency ' 通貨型
                DataValues(R, C) = FormatCurrency(.Value, 2)
              Case Else
                DataValues(R, C) = .Value
            End Select
          End With
        Next fld
        .MoveNext
      Next R
    Else
      ReDim DataValues(0, 0)
      DataValues(0, 0) = ""
      strList = ""
    End If
  End With
  ' -------------------------------
  ' セミコロン(;)で連結して1文に
  ' -------------------------------
  For I = 0 To M
    For J = 0 To N
      strList = strList & DataValues(I, J) & ";"
    Next J
  Next I
Exit_DBSelect:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBSelect = strList
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
     "・Err.Description=" & Err.Description & Chr$(13) & _
     "・SQL Text=" & strQuerySQL, _
     vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function

1、クエリにOrder BY 句の追加必要。
2、DBSelect関数のSQL文のOrder BY 句の見直し必要。

先の回答はあくまでもテストのそれ。
2つの見直しは必須かと思います。

【DBSelect関数】

(1)標準モジュールに追加してください。
(2)参照設定を追加してください。

*標準モジュールも配布に含まれるので配布可能ですよ。

Public Function DBSelect(ByVal strQuerySQL As String) As String
On Error GoTo Err_DBSelect
  Dim I As Integer
  Dim J As Integer
  Dim R As I...続きを読む

QAccessでグループ化した結果フィールドをつなげるには?

Accessでグループ化した結果フィールドをつなげるには?

Access2003で

区分/コード
A/123
A/456
A/789
B/234
B/567

というテーブルがあり、グループ化すると、区分Aのコードは123、456、789、
区分Bのコードは234、567と表示や印刷することはできます。
(たとえば、フォームやレポートのサブフォームなどに各コードを表示することはできます)

これを、
フィールド1/フィールド2
A/123456789
B/234567
というふうにコード部分を1つのフィールドにつなげることは可能でしょうか?

上記のように、区分Aのデータ件数は3件、区分Bは2件というように
コードのデータ件数はまちまちですが、それに対応してつなげたいと考えております。


よろしくお願いいたします。

Aベストアンサー

例えば、3項目あれば、クロス集計クエリを使って
A 123 1
A 456 2
A 789 3
B 234 1
B 567 2
となっているものを
0 1  2  3
A 123 456 789
B 234 567
にできます。
「0」「1」「2」「3」のフィールドが出来上がる。
出現数のカウントもできます。
工夫してこれが使えればこれが一番楽かと思います。

Q[Access]異なるレコード間の文字列連結

いつもお世話になっております。
早速ですがAccess(初心者です)での質問です。

以下のようなテーブルがあります。

ID|番号(1)|番号(2)|実績
1 |113355 |AA| 152
2 |112211 |VV| 27
3 |112222 |VV| 90
4 |113355 |CX| 8
5 |112222 |SD| 110
………………・・・(以下略)

番号(1)が同じなら、番号(2)を"/"で区切り、連結して
別のテーブルを作成しようとしています。

ID|番号(1)|番号(2)
1 |113355 |AA/CX
2 |112211 |VV
3 |112222 |VV/SD
………………・・・
が、なかなか良い方法が思いつきません。
皆様のお力を貸してください。どうぞ宜しくお願いいたします。

Aベストアンサー

VBAを使って、レコードを1件ずつ読み込んで書き込むというやり方が良いんじゃないかと思います。

考え方としては、

元のテーブルで番号(1)を基準に並べ替えをする
元のテーブルの最初のレコードから順に番号(1)の値を比較しながら番号(2)を書き込んでいくようにする

手作業でやるとしたら、

元のテーブルをそのままコピーする
番号(1)で並べ替えをする
レコードを見ながら番号(2)を書き換える
番号(2)が書き終わったら番号(1)のダブっているレコードを削除する

QACCESS 一つのフィールドに複数レコードの値をセットしたい

どなたか教えて下さい。

Aテーブルに、(1)コード (2)No というフィールドがあります。
例)
(1)   (2)
1111  1
1112  2
1113  3
1111  4
この内容を、別テーブルに、
(1)コード (2)
1111   1,4
1112 2
1113 3
と、同一コードであれば、(2)フィールドにカンマ付きで全て
表示したいのです。

どなたか、お知恵をお貸し下さい。
よろしくおねがいいたします。

Aベストアンサー

データベース関数などと命名した標準モジュールに以下の関数をコピペして保存して下さい。
次に、イミディエイトウインドウでテストして頂ければ幸いです。

[イミディエイト]
? DBSelect("SELECT F2 FROM A WHERE F1=1111")
1;4
? DBSelect("SELECT F2 FROM A WHERE F1=1111", " And ")
1 And 4 And

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
  Dim I   As Integer
  Dim J   As Integer
  Dim R   As Integer
  Dim C   As Integer
  Dim M   As Integer
  Dim N   As Integer
  Dim rst  As ADODB.Recordset
  Dim fld  As ADODB.Field
  Dim Datas As String
  
  Set rst = New ADODB.Recordset
  ' =================
  ' Begin With: rst
  ' -----------------
  With rst
     .Open strQuerySQL, _
        CurrentProject.Connection, _
        adOpenStatic, _
        adLockReadOnly
     If Not .BOF Then
      M = .RecordCount - 1
      N = .Fields.Count - 1
      .MoveFirst
      For R = 0 To M
        For C = 0 To N
          Datas = Datas & .Fields(C) & strSeparator
        Next C
        .MoveNext
      Next R
     End If
  End With
  ' ---------------
  ' End With: rst
  ' ===============
Exit_DBSelect:
  DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0))
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function

データベース関数などと命名した標準モジュールに以下の関数をコピペして保存して下さい。
次に、イミディエイトウインドウでテストして頂ければ幸いです。

[イミディエイト]
? DBSelect("SELECT F2 FROM A WHERE F1=1111")
1;4
? DBSelect("SELECT F2 FROM A WHERE F1=1111", " And ")
1 And 4 And

Public Function DBSelect(ByVal strQuerySQL As String, _
             Optional ByVal strSeparator As String = ";") As String
On Error GoTo Err_DBSelect
  Dim I   As Integ...続きを読む

Qアクセス:SQLでフィールドの結合できますか

例でいいますと、
テーブル:Table_Aには
フィールド:a1,a2,a3、があります
ここで、bbというフィールドで、内容はa1+a2のものを得たいのですが

Table_Aには、a1、a2、a3、が定義されていますが、bb、は定義されていません

事情は他の人が作ったもので、それに合わせる必要があるためです

別件ですが、bb、というフィールド名でa1、を使いたい時は
select a1,a2,a3,a1 as bb from Table_A;
と、書くことを教えてもらいました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2295714

今回はa1とa2が結合したものが、bbというフィールドで使いたいことです

SQLではそんなことできません、という回答でもいいので
よろしくお願いします

Aベストアンサー

ほいよ。

select a1,a2,a3,[a1]&[a2]as[bb] from Table_A;

こんなもんかな。

参考までに。。。

>>SQLではそんなことできません、という回答でもいいので
SQLもいろいろと種類があるので全てがこれで~というわけでもないです。はい。
他にも、OraclSQLやSQLServerやMySQLなど、いろいろあります。
自分は、SQLServerでお勉強中ですが。。。

それぞれ記述がかなり違ってきたりもするので、もしも、Access以外のデータベースソフトを使う機会があったらその都度調べながら進めることになると思います。
まぁ、基本は同じですけどね。若干違ってくるので。。。

何はともあれ、がんばってくださいな。

参考URL:http://ag5.net/~nino/access-32.html

QAccess 同じデータをたくさんのレコード(同一列)に一度に入力するには

いつもお世話になっています。
Accessの基本的な入力に関して教えてください。
同じデータをたくさんのレコード(同一フィールド)に一度に入力するには、どうすればよいか教えてください。

Excelの列方向へのコピーと同じような感覚でできないのでしょうか?

よろしくお願いします。

Aベストアンサー

質問の回答にならないかも知れませんが・・・

1.EXCELでコピーするための元データを作成します
  ※仮にレコードが1000件ある場合はEXCELで1000行作ります。

2.Excelのデータをコピーします。

3.Accessのテーブルを開きます。

4.先頭レコードの貼り付けをしたい項目にカーソルを合わせます。(カーソルは白の十字)

5.下方向へドラッグし、項目を選択します。

6.貼り付けをします。

※貼り付けに失敗した場合、元に戻せませんので必ず元ファイルのコピーを取ってから行ってください

よろしければ、お試し下さい


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング