• 締切済み

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 なんとなくこんなかんじで

関連するQ&A

  • VBA コードの削除に関する質問<お願いします!!> 

    マイクロソフトアクセスで 以下のようなデータを VBAを用いて 自動で削除させたいんですけど コードが分かりません教えてください!! <やりたい事> ・同じ分類番号内で一番上に表示されている単語 以外すべて削除する 分類番号   単語     分類番号   単語 1      A         1       A 1      B         2       A 1      C    →    3       A 2      A 2      B 2      C 2      D 3      A 3      B 3      C 3      D 3      E 困ってます! お願いします!!

  • エクセル2007VBAにおける検索・置換機能

    エクセル2007VBAにおいて、メモ帳やWordのような 検索・置換機能はないのでしょうか? 複数の似たようなコードを記述する時、同じ単語が 頻出します。それらはすべてコピペするので、 一つ間違えればすべて間違えます。 検索・置換機能はあれば便利だと思いますが、 ご存知の方がいらっしゃいましたら、ご教示 願います。

  • エクセルを起動したときに自動で置換したい

    今、アクセスからエクセルへエクスポートしたデータをまとめています。 そのエクセルのデータをピボットテーブルにまとめて、 さらに商品コードごとに分けるという作業をしていますが、 その元のデータを開いたときには商品名で出てきてしまいます。 できれば自動で商品名をコード名に置換したいのです。 例えば、 元データは苺となっているものを、修正後のデータはstrawberryという ように自動でしたいと思っています。 手で置換するには商品名が多すぎるので、関数やツールなどで、 置換したいと思っています。 なにかいい方法があればぜひ、ご教授よろしくお願いします。

  • 改行コードを任意の文字に置換するには

    マイクロソフトのエクセルかアクセス、または、 メモ帳、ワードパッドで、改行コードを任意の文字 (例えば「A」)に置換する方法をご存知の方、 教えてください。 VBAを使った方法でもよいです。 秀丸等のエディターで、「\n」を使って、 置換をする方法は知っているのですが、 アクセスやエクセルしか使えない端末で実施する必要があります。 よろしくお願いします。

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

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

  • Excelの使い方で質問

    例えば、 A列1~10には「No.」として1~10の数字が順番に入ってます。 B列1~10には「りんご」「みかん」「いちご」「ぶどう」という文字がいくつかずつ入っています。 そういうデータで「りんご」は「No.」いくつといくつにあるか、「みかん」は「No.」いくつといくつにあるか、「いちご」は…、「ぶどう」は…、といったように集計したいと思っています。 りんご 1,5,6 みかん 9 いちご 2,3,9 ぶどう 4,7,8,10 といった感じにできれば良いのですが、どうすればよろしいのでしょうか? よろしくご教授ください。

  • EXCEL VBA 複数列を2列にまとめる

    下記のようなデータ(列数も行数も常に変わり、固定ではない)を ┌───────────────── │ A 列  | B列   | C列   | D列 ├─────────────────── │ 1 │伝票01 │品名01 | 品名02 │品名03 ├─────────────────── | 2 │0011 │みかん │みかん | りんご ├─────────────────── │ 3 │1001 │りんご  │いちご |    ├─────────────────── │ 4 │1100 │いちご  │みかん | ぶどう  └─────────────────── ↓のように2列にまとめる方法はございますでしょうか?VBAを希望しております。   よろしくお願い申し上げます。 ┌───────────────── │ A │ B   ├───────────────── │ 1 │伝票  │品名 ├───────────────── │ 2 │0011_品名01 │みかん  ├───────────────── │ 3 │1001_品名01 │りんご    ├───────────────── │ 4 │1100_品名01 │いちご ├───────────────── │ 5 │1001_品名02 │みかん  ├───────────────── │ 6 │1100_品名02 │いちご  ├───────────────── │ 7 │1001_品名02 │みかん  ├───────────────── │ 8 │1100_品名03 │りんご  ├───────────────── │ 9 │1001_品名03 │  ├───────────────── │ 0 │1001_品名03 │ぶどう  ├─────────────────

  • ACCESSでの重複箇所

    accessで以下の様なデータがあります 受注番号|商品名|個数|単価|送料|手数料| 1111 |みかん|3 |200 |500 |0 | 2222 |りんご|2 |250 |500 |250 | 2222 |いちご|4 |200 |500 |250 | 2222 |メロン|1 |1000|500 |250 | 3333 |ぶどう|2 |800 |500 |0 | 4444 |いちご|2 |200 |500 |250 | 4444 |メロン|1 |1000|500 |250 | 2222や4444の様に受注番号が同じ場合 2222 |りんご|2 |250 |500 |250 | 2222 |いちご|4 |200 |0 |0 | 2222 |メロン|1 |1000|0 |0 | 4444 |いちご|2 |200 |500 |250 | 4444 |メロン|1 |1000|0 |0 | と、先頭にだけ送料・手数料を残して残りを【0】もしくは 削除する方法はありますか? 手作業では件数が多い為、クエリなど使って自動的に する方法があれば教えてください。 どうぞよろしくお願い致します。

  • オートフィルタのVBAについて

    初めまして、オートフィルタに係るVBAについて質問させてください! A列にりんごやぶどうなど果物の名前が入っているデータがあり、K列までデータが 入っています。(B列以降は果物の個数や値段のデータなので、果物の名前はA列のみです。)うち、「りんご」、「みかん」、「もも」、「いちご」のデータのみを抽出したいため、以下のようなVBAを記述しました。 しかし、実行したところエラーコード1004「RangeクラスのAutofillメソッドが失敗しました。」というメッセージが出てきたため、処理ができませんでした。 何か範囲の指定方法が間違っているのでしょうか…? ご教示いただけるととても嬉しいです。 よろしくお願いいたします。 Rows("1:1").AutoFilter ActiveSheet.Range("A1:K" & Cells(1).CurrentRegion.Rows.Count).AutoFilter Field:=1, Criteria1:= _ Array("りんご", "みかん", "もも", "いちご"), Operator:=xlFilterValue

  • Excel2003 並び替えに関する質問 VBA初心者

    エクセルの並び替えにおいて質問させていただきます。  A列  B列  C列   D列 りんご  1  バナナ  4 バナナ  2  みかん  6 すいか  3  いちご  8 みかん  4  もも   3 いちご  5  すいか  2 ドリア  6  ぶどう  1 というものを  A列  B列  C列   D列 りんご  1   バナナ  2  バナナ  4 すいか  3  すいか  2 みかん  4  みかん  6 いちご  5  いちご  8 ドリア  6           もも   3         ぶどう  1 というようにA列にならってC,D列の項目を並び替えて、並び替えられないものは下に列挙させるようなやり方をVBAで組みたいのですが、まずはどうすればよいのかわかりません。 もし、これを見て答えられるようであれば、どなたか教えていただければ幸いです。 どうか宜しくお願いします。

専門家に質問してみよう