|
こんにちは。かみちゃん です。
> シート1(List1)に累計値がないとフィルターでは無理でしょうか?
>シート1のデータは3店舗×3項目で1日9行が1年分あります
>係りは30係あります
方法はいろいろあると思いますが、私なら、SQLを使って累計値を計算します。
ただ、初心者や、AccessやSQLをご存知でない場合は、少々難しいかもしれません。
こんなこともできるのね、という程度で参考にしていただければと思います。
こちらでは、サンプルデータで動作確認できています。
(ただし、3係分でテストしました。)
Sub Sample1()
Dim cn As Object
Dim link_opt As String
Dim idx As Long
Dim rs As Object
Dim mysql As String
Dim WS1 As Worksheet
Dim WS2 As Worksheet
Dim rng1 As Range
Set WS1 = Sheets("Sheet1")
Set WS2 = Sheets("Sheet2")
Set rng1 = WS1.Range("A1").CurrentRegion
'Excelデータベースに接続
link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 8.0;"
On Error Resume Next
Set cn = CreateObject("ADODB.Connection")
cn.Open link_opt
On Error GoTo 0
'接続OKの場合
If Not cn Is Nothing And Err.Number = 0 Then
mysql = "SELECT 日付 AS 抽出, 店舗, 項目, [1係], [2係], [3係] " & _
"FROM [" & WS1.Name & "$" & rng1.Address(0, 0) & "] " & _
"WHERE 日付=""20070402"" AND 店舗=""本店"" "
mysql = mysql & " " & "UNION ALL "
mysql = mysql & "SELECT ""累計"" AS 抽出, 店舗, 項目, Sum([1係]) AS 1係, Sum([2係]) AS 2係, Sum([3係]) AS 3係 " & _
"FROM [" & WS1.Name & "$" & rng1.Address(0, 0) & "] " & _
"WHERE 日付<=""20070402"" " & _
"GROUP BY ""累計"", 店舗, 項目 " & _
"HAVING 店舗=""本店"" "
'データベースを開く
On Error Resume Next
Set rs = cn.Execute(mysql)
On Error GoTo 0
'データ取得
If Not rs Is Nothing And Err.Number = 0 Then
With WS2
.Cells.ClearContents
For idx = 0 To rs.fields.Count - 1
.Cells(1, idx + 1).Value = rs.fields(idx).Name
Next
.Range("A2").CopyFromRecordset rs
.Range("A1").CurrentRegion.Sort Key1:=Range("A2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, Header:=xlGuess
End With
Else
MsgBox "レコードセットを開けません"
End If
'データベースを閉じる
On Error Resume Next
rs.Close
Set rs = Nothing
On Error GoTo 0
'接続を切断する
On Error Resume Next
cn.Close
Set cn = Nothing
On Error GoTo 0
Else
MsgBox "データベースに接続できません"
End If
End Sub
|
|