• 締切済み

VBA コードの置換に関する質問<お願いします!!> 

マイクロソフトアクセスで 以下のようなデータを VBAを用いて 自動で置換させたいんですけど コードが分かりません教えてください!! <やりたい事> ・同じ分類番号内で最頻出単語にすべて置き換える 分類番号 単語   分類番号 単語 1 イチゴ      1 イチゴ 1 イチゴ      1 イチゴ 2 りんご      2 りんご 2 りんご      2 りんご 2 りんご     2 りんご 2 アップル →  2 りんご 3 ブドウ   3 ブドウ 3 ブドウ   3 ブドウ 3 ブドウ   3 ブドウ 3 ぶどう → 3 ブドウ 3 ぶどう → 3 ブドウ 困ってます! お願いします!!

みんなの回答

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.3

ANo1です。  回答はとりあえず無視してください。 先頭と勘違いしました。  すみません。

  • luan78zao
  • ベストアンサー率55% (19/34)
回答No.2

できなくはないが、それなりに面倒です。 まず、Microsoft のデータベース製品では、ひらがなとカタカナは区別されないので、SQL文で単純に集計しても、「ぶどう」と「ブドウ」を別々に集計することはできません。 この問題を解決するには、文字列を1文字ずつ文字コードに変換する関数を書く必要があります。 Option Compare Binary Option Explicit Public Function GetCharCodeFromStr(ByRef strArg As String) As String Dim strTmp As String Dim i As Long For i = 1 To Len(strArg) strTmp = strTmp & " " & Hex(Asc(Mid$(strArg, i, 1))) Next GetCharCodeFromStr = Mid$(strTmp, 2) End Function Public Function GetStrFromCharCode(ByRef strArg As String) As String Dim strArr() As String Dim strTmp As String Dim i As Long strArr() = Split(strArg) For i = LBound(strArr) To UBound(strArr) strTmp = strTmp & Chr("&H" & strArr(i)) Next GetStrFromCharCode = strTmp End Function 【使用例】 GetCharCodeFromStr("ブドウ") → 8375 8368 8345 GetCharCodeFromStr("ぶどう") → 82D4 82C7 82A4 GetStrFromCharCode("8375 8368 8345") → ブドウ GetStrFromCharCode("82D4 82C7 82A4") → ぶどう このような仕掛け (事前準備) を仕込んだ上でSQLを書けば希望する結果を得ることは可能です。 仮に、処理対象のテーブル名が「tblFruits」、「分類番号」に相当する列が「ID」、「単語」に相当する列が「Word」だとすると、下記のようなSQL文となります。 SELECT tblFruits.ID, qrySelectMax.FruitName FROM tblFruits INNER JOIN (SELECT qry02.ID, qry01.Name AS FruitName FROM (SELECT qry01.ID, Max(qry01.CharCodeCount) AS MaxCharCodeCount FROM (SELECT subqry.ID, subqry.CharCode, Count(subqry.CharCode) AS CharCodeCount, GetStrFromCharCode([CharCode]) AS Name FROM (SELECT tblFruits.ID, GetCharCodeFromStr([Word]) AS CharCode FROM tblFruits) AS subqry GROUP BY subqry.ID, subqry.CharCode, GetStrFromCharCode([CharCode])) As qry01 GROUP BY qry01.ID) AS qry02 INNER JOIN (SELECT subqry.ID, subqry.CharCode, Count(subqry.CharCode) AS CharCodeCount, GetStrFromCharCode([CharCode]) AS Name FROM (SELECT tblFruits.ID, GetCharCodeFromStr([Word]) AS CharCode FROM tblFruits) AS subqry GROUP BY subqry.ID, subqry.CharCode, GetStrFromCharCode([CharCode])) AS qry01 ON (qry02.MaxCharCodeCount = qry01.CharCodeCount) AND (qry02.ID = qry01.ID)) As qrySelectMax ON tblFruits.ID = qrySelectMax.ID ※ 上記のSQL記述例は、可読性を一切考慮していません。 副問い合わせの部分が読みにくい場合は、インラインで記述せず、クエリーオブジェクトとして保存すれば読みやすくなります。 ※ データの件数が1万件を超える規模だと、VBによる関数呼び出しのコストが処理性能に与えるインパクトが無視できなくなると思います。 性能が問題になる場合は、SQL Server 等、ユーザ定義のstored function が使用できる環境を利用すればよいでしょう。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

VBAを使わなくても良いなら、 1.分類番号でグループ化し単語の先頭を抽出するクエリを作る。 2.元のテーブルとグループ化したテーブルを分類番号でつなげたクエリをつくり、更新するなり、新しくテーブルを作るなり、、、 どうしても使いたいなら、 単語を入れる配列を作って配列にブランクをセットして、 ADOでも、DAOでもいいからテーブルを開いて レコードを頭から1件ずつなめていって 置き換えていくとか、 DO WHILE NOT RST.EOF IF TANGO(RST!分類番号)= "" THEN TANGO(RST!分類番号)= RST!単語 IF TANGO(RST!分類番号) <> RST!単語THEN RST!単語=TANGO(RST!分類番号) RST.UPDATE END IF RST.MOVENEXT LOOP なんとなくこんなかんじで