「SQL Server Express と ADO、Excel と VBA を使って課題管理表を作ってみよう」を複数プロジェクトで使えるようにプログラムを改造しましたのでそのポイントを解説します。
コンテンツ
ダウンロード
以下のリンクでファイルをプログラム公開します。
SqlExcelKadaiKanrihyouP.zip
zipファイルの中に「SQL-Excel課題管理表P.xlsm」が入っています。
データベース
以下の2つのテーブルを使います。
プロジェクト管理用テーブル (T_プロジェクト)
CREATE TABLE [dbo].[T_プロジェクト]( [プロジェクトID] [int] IDENTITY(1,1) NOT NULL, [プロジェクト名称] [nvarchar](50) NULL, [登録者所属] [nvarchar](50) NULL, [登録者氏名] [nvarchar](50) NULL, [登録日] [date] NULL, [完了予定日] [date] NULL, [完了日] [date] NULL, [削除フラグ] [nvarchar](1) NULL )
課題管理用テーブル (T_課題管理表P)
CREATE TABLE [dbo].[T_課題管理表P]( [ID] [int] IDENTITY(1,1) NOT NULL, [プロジェクトID] [int] NOT NULL, [No] [int] NOT NULL, [分類] [nvarchar](50) NULL, [課題] [nvarchar](max) NULL, [対応進捗] [nvarchar](max) NULL, [担当者] [nvarchar](50) NULL, [責任者] [nvarchar](50) NULL, [更新日] [date] NULL, [完了予定日] [date] NULL, [完了日] [date] NULL, [削除フラグ] [nvarchar](1) NULL, [更新時間] [datetime] NULL )
VBAのポイントとプログラム
シートを複数使いますので定数としてワークシート名を宣言する等がポイントになります。
共通部分
Option Explicit
' ワークシート名
Public Const TXT_WS1 As String = "プロジェクト管理"
Public Const TXT_WS2 As String = "課題管理表"
Public ADO_CN As Object ' コネクションオブジェクト
Public WS1 As Worksheet 'シート「プロジェクト管理」
Public WS2 As Worksheet 'シート「課題管理表」
Public Sub connect() ' データベース接続
' 変数宣言
Dim TXT_CN As String ' 接続文
' 接続文(/*** ここを環境に合わせて修正して下さい ***/)
TXT_CN = "Provider=SQLOLEDB" 'SQL Server
TXT_CN = TXT_CN & "; Data Source=.\SQLEXPRESS" '接続先の設定
TXT_CN = TXT_CN & "; Initial Catalog=test_db" '接続するデータベース
TXT_CN = TXT_CN & "; User ID=test_user" 'ログインID
TXT_CN = TXT_CN & "; Password=test_password" 'ログインパスワード
' ADOコネクションオブジェクトを作成
Set ADO_CN = CreateObject("ADODB.Connection")
' データベース接続
ADO_CN.Open TXT_CN
End Sub
Public Sub disconnect() ' データベース切断
' 接続解除
ADO_CN.Close
Set ADO_CN = Nothing
End Sub
プロジェクト管理
プロジェクト設定
管理対象のプロジェクトIDを設定する
Sub プロジェクト対象設定()
' 変数宣言
Dim i1, i2, i3 As Long 'カウンタ
Dim ADO_RS As Object 'レコードセットオブジェクト
Dim TXT_SQ As String 'SQL文
' 初期値設定
Set WS1 = Sheets(TXT_WS1) 'ワークシート設定
' 入力データチェック
If Not IsNumeric(WS1.Cells(3, 3).Value) Then '管理番号が数値じゃ無かったらエラー
Call disconnect
MsgBox "管理番号が異常です"
Cells(3, 3).Select
Exit Sub
End If
' 過去データ削除処理
WS1.Range("C4").ClearContents
WS1.Range("C8:C14").ClearContents
' データベース処理
TXT_SQ = "SELECT * FROM T_プロジェクト WHERE (プロジェクトID=" & WS1.Cells(3, 3).Value & " And 削除フラグ = ' ');"
Call connect 'データベース接続
Set ADO_RS = CreateObject("ADODB.Recordset")
ADO_RS.Open TXT_SQ, ADO_CN
If ADO_RS.EOF Then
MsgBox "対象のプロジェクトIDが存在しません"
WS1.Cells(3, 3).Select
Call disconnect 'データベース接続解除
Exit Sub
Else
WS1.Range("C4").Value = ADO_RS("プロジェクト名称")
WS1.Range("C8").Value = ADO_RS("プロジェクト名称")
WS1.Range("C9").Value = ADO_RS("登録者所属")
WS1.Range("C10").Value = ADO_RS("登録者氏名")
If IsNull(ADO_RS("登録日")) Then
WS1.Range("C11").Value = ""
Else
WS1.Range("C11").Value = CDate(ADO_RS("登録日"))
End If
If IsNull(ADO_RS("完了予定日")) Then
WS1.Range("C12").Value = ""
Else
WS1.Range("C12").Value = CDate(ADO_RS("完了予定日"))
End If
If IsNull(ADO_RS("完了日")) Then
WS1.Range("C13").Value = ""
Else
WS1.Range("C13").Value = CDate(ADO_RS("完了日"))
End If
End If
Call disconnect 'データベース接続解除
MsgBox "設定が完了しました。"
WS1.Cells(1, 1).Select
End Sub
プロジェクト一覧取得
Sub プロジェクト一覧取得()
' 変数宣言
Dim i1, i2, i3 As Long 'カウンタ
Dim ADO_RS As Object 'レコードセットオブジェクト
Dim TXT_SQ As String 'SQL文
' 初期値設定
Set WS1 = Sheets(TXT_WS1) 'ワークシート設定
' 過去データ削除処理
i2 = WS1.Cells(WS1.Cells.Rows.Count, 2).End(xlUp).Row 'B列最終行
If i2 > 20 Then
Rows("20:" & i2).Select
Selection.Delete Shift:=xlUp 'データ削除
End If
' データベース処理
TXT_SQ = "SELECT * FROM T_プロジェクト WHERE 削除フラグ = ' ' ORDER BY プロジェクトID;"
Call connect 'データベース接続
Set ADO_RS = CreateObject("ADODB.Recordset")
ADO_RS.Open TXT_SQ, ADO_CN
i1 = 20
Do Until ADO_RS.EOF
Cells(i1, 2).Value = ADO_RS("プロジェクトID")
Cells(i1, 3).Value = ADO_RS("プロジェクト名称")
Cells(i1, 4).Value = ADO_RS("登録者所属")
Cells(i1, 5).Value = ADO_RS("登録者氏名")
If IsNull(ADO_RS("登録日")) Then
Cells(i1, 6).Value = ""
Else
Cells(i1, 6).Value = CDate(ADO_RS("登録日"))
End If
If IsNull(ADO_RS("完了予定日")) Then
Cells(i1, 7).Value = ""
Else
Cells(i1, 7).Value = CDate(ADO_RS("完了予定日"))
End If
If IsNull(ADO_RS("完了日")) Then
Cells(i1, 8).Value = ""
Else
Cells(i1, 8).Value = CDate(ADO_RS("完了日"))
End If
i1 = i1 + 1
ADO_RS.MoveNext
Loop
ADO_RS.Close
Set ADO_RS = Nothing
Call disconnect 'データベース接続解除
MsgBox "検索が完了しました。"
' 罫線を引く
i2 = Cells(Cells.Rows.Count, 2).End(xlUp).Row 'B列最終行
Range("B19:H" & i2).Borders.LineStyle = True
' セル折り返し処理
Range("C20:E" & i2 + 5).Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
' 終了日<>"" でグレーアウト
For i1 = 20 To i2
If Cells(i1, 8).Value <> "" Then
Range("B" & i1 & ":H" & i1).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.249977111117893
.PatternTintAndShade = 0
End With
End If
Next
WS1.Cells(1, 1).Select
End Sub
プロジェクト情報更新
Sub プロジェクト情報更新_Click()
' 変数宣言
Dim i1, i2, i3 As Long 'カウンタ
Dim ADO_RS As Object 'レコードセットオブジェクト
Dim TXT_SQ As String 'SQL文
' 初期値設定
Set WS1 = Sheets(TXT_WS1) 'ワークシート設定
' 必須入力項目チェック
If WS1.Cells(14, 3).Value = "" Then
MsgBox "処理内容が指定されていません"
WS1.Cells(14, 3).Select
Exit Sub
ElseIf WS1.Cells(8, 3).Value = "" Then
MsgBox "プロジェクト名称が指定されていません"
WS1.Cells(8, 3).Select
Exit Sub
ElseIf WS1.Cells(9, 3).Value = "" Then
MsgBox "登録者所属が指定されていません"
WS1.Cells(9, 3).Select
Exit Sub
ElseIf WS1.Cells(10, 3).Value = "" Then
MsgBox "登録者氏名が指定されていません"
WS1.Cells(10, 3).Select
Exit Sub
ElseIf WS1.Cells(11, 3).Value <> "" And (Not IsDate(WS1.Cells(11, 3).Value)) Then
MsgBox "登録日が日付型として認識できません"
WS1.Cells(11, 3).Select
Exit Sub
ElseIf WS1.Cells(12, 3).Value = "" Then
MsgBox "完了予定日が指定されていません"
WS1.Cells(12, 3).Select
Exit Sub
ElseIf Not IsDate(WS1.Cells(12, 3).Value) Then
MsgBox "完了予定日が日付型として認識できません"
WS1.Cells(12, 3).Select
Exit Sub
ElseIf WS1.Cells(13, 3).Value <> "" And (Not IsDate(WS1.Cells(13, 3).Value)) Then
MsgBox "完了日が日付型として認識できません"
WS1.Cells(13, 3).Select
Exit Sub
End If
' データ処理
Call connect 'データベース接続
' バッチ = 「登録」
If WS1.Cells(14, 3).Value = "登録" Then '処理内容が「追加」だったら処理実行
' 登録日チェック
If WS1.Cells(11, 3).Value = "" Then
WS1.Cells(11, 3).Value = Date
End If
' データ追加処理
Set ADO_RS = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成
With ADO_RS
.Open "T_プロジェクト", ADO_CN, adOpenDynamic, adLockOptimistic, adCmdTable
.AddNew
!プロジェクト名称 = WS1.Cells(8, 3).Value
!登録者所属 = WS1.Cells(9, 3).Value
!登録者氏名 = WS1.Cells(10, 3).Value
!登録日 = WS1.Cells(11, 3).Value
!完了予定日 = WS1.Cells(12, 3).Value
!完了日 = WS1.Cells(13, 3).Value
!削除フラグ = " "
.Update
.Close
End With
' バッチ = 「更新」
ElseIf WS1.Cells(14, 3).Value = "更新" Then
If Not IsNumeric(WS1.Cells(3, 3).Value) Then 'プロジェクトIDが数値じゃ無かったらエラー
Call disconnect
MsgBox "プロジェクトIDが異常です"
WS1.Cells(3, 3).Select
Exit Sub
End If
TXT_SQ = "SELECT * FROM T_プロジェクト WHERE プロジェクトID = " & WS1.Cells(3, 3).Value
Set ADO_RS = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成
With ADO_RS
.Open TXT_SQ, ADO_CN, adOpenDynamic, adLockOptimistic
!プロジェクト名称 = WS1.Cells(8, 3).Value
!登録者所属 = WS1.Cells(9, 3).Value
!登録者氏名 = WS1.Cells(10, 3).Value
!登録日 = WS1.Cells(11, 3).Value
!完了予定日 = WS1.Cells(12, 3).Value
!完了日 = WS1.Cells(13, 3).Value
.Update
.Close
End With
' バッチ = 「削除」
ElseIf WS1.Cells(14, 3).Value = "削除" Then
If Not IsNumeric(WS1.Cells(3, 3).Value) Then '管理番号が数値じゃ無かったらエラー
Call disconnect
MsgBox "管理番号が異常です"
Cells(3, 3).Select
Exit Sub
End If
' SQL文
TXT_SQ = "UPDATE T_プロジェクト SET 削除フラグ = '1' WHERE (プロジェクトID = " & WS1.Cells(3, 3).Value & ");"
Set ADO_RS = CreateObject("ADODB.Command") 'ADOコマンドオブジェクトを作成
With ADO_RS
.ActiveConnection = ADO_CN
.CommandText = TXT_SQ
.Execute
End With
End If
Call disconnect 'データベース接続解除
' バッチクリア
WS1.Cells(14, 3).Value = ""
MsgBox "処理が完了しました。"
WS1.Cells(1, 1).Select
Set WS1 = Nothing 'ワークシートオブジェクト解放
End Sub
課題管理
- WHERE文にプロジェクトIDを追加
- Cellsの前にワークシートオブジェクトを追加
大筋に修正はありません。
まとめ
基本的な選択、更新、削除の処理を一通り使いましたのでかなり参考になるのではないかと思います。
エクセルの画面を見比べながらソースを見ると分かり易いと思います。
この記事へのコメントはありません。