• 締切済み

リストボックス 複数選択の場合の値取得

ACCESS2003を使用しています。 今、下記のプログラムにて リストボックスからファイル名を選び CSVをインポートさせ、更に選択したファイル名を新しいフィールドに書き込みをする。というシステムを作っています。 現在のプログラムですと、一つを選択した場合はうまく書き込めます。 ですが、複数同時選択する事はできますでしょうか? 長くて見づらいプログラムですが、参考までに掲載します。 よろしくお願いします。 Private Sub Form_Load() Dim oFSO As Object Dim oFile As Object Dim sTmp As String Const FolderPath = "\\St1\第2業務部\$運用\TESTkanno" sTmp = "" Set oFSO = CreateObject("Scripting.FileSystemObject") For Each oFile In oFSO.GetFolder(FolderPath).files If (Right(oFile.Name, 3) = "csv") Then sTmp = sTmp & ";" & Left(oFile.Name, InStr(oFile.Name, ".") - 1) End If Next If (Len(sTmp) > 0) Then sTmp = Mid(sTmp, 2) End If Me.lst_01.RowSource = sTmp 'Me.lst_01 = Null Set oFSO = Nothing End Sub Private Sub Cmd_01_Click() Dim ercd As Integer Dim LsName As String Dim TName As String Dim ITName As String Dim Name1 As String Dim Name2 As String Dim teigi As String Dim SQL As String Dim aa As Long Dim mySQL As String Dim db As Database Dim i As Integer Dim varData As Variant Dim strSelected As String strSelected = vbNullString With lst_01 For Each varData In .ItemsSelected strSelected = strSelected & .ItemData(varData - 1) & " " Next End With 'ファイル名の取得 strError = 0 LsName = "\\St1\第2業務部\$運用\TESTkanno\" TName = Left(strSelected, Len(strSelected) - 1) LsName = LsName & TName & ".csv" ITName = "T_Mas" 'レコードの追加 teigi = "RGB定義" DoCmd.TransferText acImportDelim, teigi, ITName, LsName, True SQL = "INSERT INTO T_Mas (ID1,ID,処理状況,請求日,学校識別コード,学校名,学校分類名,メールアドレス,名前,ふりがな,性別,生年月日,職業,高校所在地,高校名,学年,郵便番号,都道府県,区市町村&町域,番地以下,電話番号,FileName,区分,不備,不備理由,yu,gid,保留,処理済,件数報告日,納品日 )" & _ " SELECT [" & TName & "].[ID1], [" & TName & "].[ID],[" & TName & "].[処理状況], [" & TName & "].[請求日]," & _ " [" & TName & "].[学校識別コード], [" & TName & "].[学校名], [" & TName & "].[学校分類名], [" & TName & "].[メールアドレス]," & _ " [" & TName & "].[名前], [" & TName & "].[ふりがな], [" & TName & "].[性別], [" & TName & "].[生年月日]," & _ " [" & TName & "].[職業], [" & TName & "].[高校所在地], [" & TName & "].[高校名], [" & TName & "].[学年]," & _ " [" & TName & "].[郵便番号], [" & TName & "].[都道府県], [" & TName & "].[区市町村&町域], [" & TName & "].[番地以下]," & _ " [" & TName & "].[電話番号], [" & TName & "].[FileName], [" & TName & "].[区分], [" & TName & "].[不備], [" & TName & "].[不備理由], [" & TName & "].[yu], [" & TName & "].[gid]," & _ " [" & TName & "].[保留], [" & TName & "].[処理済], [" & TName & "].[件数報告日],[" & TName & "].[納品日], From" & "LsName" Name1 = TName & ".csv" Name2 = Left(TName, Len(TName) - 5) ret = MsgBox(Name1 & "を FileName、" & Name2 & "を 区分に追加しますか?", vbYesNo + vbQuestion, "インポート確認") Dim sql1 As String sql1 = "Update T_Mas SET FileName = '" & Name1 & "',区分 = '" & Name2 & "'" & " WHERE FileName Is Null AND 区分 Is Null" DoCmd.RunSQL sql1 End Sub

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

