• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:access で 方法を教えてください。)

セミコロン区切りのデータから件数とバイトを表で表示する方法

このQ&Aのポイント
  • セミコロン区切りのデータから、特定の要素の件数とバイト数を表で表示する方法を教えてください。
  • 例えば、テーブル例の場合、aaaaの件数は2件でバイト数は2500byte、bbbbの件数は2件でバイト数は5000byteとなります。
  • 抽出条件に応じて、各要素の件数とバイト数を計算し、表で表示させる方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

追加です。 コードの最後、 db.Close Set db = Nothing End Sub のところで、 MsgBox ("計算終了") をいれます。 db.Close Set db = Nothing MsgBox ("計算終了") End Sub このようにします。いつ計算が終わったかわからないので。 終わればメッセージボックスが出てきます。OKを押して お終いです。

hiro18440
質問者

お礼

piroin654さん 大変詳しい 情報ありがとうございました。 やってみましたがなんとかなりそうです。 とてもわかりやすいご回答でした。 またよろしくお願いいたします。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

rs2!要素 = se rs2!数値 = num rs2.Update se = "" rs1.MoveNext Loop Set qdf = db.CreateQueryDef("", strSQL) Set rs4 = qdf.OpenRecordset() rs4.MoveFirst Do Until rs4.EOF rs3.AddNew rs3!結果 = rs4![要素] & rs4![回数] & "件" & rs4![数値の合計] & "byte" rs3.Update rs4.MoveNext Loop rs1.Close Set rs1 = Nothing rs2.Close Set rs2 = Nothing rs3.Close Set rs3 = Nothing qdf.Close Set qdf = Nothing rs4.Close Set rs4 = Nothing db.Close Set db = Nothing End Sub コードは連続しているので続けてコピーと貼り付け してください。 以上です。確認してみてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

その2 (2) フォームにボタンを一つ作り、その クリックイベントで、以下のSub TTT()とEnd Sub の間のコードを張り付ければボタンクリックのイベントで コードが実行されます。 Private Sub コマンド0_Click() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim rs3 As Recordset Dim rs4 As Recordset Dim s As String Dim se As String Dim i As Integer Dim j As Integer Dim m As String Dim k As Integer Dim num As Integer Dim ar() As String Dim p As Integer Dim q As Integer Dim u As Integer Dim v As Integer Dim ret As Variant Dim strSQL As String Dim qdf As QueryDef Set db = CurrentDb Set rs1 = db.OpenRecordset("T基", dbOpenDynaset) Set rs2 = db.OpenRecordset("T要素", dbOpenDynaset) Set rs3 = db.OpenRecordset("T集計", dbOpenDynaset) strSQL = "SELECT T要素.要素, Sum(T要素.数値) AS 数値の合計, Count(T要素.要素) AS 回数 " & _ "FROM T要素 " & _ "GROUP BY T要素.要素;" rs1.MoveFirst Do Until rs1.EOF s = rs1!要素群 j = Len(s) - Len("byte") p = Len("byte") For i = j To 1 Step -1 If IsNumeric(Mid(s, i, 1)) = True Then m = m & CStr(Mid(s, i, 1)) Else Exit For End If Next i k = Len(m) num = Val(StrReverse(m)) m = "" u = j - k ret = InStr(1, s, ";", vbBinaryCompare) If ret <> 0 And IsNull(ret) = False Then For v = u To 1 Step -1 If Not Mid(s, v, 1) = ";" Then se = se & Mid(s, v, 1) se = StrReverse(se) Else Exit For End If Next v Else For v = u To 1 Step -1 se = se & Mid(s, v, 1) Next v End If ar = Split(s, ";") For q = 0 To UBound(ar) - 1 rs2.AddNew rs2!要素 = ar(q) rs2!数値 = num rs2.Update Next q rs2.AddNew もう一回続く

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

