2017-08-21 10 views
0

私はマクロを習っているので、アクセスvbaスクリプトの初心者です。私は異なる行にある同じ製品の属性のリストを連結しようとしています。たとえば、列A(fruit_name)は果物名を持ち、列B(fruit_colors)は色を持っていますが、果物と同じ列に果物色が欲しいです。アクセスvbaマクロの連結

|**fruit_name** | **fruit_colors** | <br> 
|----------------|------------------|<br> 
|Apple   |Red   |<br> 
|Apple  |Yellow  |<br> 
|Apple  |Green  |<br> 
|Apple  |White  |<br> 
|Banana  |Red   |<br> 
|Banana  |Yellow  |<br> 
|Banana  |Green  |<br> 
|Banana  |White  |<br> 
|Plum  |White  |<br> 
|Plum  |Bluish  |<br> 
|Plum  |Purple  |<br> 

結果は次のようになります。

<br> 
|**name** | **colors** | <br> 
|----------------|------------------|<br> 
|Apple  | Red, Yellow, Green, White | <br> 
|Banana  | Red, Yellow, Green, White | <br> 
|Plum  | White, Bluish, Purple | <br> 

これは私が持っているものです。

Set fruit_name = rstsource.Fields("fruits") 
Set source_fruit = rstsource.Fields("fruits_list_type") 

rstsource.MoveFirst 
count = rstsource.RecordCount 
counter = 0 

fruit_name = source_fruit 
result = source_table 


Do 
    Do 
    counter = counter + 1 
    result = result & ", " & source_table 
    rstsource.MoveNext 

    Loop Until counter = count Or fruit_name <> source_fruit 

      rstdest.AddNew 
      rstdest.Fields("names") = fruit_name 
      rstdest.Fields("colors") = result 
      rstdest.Update 

      fruit_name = source_fruit 
      result = " " 

    Loop Until rstsource.EOF 

編集: これは私が得る結果である - 一部は前面にカンマました。

バナナ - ホワイト、ホワイト
アップル - 、Yelow、レッド
Banana-、レッド
バナナ - ホワイト、ホワイト
アップル、グリーン
プラム - 、グリーン
プラム - 、レッド
バナナ - 、エンドthehereでレッド

は、任意のファイル名を指定して実行時エラー3021

ですフィードバックは高く評価されます。ありがとうございました。

+0

source_fruitの値はどこで取得できますか? – Stefan

+0

私はここに含まれていない宣言を作成しました: set source_fruit = rstsource.Fields( "fruits_list_type") – Joy

+0

私はあなたの結果が最初の値を2回(result = source_table)得ると思います。あなたが間違った出力を示すことができれば、問題を見つけやすくなります。 – Stefan

答えて

1

私はAllen BrowneのConcat関数http://allenbrowne.com/func-concat.htmlの読み込みとダウンロードを行います。これは、あなたが望むものとまったく同じです。

これはレポートまたは表示のみを目的としたものです。このようなデータは保存しないでください。

+0

ありがとうございました。私はそれを読むでしょう。これはレポート目的のためです。私はAccessでいくつかのクエリを持っています。私はマクロが製品名(上記の例では果物を使用)を書き、次の列の属性の連結を作成するテーブルを作成しました。 – Joy

0

このクエリを作成して値を結合するにはどうすればよいですか?

I have a table with the following structure and values: 

EventID PersonName 
----------- ------------ 
1 John 
1 Peter 
1 Sylvia 
2 John 
2 Sylvia 
3 Peter 
3 June 

I'd like to run a query and get results in the following format: 

EventID PersonNames 
-------- --------------- 
1 John, Peter, Sylvia 
2 John, Sylvia 
3 Peter, June 

これを達成するクエリがありますか?

Concatenate fields in same table 
Author(s) Dev Ashish 
(Q) I need to concatenate a field in the format "Value1; Value2; Value3" etc. for each unique value of another field in the same table. How can I do this? 
(A) Using the fConcatFld function, in the Northwind database, the following query should return a concatenated list of all CustomerIDs if you group by ContactTitle. 

