• 締切済み

VBAの解読依頼です。

Windows2000、Access2000です。あるホームページよりVBAをコピーしました。内容としては起動時のShift+Enterを許すか否かというものです。 Function ChangeProperty(strPropName As String, varPropType , varPropValue) As Integer On Error GoTo エラー Dim dbs As Database, prp As Property Const conPropNotFoundError = 3270 Set dbs = CurrentDb dbs.Properties(strPropName) = varPropValue ChangeProperty = True Exit Function エラー: If Err = conPropNotFoundError Then Set prp = dbs.CreateProperty(strPropName,varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ChangeProperty = False Exit Function End If End Function Function NoShiftKey() Dim msg1 As String Dim msg2 As String msg1 = "有効" msg2 = "無効" Select Case InputBox("パスワード") Case 1234'パスワード ChangeProperty "AllowBypassKey", dbBoolean, True MsgBox msg1 Case 0 ChangeProperty "AllowBypassKey", dbBoolean, False MsgBox msg2 Case Else ChangeProperty "AllowBypassKey", dbBoolean, False MsgBox msg2 End Select End Function これをコマンドボタンクリック時のイベントにします。(参照設定にてDAO3.6にチェックをいれました。) しかし、「dbs.Properties(strPropName) = varPropValue」の一文で「プロパティが見つかりません。」と出ます。そこで、このVBAを解読して頂ける方、どこをどう直すべきなのか、是非ご教授ください。 よろしくお願いします。

noname#12495
noname#12495

みんなの回答

noname#7749
noname#7749
回答No.2

この書き方で問題ありません。 敢えてケチを付けるとすれば、 (1) 関数のスコープが省略されている。(暗黙でPublicとなる) (2) 引数のByVal / ByRef が省略されている。(暗黙でByRefとなる) (3) Database型のクラス名が省略されている。(識別子が一意であれば問題なし) (4) 定数の型が省略されている。(望ましい記述スタイルではないが、特に問題なし) (5) ラベル名にマルチバイト文字が使用されている。(望ましくないが、機種依存文字、記号、特殊文字以外は、特に問題なし) (6) MsgBox関数の第2、3引数が省略されている。(規定値での動作となるため、特に問題なし) (7) InputBoxによるインターフェイスはユーザーフレンドリではなく、望ましくない。 (8) InputBoxがキャンセルされた場合の例外処理が記述されていない。 といったところでしょうか? エラー処理が機能しないのはコードが原因ではなく、プロジェクトの設定でエラーとラップのオプションが[エラー発生時に中断]に設定されているからです。 ところで、ご自分の実力に余るソースコードをどうしようというのでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>あるホームページより どのホームページ?

関連するQ&A

  • access シフトキー無効

    質問させていただきます。 コマンドボタンでシフトキーの有効無効を設定します。 パスワードを入れ、正しければ有効、間違っていれば無効となるようにしたいのですが、逆になっています。正しいパスワードを入れるとシフトキーが無効となります。間違っているパスワードを入れるとシフトキーが有効となります。 訂正の仕方をご教授お願いします。 functionプロシージャに以下 Function NoShiftKey() Dim strMsg1 As String Dim strMsg2 As String strMsg1 = "再起動の後、Shiftキィーが有効になります。" strMsg2 = "再起動の後、Shiftキィーが無効になります。" Select Case InputBox("MAGI解除します") ' --- A Case 1234 ' --- B ChangeProperty "AllowBypassKey", dbBoolean, False ' --- C MsgBox strMsg2 Case Else ChangeProperty "AllowBypassKey", dbBoolean, True ' --- D MsgBox strMsg1 End Select End Function Function ChangeProperty(strPropName As String, _ varPropType, varPropValue) As Integer ' --- A On Error GoTo エラー Dim dbs As Database Dim prp As Property Const conPropNotFoundError = 3270 Set dbs = CurrentDb dbs.Properties(strPropName) = varPropValue ChangeProperty = True Exit Function エラー: If Err = conPropNotFoundError Then Set prp = dbs.CreateProperty(strPropName, _ varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ChangeProperty = False Exit Function End If End Function ----------------------------------------------------------- コマンドボタンのクリック時に以下 Private Sub コマンド52_Click() Call NoShiftKey ' --- A End Sub ----------------------------------------------------------------

  • 起動時シフトキーを無効にして、作成したmdbのセキュリテーを高める方法について

    以下のコードは、次回起動時シフトキーを無効にする方法らしいのですが、★印のところで、型が一致しませんとエラーが出てしまいます。 どうしてでしょか?対応方法を教えてください。 Function NoShiftKey()   ChangeProperty "AllowBypassKey", dbBoolean, False End Function Function ChangeProperty(strPropName As String, varPropType, varPropValue) As Integer On Error GoTo エラー   Dim dbs As Database, prp As Property   Const conPropNotFoundError = 3270   Set dbs = CurrentDb   dbs.Properties(strPropName) = varPropValue   ChangeProperty = True   Exit Function エラー:   If Err = conPropNotFoundError Then     Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue) '★この行でエラーがでます。     dbs.Properties.Append prp     Resume Next   Else     ChangeProperty = False     Exit Function   End If End Function

  • VBAでFunctionの使い方

    エクセルのVBAでFunctionの使い方がいまいちよくわかりません。 Function msg() Dim h As Integer h = Hour(Time) Select Case h Case Is < 12: msg = "おはようございます。" Case Is < 17: msg = "こんにちは。" Case Else: msg = "こんばんは。" End Select End Function Sub 挨拶() MsgBox msg End Sub とやってみたら一応正しく動くようですが、これであっているのでしょうか? 他の例などを見るとFunction msg()の()内にも何か入れなければならないようなのですが、わかりません。

  • VBA初心者なのですが(Userformについて)

    まずは質問ご覧いただきありがとうございますm(_ _)m さっそくなのですが、次のプログラムを打つとSelect Caseのところで”指定されたオブジェクトは見つかりません”と出てしまうのですがなぜでしょうか。回答お待ちしております。 Private Sub CommandButton2_Click() Dim msg As String, i As Integer Dim ii As Integer, msg2 As String For i = 1 To 3 If Controls("CheckBox" & i).Value = True Then msg = msg & Controls("CheckBox" & i).Caption & vbCrLf End If Next i For ii = i To 2 If Controls("OptionBotton" & i).Value = True Then msg2 = msg2 & Controls("OptionBottob" & i).Caption & vbCrLf End If Next ii Select Case Controls("CheckBox" & i).Value & Controls("OptionBotton" & i).Value Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = False MsgBox msg & "がチェックされてます" Case Controls("CheckBox" & i).Value = False & Controls("OptionBotton" & i).Value = True MsgBox msg2 & "オン" Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = True MsgBox msg & "がチェックされています" & vbCrLf & msg2 & "オン" Case Else MsgBox "チェック又は、オンにしてください" End Select End Sub

  • アクセスのVBAでテキストデータのリンクを更新したいのですが

    コードは以下ですが、リンクの更新がうまくいかず更新されずに終了 してしまいます。 Function RefreshLinks(strFileName As String) As Boolean '指定されたデータベースへのリンクを更新します。更新に成功した場合は、True を返します。 Dim dbs As Database Dim intCount As Integer Dim tdf As TableDef 'データベースの全てのテーブルをループします。 Set dbs = CurrentDb For intCount = 0 To dbs.TableDefs.Count - 1 Set tdf = dbs.TableDefs(intCount) 'tdf.connectがある場合、それはリンクテーブルです。 If Len(tdf.Connect) > 0 Then tdf.Connect = "text;databese=" & strFileName Err = 0 On Error Resume Next tdf.RefreshLink 'テーブルのリンクを更新します。 If Err <> 0 Then RefreshLinks = False Exit Function End If End If Next intCount RefreshLinks = True 'リンクの更新が完了しました。 End Function

  • Access csvファイルの取り込み

    Access2021 2箇所の保存先の違う所からcsvファイルの取り込みについて伺います。 csv取り込みボタンは、2つ用意しています。 1つ目のボタンに、コード記述して動作確認は正常に動作して他のボタンも正常に動作。 2つ目にのボタンに、csvの格納パス名のみ変更後コード記述して動作確認したら全てのボタンが反応しなくなりました。 動作としては、削除クエリでテーブルのデータを削除してから、指定したフォルダからcsvファイルを選択して取り込ます。 同じテーブルを使用して、格納先の違うcsvファイルを使用する操作になります。 コードは、以下の通りです。 ①ボタン1 Private Sub コマンド61_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名①" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ②ボタン2 Private Sub コマンド62_Click() '削除クエリ実行 DoCmd.SetWarnings False DoCmd.OpenQuery "テーブルデータ削除" DoCmd.SetWarnings True Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub On Error GoTo err_sample DoCmd.TransferText acImportDelim, , "インポート先テーブル名", msg, True MsgBox "インポートが終了しました。", vbInformation + vbOKOnly, "処理完了" Exit Sub err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") '2003以降 Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "csvインポートデータのフォルダパス名②" fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "すべてのファイル", "*.*" fDlg.Filters.Add "CSV ファイル (*.csv)", "*.csv" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" Me.Refresh End Function ご教授の程、宜しくお願い致します。

  • VBAのキャンセル処理

    下記のVBAでファイルを出力することはできるようになったのですが、 出力するときに[キャンセル]を押しても"MsgBox :Excelファイルへの出力が完了しました。"が表示されてしまいます。 「キャンセル」した場合は、このメッセージが表示されないようにできないでしょうか? Private Sub Image_Export_Click() On Error GoTo Err_FileDialog_Click 'ファイル出力 Dim strFileName As String Dim ExpFileName As String ExpFileName = "T_master_" & Format(Now(), "yyyymmdd") strFileName = GetFileName(False, "MicrosoftExcel ブック (*.xls)|*.xls", "", ExpFileName & ".xls") If Len(strFileName) = 0 Then 'キャンセルボタンが押されたときの処理を記述 MsgBox "キャンセルが押されました。" Else DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "T_master", strFileName & ".xls", True End If MsgBox "Excelファイルへの出力が完了しました。", , "出力完了" Exit_FileDialog_Click: Exit Sub Err_FileDialog_Click: MsgBox "予期せぬエラーが発生しました" & Chr(13) & _ "エラーナンバー:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbOKOnly End Resume Exit_FileDialog_Click End Sub

  • access vba 構文の解読

    access vba 構文の解読 はじめまして先ほどaccess2003について質問させていただいたものです。以下の構文が先ほどの続きです。こちらも皆様のお力で構文を解読していただけないでしょうか。 すみません解読とは、構文の一行一行が何を示しているのか教えていただけると助かります。 よろしくお願いいたします。 ' Exit the application. Case conCmdExitApplication CloseCurrentDatabase ' Run a macro. Case conCmdRunMacro DoCmd.RunMacro rs![Argument] ' Run code. Case conCmdRunCode Application.Run rs![Argument] ' Open a Data Access Page Case conCmdOpenPage DoCmd.OpenDataAccessPage rs![Argument] ' Any other command is unrecognized. Case Else MsgBox "不明なオプションです。" End Select ' Close the recordset and the database. rs.Close HandleButtonClick_Exit: On Error Resume Next Set rs = Nothing Set con = Nothing Exit Function HandleButtonClick_Err: ' If the action was cancelled by the user for ' some reason, don't display an error message. ' Instead, resume on the next line. If (Err = conErrDoCmdCancelled) Then Resume Next Else MsgBox "コマンド実行中のエラーです。", vbCritical Resume HandleButtonClick_Exit End If End Function Private Sub メニュー終了_Click() On Error GoTo Err_メニュー終了_Click DoCmd.Close Exit_メニュー終了_Click: Exit Sub Err_メニュー終了_Click: MsgBox Err.Description Resume Exit_メニュー終了_Click End Sub Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Quit Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub

  • VBAを使って名前をつけて保存をしたい(3)

    Sub 名前を付けて保存()   Dim wSeq  As String   Dim wStr  As String   Dim Flnm  As String   Dim wFlnm  As String   Dim sI   As Integer   Dim eI   As Integer   Dim wDir  As String   Dim ER   As Boolean   '   Sheets("データー").Select   Range("C3").Select   ActiveWorkbook.Save      wDir = "\\Jooo\センタ\AA\CC\"   Flnm = wDir & Format(Date, "【mmdd】") & ".xls"   wFlnm = Flnm   If Flnm = "False" Then     Exit Sub   End If   '   wSeq = 0   wSeq = Get_Seq(wDir, ER)   If ER Then     wStr = ""   Else     wStr = "(" & wSeq & ")"   End If   Flnm = Left(wFlnm, Len(wFlnm) - 4) & wStr & ".xls"   ActiveWorkbook.SaveAs Filename:=Flnm   Call Put_Seq(wDir, wSeq) End Sub '連番取得 Function Get_Seq(wDir As String, ER As Boolean) As Integer   Dim n As Long   Dim Seq As Integer   '   ER = False   Seq = 0   On Error GoTo ExitER   n = FreeFile   Open wDir & "連番.dat" For Input As #n   Input #n, Seq   Close #n   Get_Seq = Seq + 1   Exit Function ExitER:   ER = True   Seq = 1   On Error GoTo 0 End Function '連番保存 Function Put_Seq(wDir As String, wSeq As String)   Dim n As Long   n = FreeFile   Open wDir & "連番.dat" For Output As #n   Print #n, wSeq   Close #n End Function 先日回答者の方から上記を教えてもらったんですが、実行すると指定したフォルダに本日の日付+連番の名称でどんどん保存されるんですが (例:一回目実行→【1028】,二回目実行→【1028】(1),三回目実行→【1028】(2),四回目実行→【1029】(3),五回目実行→【1029】(4),※四回目以降は明日に実行した場合です),日付が変わった場合連番を最初からカウントするようにしたいのですが(例の【1029】(3)を【1029】に,【1029】(4)を【1029】(1)というふうに)どの様に上記を変更したらいいでしょうか?

  • Excelを更新するADOの書き方を教えて下さい。

      .Provider = "MSDASQL"   cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & ";" & _               "ReadOnly=False;"   If isHeader Then     .Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"   Else     .Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"   End If   .Open   .Execute strSQL という書き方では、動作します。また、"Microsoft.ACE.OLEDB.12.0;"バージョンでも   cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDB & ";"   With cnn      .Errors.Clear      .BeginTrans      .Execute strSQL      .CommitTrans   End With という書き方で、Access の mdb は更新できます。エクセルのシートを Recordset としてオープンすれば、下記の接続設定でも読むことは出来ます。非同期を指定すれば、エラーは回避できますがシートは更新されていません。当方、VBAを書くのは1996年以来。なんとか、この問題を解決して一区切りを付けたいと思っています。宜しく、ご協力の程お願いしておきます。 Public Function SQLExecute(ByVal strSQL As String, _               Optional xlFileName As String = "", _               Optional isHeader As Boolean = True) As Boolean On Error GoTo Err_SQLExecute   Dim isOK As Boolean   Dim DataValue   Dim cnn As ADODB.Connection     isOK = True   Set cnn = New ADODB.Connection   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "Microsoft.ACE.OLEDB.12.0;"     If isHeader Then       .Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"     Else       .Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"     End If     .Open xlFileName     .Errors.Clear     .BeginTrans     .Execute strSQL     .CommitTrans   End With Exit_SQLExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   SQLExecute = isOK   Exit Function Err_SQLExecute:   isOK = False   If cnn.Errors.Count > 0 Then     ErrMessage cnn.Errors(0), strSQL     cnn.RollbackTrans   Else     MsgBox "プログラムエラーが発生しました。" & _         "システム管理者に報告して下さい。(SQLExecute)", _         vbExclamation, " 関数エラーメッセージ"   End If   Resume Exit_SQLExecute End Function

専門家に質問してみよう