ExcelVBAの事を知ろう。 |
|
|
2022年9月現在、尚需要が高いExcelVBA。 |
|
コードを組める様になるととても楽しいです。 |
記述の方法は色々なサイトがあるので、ここでは割愛します。 |
実業務で使用するであろうAccessSQLとExcelVBAの連携だけ簡単に記述します。 |
|
ExcelVBAでマスタ更新系のプログラムを描くには……… |
@画面描写更新停止 |
ADB接続 |
BSQL文の記述 |
CDB接続破棄 |
D画面描写更新復帰 |
の順番で記述する事になります。 |
|
接続の記述は、下記の通りになります。 |
|
Option Explicit |
|
Public dbCon As Object |
Public dbRes As Object |
Const cnsADO_CONNECT1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" |
Const cnsADO_CONNECT2 = "\学習用Access.accdb;" |
' 上記のcnsADO_CONNECT2にはAccessファイル名を記述する。 |
|
#If VBA7 Then |
' ■iniファイル読込み(API:String) |
Private Declare PtrSafe Function GetPrivateProfileString _ |
Lib "KERNEL32.dll" Alias "GetPrivateProfileStringA" _ |
(ByVal lpApplicationName As String, _ |
ByVal lpKeyName As String, _ |
ByVal lpDefault As String, _ |
ByVal lpReturnedString As String, _ |
ByVal nSize As LongPtr, _ |
ByVal lpFileName As String) As LongPtr |
'--------------------------------------------------------------------------------------------------- |
' ■iniファイル書き込み(API:String) |
Private Declare PtrSafe Function WritePrivateProfileString _ |
Lib "KERNEL32.dll" Alias "WritePrivateProfileStringA" _ |
(ByVal lpApplicationName As String, _ |
ByVal lpKeyName As String, _ |
ByVal lpString As Any, _ |
ByVal lpFileName As String) As LongPtr |
#Else |
' ■iniファイル読込み(API:String) |
Private Declare Function GetPrivateProfileString _ |
Lib "KERNEL32.dll" Alias "GetPrivateProfileStringA" _ |
(ByVal lpApplicationName As String, _ |
ByVal lpKeyName As String, _ |
ByVal lpDefault As String, _ |
ByVal lpReturnedString As String, _ |
ByVal nSize As LongPtr, _ |
ByVal lpFileName As String) As LongPtr |
'--------------------------------------------------------------------------------------------------- |
' ■iniファイル書き込み(API:String) |
Private Declare Function WritePrivateProfileString _ |
Lib "KERNEL32.dll" Alias "WritePrivateProfileStringA" _ |
(ByVal lpApplicationName As String, _ |
ByVal lpKeyName As String, _ |
ByVal lpString As Any, _ |
ByVal lpFileName As String) As LongPtr |
#End If |
|
|
'******************************************************************************* |
' DB接続 |
'******************************************************************************* |
Private Sub ACS_DB_OPEN(Optional dbRes As Object) |
Dim strDB_Path As String, strMSG As String |
Dim swERR As LongPtr |
|
swERR = 1 |
On Error GoTo ERR1 |
' 接続を確立する |
Set dbCon = CreateObject("ADODB.Connection") |
strDB_Path = ACS_GET_INI_String("F-1", "DBPATH", ThisWorkbook.Path, _ |
ThisWorkbook.Path & "\F-1.ini") |
dbCon.Open cnsADO_CONNECT1 & strDB_Path & cnsADO_CONNECT2 |
Set dbRes = CreateObject("ADODB.Recordset") |
Exit Sub |
ERR1: |
strMSG = Err.Number & " " & Err.Description |
MsgBox "データベースに接続できませんでした。" & vbCr & strMSG |
ThisWorkbook.Saved = True |
If Workbooks.Count <= 1 Then Application.Quit |
ThisWorkbook.Close False |
End Sub |
|
'******************************************************************************* |
' INIファイルの読み込み |
'******************************************************************************* |
Private Function ACS_GET_INI_String(strGroup As String, _ |
strKoumoku As String, _ |
strDefault As String, _ |
strFileName As String) As String |
Dim Str As String * 1024 |
Dim lngLngs As Long |
|
On Error GoTo INI_String_ERR |
If GetPrivateProfileString(strGroup, strKoumoku, strDefault, Str, _ |
1024, strFileName) <> 0 Then |
lngLngs = InStr(Str, Chr(0)) |
ACS_GET_INI_String = Trim(Left(Str, (lngLngs - 1))) |
Else |
GoTo INI_String_ERR |
End If |
Exit Function |
|
INI_String_ERR: |
ACS_GET_INI_String = strDefault |
End Function |
|
'******************************************************************************* |
' 画面描画更新停止 |
'******************************************************************************* |
Private Sub ACS_StopSCUPD() |
With Application |
.ScreenUpdating = False |
.Calculation = xlCalculationManual |
.Cursor = xlWait |
.EnableEvents = False |
End With |
End Sub |
|
'******************************************************************************* |
' 画面描画更新復帰 |
'******************************************************************************* |
Private Sub ACS_StartSCUPD() |
With Application |
If .Calculation <> xlCalculationAutomatic Then |
.Calculation = xlCalculationAutomatic |
End If |
.Cursor = xlDefault |
.EnableCancelKey = xlInterrupt |
.EnableEvents = True |
.Interactive = True |
.StatusBar = False |
.ScreenUpdating = True |
End With |
End Sub |
|
'******************************************************************************* |
' DB接続破棄 |
'******************************************************************************* |
Public Function ACS_DB_CLOSE(Optional dbRes As Object) As String |
On Error Resume Next |
If Not dbRes Is Nothing Then |
dbRes.Close |
End If |
Set dbRes = Nothing |
dbCon.Close |
Set dbCon = Nothing |
End Function |
|
'******************************************************************************* |
' マスタメンテ本番 |
'******************************************************************************* |
Sub ACS_START() |
ThisWorkbook.Worksheets("実行").Activate |
If MsgBox("DBを接続しますか?", vbYesNo) <> vbYes Then |
Exit Sub |
End If |
Application.DisplayAlerts = False |
' 画面描画更新停止 |
Call ACS_StopSCUPD |
|
' DB接続 |
Call ACS_DB_OPEN(dbRes) |
|
'ここにSQL文を描きます。 |
|
' DB接続破棄 |
Call ACS_DB_CLOSE(dbRes) |
' 画面描画更新復帰 |
Call ACS_StartSCUPD |
ThisWorkbook.Worksheets("実行").Activate |
ThisWorkbook.Save |
Application.DisplayAlerts = True |
Application.Cursor = xlDefault |
MsgBox "処理が完了しました。" |
End Sub |
|
記述終了。 |
|
下の方にあるマスタメンテ本番以外は、ほぼ変えなくても大丈夫です。 |
Activeにしたいワークシート名及びシステムに沿ったSQLを記述して下さい。 |
|
以下の動画の様なゲームを簡単に作成出来たら初級はクリヤーでしょう。 |
|
|
|
|