【字数制限があるので二つに分けます】 その1 aaaa;bbbbが受信メールなのか、あるいは aaaa;bbbb;cccc;dddd;eeee;ffff2000byteまで表示 されているテーブルのフィールド名が受信メール なのか不明なのでコードのほうはいじらない ことにしました。 レコード数がかなりなのでコードを少し変更しました。 相当量のレコード数なのでコード実行中に SQLの結果クエリを作成するのでパフォーマンス が落ちます。一応こちらで一万件程度のレコードで 確認しましたが、耐えられるかどうか。 なお、以下のT要素には各レコードを分解したデータが 出ているので以下のSQL文でクエリを作成すると byteという文字は含まれいませんが結果を参照 できます。T要素はT基よりもはるかにレコード数が あります。どのくらいになるのか見当がつきませんが、 実行結果がAccessのファイル容量の限界を超えなければ いいのですが。 一つ方法がありますが、T基、T要素、T集計、 フォームを別々のファイルにして、フォーム のファイルにテーブルをリンクする方法 ならばファイルの容量に左右されることは ないと思います。単純にフォームのあるファイルに テーブルをリンクするだけです。同じフォルダに 置いておけば整理がつきます。 T要素の結果確認クエリ: SELECT T要素.要素, Count(T要素.要素) AS 回数, Sum(T要素.数値) AS 数値の合計 FROM T要素 GROUP BY T要素.要素; 以下はテーブルの設定とコードです。 (1) テーブルを三つ。:より右はフィールド名と型 T基:要素群(テキスト型)または要素群(メモ型) T要素:要素(テキスト型)、数値(数値型) T集計:結果(テキスト型) T基は質問の文字列が格納されているテーブルです。 このテーブルの各レコードを分解し、T要素に格納 します。そのT要素のレコードを集計してT集計に 格納します。 テーブルの名前、各フィールドの名前は状況に 合わせて変更していいのですが、コードの中も それに合わせて変更する必要があります。 どちらかと言えば、テーブルの名前とフィールド名前を こちらに合わせて質問のテーブルの名称とフィールドの 名称を変更しておけばそのままこのコードが実行できます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

解決したでしょうか。コードでテーブルの レコードを解析し、結果を別のテーブルに 格納することはできますが、コードが 複雑なので、テーブルの名称とデータが 表示されているフィールド名がわかれば コードの中で訂正することがないように なります。もし、コード中の訂正が 可能ならばそのまま載せますが、 いかがでしょうか。 それと、「byte」という文字は そのまま実際に同じ表現をするのでしょうか。

hiro18440
質問者

補足

回答ありがとうございます。 まだ解決できておりません フィールド名は  aaaa;bbbb のところが 受信メール    byteは そのまま byteです。 Kバイト表示ですが               最終はメガバイト表示に変えます。 よろしくお願いします。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

考え方としては、 最終は区切り文字「;」がないのでかなり面倒ですが・・・・。 各フィールドに分かれていれば、 新たにテーブルを作成し もともとのテーブルから追加クエリを繰り返すと 目的の元になるテーブルができあがります。 1 aaaa;bbbb;cccc;dddd;eeee;ffff2000byte 2 aaaa300byte 3 bbbb;cccc;ffff3000byte 4 ffff;dddd120byte を 1 aaaa;2000byte 1 bbbb;2000byte 1 cccc;2000byte 1 dddd;2000byte 1 eeee;2000byte 1 ffff;2000byte 2 aaaa; 300byte 3 bbbb;3000byte 3 cccc;3000byte 3 ffff;3000byte 4 ffff; 120byte 4 dddd; 120byte に分解する。 各フィールドに分かれていないとなると 1 aaaa;bbbb;cccc;dddd;eeee;ffff2000byte これを1フィールド毎に分解が必要で、VBA対応になります。 「;」をinstr関数で見つける、 left関数で前半を抜き取る、次の後半を「;」をinstr関数で見つける、 left関数で前半を抜き取る、次の後半を「;」をinstr関数で見つける、 ・・・・・文字数分繰り返し。 最終は規則性がなかったら判定できず区切ることができないので 手修正してでも「;」を付与することを勧めます。

hiro18440
質問者

お礼

ご返事おそくなりました すみません。 回答ありがとうございます。 分解する方法なのですが、現状のテーブルのデータ量は 行で500000行を超えていて、カンマ区切りの最大データの列が126あります。 作業的には office 2007を使用しないといけないかもしれません(^^;

関連するQ&A