時間があったので、雰囲気作ってみました。 なるべく元の変数名を使うようにしていますが、細かい判別部分は分かってません。 (SQLの文字列がどこで使われているのかもわからなかったので) 雰囲気で見てください。雰囲気で。(検証とかしてません) 一時テーブルへ取り込みUpdate操作後、本テーブルへ追加する方法として 一時テーブルは本テーブルと同じ構造で既に存在していると想定 (DoCmd.TransferText の時にテーブルが新規に作られる?) ファイル名にドット(ピリオド)が複数あった場合用に InStrRev に変更 Const FolderPath = "\\St1\第2業務部\$運用\TESTkanno" Const ITName = "T_Mas" Const TmpITName = "Tmp_Mas"  ' ★ T_Mas 構造と同じ取り込み用一時テーブル名 Const teigi = "RGB定義" Private Sub Form_Load()   Dim oFSO As Object   Dim oFile As Object   Dim sName As String   Dim sTmp As String   sTmp = ""   Set oFSO = CreateObject("Scripting.FileSystemObject")   For Each oFile In oFSO.GetFolder(FolderPath).files     sName = oFile.Name     If (Right(sName, Len(sName) - InStrRev(sName, ".")) = "csv") Then       sTmp = sTmp & ";" & Left(sName, InStrRev(sName, ".") - 1)     End If   Next   If (Len(sTmp) > 0) Then     sTmp = Mid(sTmp, 2)   End If   Me.lst_01.RowSource = sTmp   Set oFSO = Nothing End Sub Private Sub Cmd_01_Click()   Dim LsName As String   Dim TName As String   Dim Name1 As String   Dim Name2 As String   Dim ret As Variant   Dim sSql As String   Dim iTmp As Long   For Each iTmp In Me.lst_01.ItemsSelected     TName = Me.lst_01.ItemData(iTmp)     LsName = FolderPath & "\" & TName & ".csv" '    一時テーブルへまずは取り込み     CurrentProject.Connection.Execute "DELETE * FROM " & TmpITName     DoCmd.TransferText acImportDelim, teigi, TmpITName, LsName, True     Name1 = TName & ".csv"     Name2 = Left(TName, Len(TName) - 5)     ret = MsgBox(Name1 & "を FileName、" & Name2 & "を 区分に追加しますか?", _           vbYesNo + vbQuestion, "インポート確認")     If (ret = vbYes) Then       sSql = "UPDATE " & TmpITName & " SET FileName = '" & Name1 & "',区分 = '" & Name2 & "'"       CurrentProject.Connection.Execute sSql '     一時テーブルから正式なテーブルへ (必要なら除外フィールド指定)       sSql = InsertSqlMakeFromTable(ITName, TmpITName)       Debug.Print sSql       If (Len(sSql) > 0) Then         CurrentProject.Connection.Execute sSql       End If     End If   Next End Sub ---以下を標準モジュールへ作成--- ' 追加クエリ作成用ファンクション (条件設定なし) ' sTo : 追加先テーブル名 ' sFrom : 追加元テーブル名 ' sBase : フィールド名参照テーブル名(省略時 sTo 使用) ' sExclusion : 追加除外フィールド名(オートナンバーなど除外するためのもの) '       複数指定時は、,カンマ区切り ' ' 戻り値: INSERT INTO で始まるSQL文 ' ' ※ ADOX使用のため、参照設定に ADO Ext が必要 ' Public Function InsertSqlMakeFromTable(sTo As String, sFrom As String, _                 Optional sBase As String = "", _                 Optional sExclusion As String = "") As String   Dim catdb As New ADOX.Catalog   Dim clm As Column   Dim sTable As String   Dim sToTmp As String   Dim sFromTmp As String   Dim vTmp As Variant   Dim i As Integer   Dim bFound As Boolean   On Error GoTo ERR_HAND   sTable = IIf(Len(sBase) = 0, sTo, sBase)   If (Len(sExclusion) > 0) Then     vTmp = Split(sExclusion, ",")   End If   sToTmp = ""   sFromTmp = ""   catdb.ActiveConnection = CurrentProject.Connection   For Each clm In catdb.Tables(sTable).Columns     bFound = False     If (Not IsEmpty(vTmp)) Then       For i = 0 To UBound(vTmp)         If (clm.Name = vTmp(i)) Then           bFound = True           Exit For         End If       Next     End If     If (bFound = False) Then       sToTmp = sToTmp & ", [" & clm.Name & "]"       sFromTmp = sFromTmp & ", [" & sFrom & "].[" & clm.Name & "]"     End If   Next   If (Len(sToTmp) > 0) Then     InsertSqlMakeFromTable = "INSERT INTO " & sTo & " (" & Mid(sToTmp, 3) & ") " & _                 "SELECT " & Mid(sFromTmp, 3) & " FROM " & sFrom & ";"   Else     InsertSqlMakeFromTable = ""   End If   Exit Function    ERR_HAND:   InsertSqlMakeFromTable = "" End Function

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