SELECT ContactTitle, fConcatFld("Customers","ContactTitle","CustomerID","string",[ContactTitle]) AS CustomersFROM CustomersGROUP BY ContactTitle; 
'************ Code Start ********** 
'This code was originally written by Dev Ashish 
'It is not to be altered or distributed, 
'except as part of an application. 
'You are free to use it in any application, 
'provided the copyright notice is left unchanged. 
' 
'Code Courtesy of 
'Dev Ashish 
' 
Function fConcatFld(stTable As String, _ 
        stForFld As String, _ 
        stFldToConcat As String, _ 
        stForFldType As String, _ 
        vForFldVal As Variant) _ 
        As String 
'Returns mutiple field values for each unique value 
'of another field in a single table 
'in a semi-colon separated format. 
' 
'Usage Examples: 
' ?fConcatFld(("Customers","ContactTitle","CustomerID", _ 
'    "string","Owner") 
'Where Customers  = The parent Table 
'  ContactTitle = The field whose values to use for lookups 
'  CustomerID = Field name to concatenate 
'  string  = DataType of ContactTitle field 
'  Owner   = Value on which to return concatenated CustomerID 
' 
Dim lodb As Database, lors As Recordset 
Dim lovConcat As Variant, loCriteria As String 
Dim loSQL As String 
Const cQ = """" 

    On Error GoTo Err_fConcatFld 

    lovConcat = Null 
    Set lodb = CurrentDb 

    loSQL = "SELECT [" & stFldToConcat & "] FROM [" 
    loSQL = loSQL & stTable & "] WHERE " 

    Select Case stForFldType 
     Case "String": 
      loSQL = loSQL & "[" & stForFld & "] =" & cQ & vForFldVal & cQ 
     Case "Long", "Integer", "Double": 'AutoNumber is Type Long 
      loSQL = loSQL & "[" & stForFld & "] = " & vForFldVal 
     Case Else 
      GoTo Err_fConcatFld 
    End Select 

    Set lors = lodb.OpenRecordset(loSQL, dbOpenSnapshot) 

    'Are we sure that duplicates exist in stFldToConcat 
    With lors 
     If .RecordCount <> 0 Then 
      'start concatenating records 
      Do While Not .EOF 
       lovConcat = lovConcat & lors(stFldToConcat) & "; " 
       .MoveNext 
      Loop 
     Else 
      GoTo Exit_fConcatFld 
     End If 
    End With 

    'That's it... you should have a concatenated string now 
    'Just Trim the trailing ; 
    fConcatFld = Left(lovConcat, Len(lovConcat) - 2) 


Exit_fConcatFld: 
    Set lors = Nothing: Set lodb = Nothing 
    Exit Function 

Err_fConcatFld: 
    MsgBox "Error#: " & Err.Number & vbCrLf & Err.Description 
    Resume Exit_fConcatFld 
End Function 
'************ Code End ********** 

コードモジュールにfConcatFld()関数をコピーして貼り付けます。コードの 以下VBAラインを変更:

lovConcat = lovConcat &のLOR(stFldToConcat)& ";"

に:

lovConcat = lovConcat &のLOR(stFldToConcat)& ""

...それを保存し、コードをコンパイルします。

次に、新しいクエリを作成し、SQLビューでクエリを開き、SQLビューペインに 次のSQLステートメントを貼り付けます。

SELECT EventID, fConcatFld("MyTable","EventID","PersonName","Long", EventID) 
AS PersonNames 
FROM MyTable 
GROUP BY EventID; 

...とあなたの名前で「MyTableという」を置き換えます表。"EventID" データ型がLongでない場合は、SQL文の でもフィールドが使用しているデータ型に置き換える必要があります。

クエリを保存して実行します。 Voila!コンマ区切りリスト。