SQL ServerのデータをExcelに出力して罫線を引く
SQL ServerのテーブルのデータをAccess経由でExcelに出力して罫線を引きます。

テーブルを準備する
SQL Serverで「sample」という名前のデータベースの中に「Tサンプル」という名前のテーブルを用意しました。

SQL Serverにストアドプロシージャを準備する
SQL Serverに「exportサンプル」という名前のストアドプロシージャを用意しました。
これによりテンポラリテーブルにデータを書き込みますが、テンポラリテーブルに「通し番号」という名前の列を作成して日付ごとに通し番号を割り当てます。
この「通し番号」はExcelに出力したときに日付ごとにセルを塗りつぶす際に使用します。
CREATE PROCEDURE exportサンプル
@ID int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @table_name varchar(50);
DECLARE @sql varchar(1000);
SET @ID=@@SPID;
SET @table_name='';
SET @table_name=@table_name+'##TEMPサンプル'+CONVERT(varchar,@@spid);
SET @sql='';
SET @sql=@sql+'IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE name='''+@table_name+''')';
SET @sql=@sql+'DROP TABLE '+@table_name+';';
SET @sql=@sql+'CREATE TABLE '+@table_name;
SET @sql=@sql+'(';
SET @sql=@sql+'明細番号 bigint';
SET @sql=@sql+',日付 date';
SET @sql=@sql+',商品コード varchar(10)';
SET @sql=@sql+',商品名 varchar(20)';
SET @sql=@sql+',数量 int';
SET @sql=@sql+',通し番号 bigint';
SET @sql=@sql+');';
SET @sql=@sql+'INSERT INTO '+@table_name;
SET @sql=@sql+' SELECT 明細番号,日付,商品コード,商品名,数量,';
SET @sql=@sql+'DENSE_RANK() OVER(ORDER BY 日付) AS 通し番号';
SET @sql=@sql+' FROM Tサンプル ORDER BY 日付;';
EXECUTE(@sql);
RETURN -1
END TRY
BEGIN CATCH
RETURN 0
END CATCH
END
SQL ServerのテンポラリテーブルのデータをExcelに出力して罫線を引くコードの記述
Accessの標準モジュールに以下のコードを記述しました。
「日付」,「商品コード」,「商品名」は1行上の値と同じ時はフォント色を背景色と同じにして空欄に見えるようにしました。
罫線、背景色、フォント色の設定には条件付き書式を使いました。
Public Sub sample()
Dim strCN_sample As String
strCN_sample = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=LAPTOP-114315\SQLEXPRESS;DATABASE=sample;UID=admin;PWD=1111"
Dim cn As New ADODB.Connection
cn.CursorLocation = adUseClient
cn.Open strCN_sample
Dim sid As Integer 'SQL Serverが割り当てるセッションIDを格納する変数
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "exportサンプル"
cmd.CommandTimeout = 3
cmd.Parameters.Append cmd.CreateParameter("@return_value", adInteger, adParamReturnValue, , Null)
cmd.Parameters.Append cmd.CreateParameter("@ID", adInteger, adParamOutput, , Null)
cmd.execute
If CBool(cmd.Parameters("@return_value").Value) = False Then GoTo Errh
sid = cmd.Parameters("@ID").Value
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM [##TEMPサンプル" & CStr(sid) & "]", cn, adOpenStatic, adLockReadOnly
Dim xlApp As Object
Dim wb As Object
Dim ws As Object
Dim file_name As String
Dim i As Integer
file_name = CurrentProject.Path & "\sample.xlsx"
Set xlApp = CreateObject("Excel.Application")
Set wb = xlApp.Workbooks.Add
Set ws = wb.Worksheets(1)
rs.MoveLast
Dim startRow As Integer
startRow = 2
Dim lastRow As Long
lastRow = rs.RecordCount + 1
Dim lastColumn As Integer
lastColumn = 5
For i = 0 To 4
ws.Cells(1, i + 1) = rs.Fields(i).Name
Next
rs.MoveFirst
ws.Range("A2").CopyFromRecordset rs
With ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastColumn))
.Borders(xlEdgeTop).Weight = xlThick
.Borders(xlEdgeLeft).Weight = xlThick
.Borders(xlEdgeRight).Weight = xlThick
.Borders(xlEdgeBottom).Weight = xlThick
.Borders(xlInsideVertical).LineStyle = xlContinuous
End With
With ws.Range(ws.Cells(startRow, 1), ws.Cells(lastRow, 1))
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, Formula1:="=R[0]C2<>R[-1]C2"
.FormatConditions(1).Borders(xlTop).LineStyle = xlContinuous
.FormatConditions(1).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=R[0]C2=R[-1]C2"
.FormatConditions(2).Borders(xlTop).LineStyle = xlDot
.FormatConditions(2).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(R[0]C6,2)=1"
.FormatConditions(3).Interior.Color = vbYellow
.FormatConditions(3).StopIfTrue = False
End With
With ws.Range(ws.Cells(startRow, 2), ws.Cells(lastRow, 2))
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, Formula1:="=R[-1]C[0]<>R[0]C[0]"
.FormatConditions(1).Borders(xlTop).LineStyle = xlContinuous
.FormatConditions(1).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(R[0]C6,2)=1"
.FormatConditions(2).Interior.Color = vbYellow
.FormatConditions(2).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=AND(R[-1]C[0]=R[0]C[0],MOD(R[0]C6,2)=0)"
.FormatConditions(3).Font.Color = vbWhite
.FormatConditions(3).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=AND(R[-1]C[0]=R[0]C[0],MOD(R[0]C6,2)=1)"
.FormatConditions(4).Font.Color = vbYellow
.FormatConditions(4).StopIfTrue = False
End With
With ws.Range(ws.Cells(startRow, 3), ws.Cells(lastRow, 4))
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, Formula1:="=R[-1]C2<>R[0]C2"
.FormatConditions(1).Borders(xlTop).LineStyle = xlContinuous
.FormatConditions(1).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=AND(R[-1]C[0]<>R[0]C[0],R[-1]C2=RC2)"
.FormatConditions(2).Borders(xlTop).LineStyle = xlDot
.FormatConditions(2).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(R[0]C6,2)=1"
.FormatConditions(3).Interior.Color = vbYellow
.FormatConditions(3).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=AND(R[-1]C[0]=R[0]C[0],MOD(R[0]C6,2)=0)"
.FormatConditions(4).Font.Color = RGB(255, 255, 255)
.FormatConditions(4).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=AND(R[-1]C[0]=R[0]C[0],MOD(R[0]C6,2)=1)"
.FormatConditions(5).Font.Color = vbYellow
.FormatConditions(5).StopIfTrue = False
End With
With ws.Range(ws.Cells(startRow, 5), ws.Cells(lastRow, 5))
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, Formula1:="=R[0]C2<>R[-1]C2"
.FormatConditions(1).Borders(xlTop).LineStyle = xlContinuous
.FormatConditions(1).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=R[0]C2=R[-1]C2"
.FormatConditions(2).Borders(xlTop).LineStyle = xlDot
.FormatConditions(2).StopIfTrue = False
.FormatConditions.Add Type:=xlExpression, Formula1:="=MOD(R[0]C6,2)=1"
.FormatConditions(3).Interior.Color = vbYellow
.FormatConditions(3).StopIfTrue = False
End With
ws.Columns("A:E").AutoFit
ws.Columns("F:F").EntireColumn.Hidden = True
ws.Range("A:A").TextToColumns Destination:=ws.Range("A:A")
ws.Range("C:C").TextToColumns Destination:=ws.Range("C:C")
xlApp.DisplayAlerts = False
wb.SaveAs file_name
xlApp.DisplayAlerts = True
xlApp.Quit
Set xlApp = Nothing
rs.Close: Set rs = Nothing
Set cmd = Nothing
cn.Close: Set cn = Nothing
Exit Sub
Errh:
MsgBox "エラーが発生しました。", vbExclamation, "確認"
Set cmd = Nothing
cn.Close: Set cn = Nothing
End Sub