ちょっと見しかできてませんが、 複数選択のものを , カンマ区切りで作っておいて、処理前で配列に。 その配列を使って、テーブル名、ファイルバスを作ればよいのでは。 > Dim strSelected As String > strSelected = vbNullString > With lst_01 > For Each varData In .ItemsSelected > strSelected = strSelected & .ItemData(varData - 1) & " " > Next > End With ↓ Dim strSelected As String Dim vTmp As Variant Dim SubLsName As String strSelected = "" With lst_01   For Each varData In .ItemsSelected     strSelected = strSelected & "," & .ItemData(varData - 1) ' ★   Next End With vTmp = Split(Mid(strSelected,2),",") LsName = "\\St1\第2業務部\$運用\TESTkanno\" ITName = "T_Mas" For i = 0 To UBound(vTmp)   TName = vTmp(i)   SubLsName = LsName & TName & ".csv"   DoCmd.TransferText acImportDelim, teigi, ITName, SubLsName, True ・・・・・・・ Next ※ ★前の処理が正しいとして流用 ※ 従来の LsName 扱いは、使い回しができないように上書きされています。 LsName = LsName & TName & ".csv" ※ 後は細かく見れてません。がんばってください。

関連するQ&A

  • ACCESS VBA CSVのインポート ファイル名指定→ファイル名選択

    現在、テキストボックスにファイル名を入れるとCSVファイルがインポートされ、テキストボックスに入れたファイル名からACCESSのテーブルにFileNameの項目の追加、書き込み等ができるプログラムを作りました。 ですが、このプログラムを根本的に修正してほしいとの事で、困ってます。 テキストボックスにファイル名を入れるのではなく、指定のフォルダからファイル名を複数選択し、まとめてインポートしたいという事でした。 この場合だと、プログラム自体がまったく変わりますよね? FileNameの追加等は不可能ではないでしょうか? 現在のプログラムを記載しますので、どこを修正すればいいかアドバイスお願いします。 Private Sub Cmd_01_Click() Dim ercd As Integer Dim LsName As String Dim TName As String Dim ITName As String Dim Name1 As String Dim Name2 As String Dim teigi As String Dim SQL As String Dim aa As Long Dim mySQL As String Dim db As Database If Nz(Me.txt_01) = "" Then MsgBox "インポートするファイル名を入力して下さい", vbOKOnly, "エラー" Me.txt_01.SetFocus Exit Sub End If 'ファイル名の取得 strError = 0 LsName = "\\St1\第2業務部\$運用\1010030 アールジービー\業務\RGB一時作業ファイル\なるには不備チェック\TESTkanno\" TName = Me.txt_01 LsName = LsName & TName & ".csv" ITName = "T_Mas" 'インポートの確認 ret = MsgBox(TName & "をインポートしますか?", vbYesNo + vbQuestion, "インポート確認") If ret = vbNo Then Exit Sub End If Debug.Print LsName 'レコードの追加 teigi = "RGB定義" DoCmd.TransferText acImportDelim, teigi, ITName, LsName, True ret = MsgBox(TName & "をマスターに追加しますか?", vbYesNo + vbQuestion, "インポート確認") If ret = vbNo Then Exit Sub End If SQL = "INSERT INTO T_Mas (ID1,ID,処理状況,請求日,学校識別コード,学校名,学校分類名,メールアドレス,名前,ふりがな,性別,生年月日,職業,高校所在地,高校名,学年,郵便番号,都道府県,区市町村&町域,番地以下,電話番号,FileName,区分,不備,不備理由,yu,gid,保留,処理済,件数報告日,納品日 )" & _ " SELECT [" & TName & "].[ID1], [" & TName & "].[ID],[" & TName & "].[処理状況], [" & TName & "].[請求日]," & _ " [" & TName & "].[学校識別コード], [" & TName & "].[学校名], [" & TName & "].[学校分類名], [" & TName & "].[メールアドレス]," & _ " [" & TName & "].[名前], [" & TName & "].[ふりがな], [" & TName & "].[性別], [" & TName & "].[生年月日]," & _ " [" & TName & "].[職業], [" & TName & "].[高校所在地], [" & TName & "].[高校名], [" & TName & "].[学年]," & _ " [" & TName & "].[郵便番号], [" & TName & "].[都道府県], [" & TName & "].[区市町村&町域], [" & TName & "].[番地以下]," & _ " [" & TName & "].[電話番号], [" & TName & "].[FileName], [" & TName & "].[区分], [" & TName & "].[不備], [" & TName & "].[不備理由], [" & TName & "].[yu], [" & TName & "].[gid]," & _ " [" & TName & "].[保留], [" & TName & "].[処理済], [" & TName & "].[件数報告日],[" & TName & "].[納品日], From" & "LsName" Debug.Print SQL Name1 = TName & ".csv" Name2 = Left(TName, Len(TName) - 5) ret = MsgBox(Name1 & "を FileName、" & Name2 & "を 区分に追加しますか?", vbYesNo + vbQuestion, "インポート確認") Dim sql1 As String sql1 = "Update T_Mas SET FileName = '" & Name1 & "',区分 = '" & Name2 & "'" & " WHERE FileName Is Null AND 区分 Is Null" DoCmd.RunSQL sql1 End Sub

  • 更新クエリ 複数の抽出条件の書き方

    いつもアドバイスありがとうございます。 表題の通り、下記コード(一部)で更新クエリをかけてますが、 抽出条件として、「FileNameと区分が空白の場合」という抽出条件を付け加えたいです。 色々調べてみたのですが、 UPDATE句の続きに、「& "where File Name = "" & 区分 = "" "」 をつけたのですが、これをつけると何も更新されなくなってしまいます。 何かアドバイスがあればお願いします。 Name1 = TName & ".csv" Name2 = Left(TName, Len(TName) - 5) ret = MsgBox(Name1 & "をFileName ・ " & Name2 & "を区分に追加しますか?", vbYesNo + vbQuestion, "インポート確認") Dim sql1 As String sql1 = "Update T_Mas SET FileName = '" & Name1 & "',区分 = '" & Name2 & "'" DoCmd.RunSQL sql1

  • 更新クエリで変数は使えない?

    下記、コードの一部分です。 Name1をFileNameに、 Name2を区分に入れたいです。 メッセージボックスより、Name1・Name2に入れたい値が入っているのは確認できてますが、 実行させると、メッセージボックスが出た後、 パラメーターボックスが出てきて、Name1?Name2?と値を聞いてきます。 そこに、値を挿入すると更新はされるものの、パラメーターボックスで入力せず、それぞれに入っている値をそのまま入れたいです。 可能でしょうか? Name1 = TName & ".csv" Name2 = Left(TName, Len(TName) - 5) ret = MsgBox(Name1 & "をFileName ・ " & Name2 & "を区分に追加しますか?", vbYesNo + vbQuestion, "インポート確認") Dim sql1 As String sql1 = "Update T_Mas SET FileName = Name1,区分 = Name2 " DoCmd.RunSQL sql1

  • CSVファイルのインポート

    辞めた人のプログラムを書き換えています。 初心者なもので、あまりコードを理解しておりませんが、 一応できるところまで直してみました。 CSVファイルをアクセスにインポート、その後項目(FileName)を追加し、CSVのファイル名を追加した項目にいれたいです。 下記構文で、インポートまではできましたが 最後の方の dbs.Execute sql でエラーになります。 ここをクリアするにはどこを修正すればよろしいでしょうか? アクセスは2003です。 Private Sub Cmd_01_Click() Dim ercd As Integer Dim dbs As adodb.Connection Dim LsName As String Dim TName As String Dim Name1 As String Dim teigi As String Set dbs = CurrentProject.Connection If Nz(Me.txt_01) = "" Then MsgBox "インポートするファイル名を入力して下さい", vbOKOnly, "エラー" Me.txt_01.SetFocus Exit Sub End If 'ファイル名の取得 strError = 0 LsName = "\\St1\第2業務部\$運用\1010030 アールジービー\業務\RGB一時作業ファイル\なるには不備チェック\TESTkanno\" TName = Me.txt_01 LsName = LsName & TName & ".csv" 'インポートの確認 ret = MsgBox(TName & "をインポートしますか?", vbYesNo + vbQuestion, "インポート確認") If ret = vbNo Then Exit Sub End If Debug.Print LsName 'レコードの追加 teigi = "RGB定義" DoCmd.TransferText acImportDelim, teigi, TName, LsName, False, "" ret = MsgBox(TName & "をマスターに追加しますか?", vbYesNo + vbQuestion, "インポート確認") If ret = vbNo Then Exit Sub End If Call FileTuika End Sub Sub FileTuika() Dim sql As String Dim aa As Long sql = "INSERT INTO T_Mas (処理状況,請求日,学校識別コード,学校名,学校分類名,メールアドレス,名前,ふりがな,性別,生年月日,職業,高校所在地,高校名,学年,郵便番号,都道府県,区市町村&町域,番地以下,電話番号,FileName,区分,不備,不備理由,yu,gid,保留,処理済,件数報告日,納品日 )" & _ " SELECT [" & T_Mas & "].[処理状況], [" & T_Mas & "].[請求日]," & _ " [" & T_Mas & "].[学校識別コード], [" & T_Mas & "].[学校名], [" & T_Mas & "].[学校分類名], [" & T_Mas & "].[メールアドレス]," & _ " [" & T_Mas & "].[名前], [" & T_Mas & "].[ふりがな], [" & T_Mas & "].[性別], [" & T_Mas & "].[生年月日]," & _ " [" & T_Mas & "].[職業], [" & T_Mas & "].[高校所在地], [" & T_Mas & "].[高校名], [" & T_Mas & "].[学年]," & _ " [" & T_Mas & "].[郵便番号], [" & T_Mas & "].[都道府県], [" & T_Mas & "].[区市町村&町域], [" & T_Mas & "].[番地以下]," & _ " [" & T_Mas & "].[電話番号], '" & LsName & "'," & FileName & " From" & "LsName" Debug.Print sql dbs.Execute sql dbs.Close Set dbs = CurrentDb() With dbs For Each tdfa In .TableDefs If tdfa.Name = TName Then dbs.TableDefs.Delete tdfa.Name End If Next tdfa End With dbs.Close End Sub

  • AccessでCSVをインポートしたい(VBA)

    お世話になります。AccessVBA暦2週間の初心者です。 AccessでCSVをインポートできたらいいなと思い ↓下のサイトにあるVBAサンプルを参考にして以下のようにプログラミングをしました。 http://memo.bz/access/advance/csvinpsam Public Function SplitTest() On Error GoTo myError Dim dbs As Database Dim rst As Recordset Dim varData As Variant Dim lngFileNum As Long Dim strData As String Dim xSQL As String FileName = TestGetFileName '入力元CSVファイルを開く lngFileNum = FreeFile() Open FileName For Input As #lngFileNum 'テーブルを開く Set dbs = CurrentDb Set rst = dbs.OpenRecordset("Data") 'CSVファイルの全レコードを読み込むループ Do Until EOF(lngFileNum) 'CSVファイルより1件分を読み込み Line Input #lngFileNum, strData 'カンマで区切って配列に代入 varData = Split(strData, ",", , vbTextCompare) '各フィールドデータをテーブルに追加 With rst .AddNew ![Code1] = varData(0) ![Code2] = varData(1) ![TS] = varData(2) ![PM] = varData(3) ![金額] = varData(4) ![摘要] = varData(5) ![メモ] = varData(6) .Update End With Loop rst.Close Close #lngFileNum MsgBox "データの取り込みが終了しました" Exit Function myError: MsgBox "ファイル名を指定してください" End Function 'CSVファイル選択 Function TestGetFileName() 'ファイル選択 Const ENABLE_WIZHOOK = 51488399 Const DISABLE_WIZHOOK = 0 Dim strFile As String Dim intResult As Integer WizHook.Key = ENABLE_WIZHOOK ' WizHook 有効化 intResult = WizHook.GetFileName( _ 0, "", "", "", strFile, "", _ "すべてのファイル (*.*)|*.*", _ 0, 0, 0, True _ ) WizHook.Key = DISABLE_WIZHOOK ' WizHook 無効化 TestGetFileName = strFile End Function ダイアログは普通に開けるのですがインポートが出来ず「ファイル名を指定してください」 というメッセージボックスが出ます。 弄っている部分は ![フィールド1] = varData(0)を ![Code1] = varData(0)にしているぐらいです。 何が悪いのか皆目見当がつきません。 こんな初心者でございますがご教授のほどよろしくお願いします。 (ヒントでも構いません) 説明不足等ございましたらご指摘のほどよろしくお願いします。

  • 【VBA】【複数ファイル選択】困っています。

    23歳OLです。 会社でマクロを組みたいと思うのですが、 どうしてもエラーがでて困っています。 ご教示よろしくお願いします。 =========質問============= ▼やりたいこと。 ・複数ファイルを選択(いろんな種類のファイルを取り込みたいです。主にテキストとログとvファイルです) ・取り込んだデータを任意のシートの列に置きたいです。 (たとえば、シート1のA列に最初に~~~って名前がついているファイル。のように。) ・新しいシートを作りたくないです。 (あくまで任意のファイルにペーストする形です。) ・複数ファイルを選択→最初のファイルを開く→ファイルの中身を任意のシートの任意の列に最後までペーストする→ファイルを閉じて次のファイルにという形です。 現在こんな形で出来上がっています。 Sub ReadMultiCSVFiles() ' [[ 変数定義 ]] Dim varFileName As Variant Dim CSVWorkSheet As Worksheet Dim NewWorkSheet As Worksheet Dim SheetName As String ' [[ ファイルパスからファイル名を取得 ]] SheetName = Dir(Filename) ' [[ ファイル名で新しいシート作成 ]] Set NewWorkSheet = CreateWorkSheet(SheetName) ' [[ 複数ファイルパス名を取得 ]] varFileName = Application.GetOpenFilename(FileFilter:="(*.*),*.*", _ Title:="CSVファイルの選択", MultiSelect:=True) ' [[ ファイルパス取得できなかったら ]] If IsArray(varFileName) = False Then Exit Sub End If ' [[ ファイルパス取得できたら ]] For Each Filename In varFileName ' [[ CSVファイルを開く ]] Dim buf As String, n As Long Open varFileName For Input As #1 【ここにエラーが出ます。型が違うと出ます】 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop ' [[ CSVファイルを閉じる(保存無し) ]] ActiveWorkbook.Close SaveChanges:=False Next End Sub ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ' [[ ]] ' [[ ワークシート名を指定したワークシートの作成 ]] ' [[ ]] ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] Function CreateWorkSheet(WorkSheetName As String) As Worksheet ' 変数定義 Dim NewWorkSheet As Worksheet Dim iCheckSameName As Integer ' ワークシートの作成 ' ※一番最後に挿入 Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count)) ' 同じ名前ワークシートが無いか確認 iCheckSameName = 0 For Each WS In Sheets If WS.Name = WorkSheetName Then MsgBox "ワークシート名:" + WorkSheetName + " この名前は既に使われています。" iCheckSameName = 1 End If Next '同じ名前のワークシートがなければ If iCheckSameName = 0 Then NewWorkSheet.Name = WorkSheetName Set CreateWorkSheet = NewWorkSheet End If End Function =============================== ※いろんなサイトから切り貼りして試行錯誤してみています。 お力をいただけると嬉しいです。

  • アクセスでのテキストボックスの複数条件での抽出

    Private Sub 検索_Click() Dim strFilter1 As String Dim strFilter2 As String Dim strFilter3 As String strFilter1 = "学校名 = '" & 学校名1 & "'" strFilter2 = "学校区分 = '" & 学校区分1 & "'" strFilter3 = "キャンパス = '" & キャンパス1 & "'" Me.Filter = strFilter1 & " or " & strFilter2 & " or " & strFilter3 Me.FilterOn = True End Sub (1)学校名・(2)学校区分・(3)キャンパスと3つのテキストボックスがあり 3つの抽出条件を満たすレコードをフォームに表示させたいのですが 学校名を仮に早稲田大学といれ絞れるのですが次に学校区分を大学 と入れるとほか大学も抽出されてしまいます。 学校名を抽出させたら、その範囲で学校区分の大学を抽出させたいのですが どのようにすればいいのでしょうか? (1)のみの抽出の場合や(1)と(2)のみの 場合があるのでandの完全一致ではありません。

  • コンボボックスの設定と選択された値の取得方法

    現在、データベース「SQL Server 2005」とVB.NETで開発をしています。 コンボボックスの設定と選択された値の取り方について教えて下さい。 やりたいことは、下記の2点です。 (1)コンボボックスに「T部門テーブル」の部門コード、部門名をセットし、部門名のみを表示する。 (2)コンボボックスが選択された時の、部門コードと部門名の取得の仕方。 コンボボックスの設定は下記のように記述しました。(一応、動作確認をすると、部門名が表示されています。) この記述方法で質問の内容ができますでしょうか? よろしくお願いします。 '// 部門コンボボックスのリスト作成 Public Function fnc部門コンボ設定( _ ByRef nObject As Object, _ Optional ByVal nInsertEmptyItem As Boolean = False _ ) As Boolean Dim strSql As String Dim wCode, wValue As String ' cSqlConnection から SqlCommand のインスタンスを生成する Dim hCommand As System.Data.SqlClient.SqlCommand = cSqlConnection.CreateCommand() Try 'リストの再描画 nObject.BeginUpdate() 'リストをクリア nObject.Items.Clear() 'データ抽出 strSql = "select 部門コード, 部門名 from T部門テーブル order by 部門コード" '実行する SQL コマンドを設定する hCommand.CommandText = strSql '指定した SQL コマンドを実行して SqlDataReader を構築する Dim cReader As System.Data.SqlClient.SqlDataReader = hCommand.ExecuteReader() '次のレコードに進める (次のレコードがない場合は False になるため実行されない) While cReader.Read() '列名を元に値を取得する If IsDBNull(cReader("部門コード")) Then wCode = "" Else wCode = cReader("部門コード") End If If IsDBNull(cReader("部門名")) Then wValue = "" Else wValue = cReader("部門名") End If nObject.Items.Add(New clsItemData(wValue, wCode)) End While 'cReader を閉じる cReader.Close() 'リストの再描画を再開 nObject.EndUpdate() 'コンボボックスに部門名を表示する設定 nObject.DisplayMember = "部門名" '部門名に対応した部門コードを SelectdValue で取得する設定 nObject.ValueMember = "部門コード" Catch ex As Exception Call subError(ex, True, pLogLocal) Exit Function Finally nObject.EndUpdate() End Try 'リソースの解放 hCommand.Dispose() Return True End Function

  • ExcelでBookを開くPasswordにエラーを出さないには

    Sub Dim FileName As String FileName = "D:\集計表.xls" Dim Sheet_Name As String Dim Book_Name As String Workbooks.Open FileName:=FileName Sheet_Name = "Sheet1" Book_Name = ActiveWorkbook.Name Workbooks(Book_Name).Sheets(Sheet_Name).Select Range("A1").Select End Sub 上記の構文でBookを開く時に「Password」を要求して開くようにしています。 ただ、Passwordを間違えた時は「実行時エラー1004」とな、「デバック」するか「終了」するしかありません。 デバック」・「終了」をせずに再度Password入力に戻るにはどの様にすれば良いでしょうか。

  • VB.NETでのAccessテーブルリンク

    現在、VB.NET上で操作し、Accessのテーブルのリンクをしているのですが、 リンク処理の直後に、最後にテーブルのリンク処理をしたテーブルを 開こうとすると、 「要求された名前、または序数に対応する項目がコレクションで見つかりません。」という エラーが出ます。 なお、リンクしたテーブルには、きちんと正しいリンクで開こうとしたテーブルが登録されています。 それで、最後にリンクしたのが悪いのかと思い、順番を変えると、 そのエラーは起こらずに通常に起動しました。 ですが、順番を変えただけで普通に動く、というのが なんだか腑に落ちません。(まあ、無事に動いているのでいいのですが(汗 ) 以下にリンク処理を記載します。 何故、このようなことが起こるのかわかる方いらっしゃいましたら、ご教授お願い致します。 予想でもかまいません。 Public Sub DBLink() LFlag = False Dim rs As ADODB.Recordset = New ADODB.Recordset Dim Sql As String = String.Empty Dim dbPName As String = String.Empty Dim tName() As String 'リンク先のパスを指定 Dim f As New frmLinkPath f.ShowDialog() f.Close() f = Nothing 'パスを指定したか否か If LFlag Then 'TMPのパスは固定 dbPName = PathLast(Application.StartupPath) & "TMP.mdb" 'リンクするテーブル名を取得 'mdbLには、テーブル名がカンマ区切りで入っています tName = mdbL.Split(",") 'リンク先のテーブルを削除 For i = 0 To tName.Length - 1 Sql = "DROP TABLE " & tName(i) rs.Open(Sql, cn) Call SLink(tName(i), dbPName) Next dbPName = PathLast(DBPath) & "MST.mdb" 'リンクするテーブル名を取得 tName = mdbS.Split(",") 'リンク先のテーブルを削除 For i = 0 To tName.Length - 1 Sql = "DROP TABLE " & tName(i) rs.Open(Sql, cn) Call SLink(tName(i), dbPName) Next Else MsgBox("リンク先が指定されなかったので、" & vbCrLf & "テーブルの再リンクをキャンセルします", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "") End If End Sub ''' <summary> ''' データベース再リンク ''' </summary> ''' <param name="psNm">リンクするテーブル名</param> ''' <param name="psMdb">リンク元データベース名</param> ''' <remarks></remarks> Public Sub SLink(ByVal psNm As String, ByVal psMdb As String) Try Dim lodDb As dao.Database Dim ltDef As dao.TableDef Dim lsSource As String Dim lsTarget As String Dim daoE As New dao.DBEngine 'リンク先データベースとリンクデータベース名を指定 lsSource = psMdb lsTarget = PathLast(Application.StartupPath) & "DATA.mdb" '既存のデータベースの場合は OpenDatabase を使用する) lodDb = daoE.OpenDatabase(lsTarget) '任意の名前でテーブル定義を作成する ltDef = lodDb.CreateTableDef(psNm) 'リンク先のテーブル名を指定する ltDef.SourceTableName = psNm 'リンク先のデータベースを指定する(対象がMDBの場合セミコロンの前は省略) ltDef.Connect = ";Database=" & lsSource '定義したテーブルをアペンド(追加)する lodDb.TableDefs.Append(ltDef) lodDb.Close() lodDb = Nothing Catch ex As Exception Debug.Print(ex.Message) 'Throw End Try End Sub