よろしくお願いいたします。
現在、Accessのフォームにて、任意の番号をテキストボックス("(1)")に入力し"検索ボタン"を押すと、該当する郵便番号がフォーム上のテキストボックス("(2)")に表示されるシステムを作っています。
また、郵便番号は"郵便番号一覧"というテーブルにまとめています。
(テーブルには約14万件の"郵便番号"と"住所"が含まれています)
ここで質問があるのですが、同じ郵便番号であっても複数の住所が該当するケースがあります。
テーブルにもそうした件が多数含まれていますが、現在の私のVBAでは、その内のひとつの住所しか表示することが出来ません。
そこで、複数の住所が存在する場合は、該当する住所の一覧が表示され、その中から1件を選べるようなシステムを作りたく考えています。
様々な参考書を読み続けてきましたが、完全に行き詰まりました。お知恵を拝借頂けますと幸いです。
--------------------------------
尚、現在のVBAは下記の通りです。
Private Sub 検索ボタン_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("郵便番号一覧", dbOpenTable)
With rs
.Index = "郵便番号"
.Seek "=", Me.(1)
End With
If Not rs.NoMatch Then
With Me
.(2) = rs!住所
End With
End If
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub
No.1ベストアンサー
- 回答日時:
私だったら
郵便番号による抽出クエリをひとつ作り
抽出結果が2以上だったら、いったんリストボックスにデータをいれて
リストをダブルクリックするか何かのイベントでテキストボックスにデータをコピーする
というようなことをします。
リストボックスが邪魔なら、必要なときだけ表示させます。
DAO でも
>If Not rs.NoMatch Then
の部分を
Do Until rs.NoMatch
rs.Seek "=", Me.(1)
...................
Loop
とすれば連続して検索できます。
No.3
- 回答日時:
まあ、僅か一行でも書けるかと・・・。
Private Sub コマンド_検索_Click()
Me.リスト_住所検索結果.RowSource = DBSelect("A, B, C", "Table1", , "ID=1", , True, False)
End Sub
もちろん、次のような DBSelect関数を使えばです。
*上述のコードはテスト済みです。
*リストボックスの値集合タイプ=リストです。
' -------------------------------------------------------------------------------------------------------
' DBSelect(列リスト,
' 表名,
' グループ指定文,
' 条件文,
' 並び替え文,
' isOneSentence, ---- 列データをセミコロン(;)で連結して1文にするか否か?
' isConvert) -------- 列データを表示形式に変換してから配列に代入するか否か?
' -------------------------------------------------------------------------------------------------------
Public Function DBSelect(ByVal strFields As String, _
ByVal strTable As String, _
Optional strGroupBy As String, _
Optional strWhere As String, _
Optional strOrderBy As String, _
Optional isOneSentence As Boolean = False, _
Optional isConvert As Boolean = False) As Variant
On Error GoTo Err_DBSelect
Dim I As Integer
Dim J As Integer
Dim R As Integer ' データを代入する配列 DataValue(,) のインデックスを決める行カウンター
Dim C As Integer ' データを代入する配列 DataValue(,) のインデックスを決める列カウンター
Dim M As Integer ' データを代入する配列 DataValue(,) の一つ目の添字の最大値=行総数 - 1
Dim N As Integer ' データを代入する配列 DataValue(,) の二つ目の添字の最大値=列総数 - 1
Dim strQuerySQL As String
Dim rst As ADODB.Recordset
Dim fld As ADODB.Field
Dim strList As String ' 全てのデータをセミコロン(;)で区切った1行の文字列を格納する変数
Set rst = New ADODB.Recordset
strQuerySQL = "SELECT " & strFields & " FROM " & strTable
If Len(strGroupBy) > 0 Then
strQuerySQL = strQuerySQL & " GROUP BY " & strGroupBy
End If
If Len(strWhere) > 0 Then
strQuerySQL = strQuerySQL & " WHERE " & strWhere
End If
If Len(strOrderBy) > 0 Then
strQuerySQL = strQuerySQL & " ORDER BY " & strOrderBy
End If
' =================
' Begin With: rst
' -----------------
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
' =================
' Begin With: fld
' -----------------
With fld
C = C + 1
If Not isConvert Then
DataValues(R, C) = Nz(.Value, "")
Else
' --------------------------
' 列データを表示形式に変換
' -------------------------
Select Case .Type
Case adBoolean ' ブール型
DataValues(R, C) = IIf(.Value = -1, "Yes", "No")
Case adChar, adVarChar ' 文字列型
DataValues(R, C) = Nz(.Value, "")
Case adDBDate, adDBTimeStamp ' 日付型(yyyymmdd)、日付/時刻型(yyyymmddhhmmss + 1/10億)
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 If
End With
' ---------------
' End With: fld
' ===============
Next fld
.MoveNext
Next R
Else
ReDim DataValues(0, 0)
DataValues(0, 0) = ""
strList = ""
End If
End With
' ---------------
' End With: rst
' ===============
If isOneSentence Then
' -------------------------------
' セミコロン(;)で連結して1文に
' -------------------------------
For I = 0 To M
For J = 0 To N
strList = strList & DataValues(I, J) & ";"
Next J
Next I
End If
Exit_DBSelect:
On Error Resume Next
rst.Close
Set rst = Nothing
DBSelect = IIf(isOneSentence, strList, DataValues())
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
No.2
- 回答日時:
自分が作るとしたら
1.番号入力
2.検索ボタン押下
3.リストボックスに候補を表示
4.リスト中の住所を選択
5.選択完了ボタン押下
といった感じの流れで作りますね。
3は連結しておけば良いし。
VABも楽になるのでは?
繰り返しが分からないのであれば自分はよく
下記のような感じで行っています。
=====================================================
wSql = "SELECT * from 出荷 where 区分 = 1"
Set rs = db.OpenRecordset(wSql, dbOpenSnapshot, dbForwardOnly)
Do While Not rs.EOF
'処理・・・
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Google Maps 郵便番号を Google マップで調べる方法を教えてください 環境としては 日本に滞在して間もない 3 2022/03/23 12:25
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
array関数で格納した配列の型を...
-
ExcelのINDEXとMATCH関数でスピ...
-
表にフィルターをかけ、絞った...
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
Excelのセルの色指定をVBAから...
-
[VBA]改行入りのセルの値を配列...
-
VB6.0 ファイルの一括読込み
-
【VBA】ユーザーフォーム リス...
-
VBA listBoxについて
-
DataSetから、DataTableを取得...
-
16進数から2進数へ
-
【VBA】配列に数式を仕込む方法...
-
For Nextマクロの高速化につい...
-
Dictionaryを使い4つの条件の一...
-
Excel VBA 配列の分割について
-
VBAで指定期間の範囲を抽出し、...
-
C言語で、変数名を引数として渡...
-
ExcelVBAの配列変数で一括でセ...
-
配列のSession格納、及び取得方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
array関数で格納した配列の型を...
-
ExcelのINDEXとMATCH関数でスピ...
-
[エクセル]連続する指定範囲か...
-
エクセルで、絶対値の平均を算...
-
VBA listBoxについて
-
配列がとびとびである場合の書き方
-
表にフィルターをかけ、絞った...
-
VBA 配列に格納した値の平均の...
-
[VBA]改行入りのセルの値を配列...
-
エクセルでエラーを無視して一...
-
iniファイルのキーと値を取得す...
-
二次元配列の中の各行の要素を...
-
SUMPRODUCT関数を用いた最小値
-
【VBA】ユーザーフォーム リス...
-
Split関数でLong配列に格納する...
-
【VBA】配列に数式を仕込む方法...
-
.NET - 配列変数を省略可能の引...
-
スプレットシートのGetTextにつ...
-
Excelのオートフィルタで抽出し...
おすすめ情報