|
之前说用数据透视表,没有仔细看,有点草率了。细细研究了一下,采用SQL查询语言,应该可以达到楼主的要求。对表格做了改动,说明如下:
1.建立了基础数据表格,将站别/机种/不良项目都提取出来,以便在代码中利用上。站别已经去重复处理。
站别和机种是为了在黄色查询框内建立数据有效性,以免查询过程中输入看似相似但却不一样的词语。
不良项目是为了SQL查询语言中用for ...next 加入查询词组。
2.因为数量不知道是要哪个数量,所以我取的是同线别同机种同站别的数量合计。如果不符合楼主之意,楼主可以自行修改。
3.不知道楼主在时间/机种/站别三个条件都没有时需不需要查询数据,我取的是时间/机种/站别三个条件都没有时,按线别进行汇总。
- Option Explicit
- Public Function cnn() As Object
- Set cnn = CreateObject("adodb.connection")
- If Application.Version < 12 Then
- cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
- Else
- cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
- End If
- End Function
- Sub GetData()
- Application.ScreenUpdating = False
- Dim rs As New ADODB.Recordset, SQL$
- Dim i%, JCSJR%, StrM$, StrMm$, TJ$, TJR$
- Dim TJRQ1, TJRQ2
- TJRQ1 = Sheet3.Range("e2"): TJRQ2 = Sheet3.Range("m2") '日期条件
- '###################################################################################
- JCSJR = Sheet1.Range("C65536").End(3).Row '基础数据要进行SQL查询的不良项目
- For i = JCSJR To 2 Step -1
- StrM = Sheet1.Range("c" & i)
- If InStr(StrM, "/") > 0 Then
- StrM = "[" & StrM & "]" '当SQL查询中有特珠字符/时,要用中括号括起
- End If
- StrM = ",sum(" & StrM & ")"
- StrMm = StrM & StrMm
- Next
- '###################################################################################
- For i = 4 To 13 '有机种有站别则形成查询条件
- TJ = ""
- If Len(Sheet3.Range("b" & i)) > 0 And Len(Sheet3.Range("c" & i)) > 0 Then
- TJ = "线别=" & Sheet3.Range("A" & i) & " AND 机种='" & Sheet3.Range("b" & i) & "' AND 站别='" & Sheet3.Range("C" & i) & "'"
- ElseIf Len(Sheet3.Range("b" & i)) > 0 And Len(Sheet3.Range("c" & i)) <= 0 Then
- TJ = "线别=" & Sheet3.Range("A" & i) & " AND 机种='" & Sheet3.Range("b" & i) & "'"
- ElseIf Len(Sheet3.Range("b" & i)) <= 0 And Len(Sheet3.Range("c" & i)) > 0 Then
- TJ = "线别=" & Sheet3.Range("A" & i) & " AND 站别='" & Sheet3.Range("C" & i) & "'"
- End If
- If Len(TJ) <= 0 Then TJ = "线别=" & Sheet3.Range("A" & i) & "" '当没有条件时设置条件为线别
- If Len(TJRQ1) <= 0 And Len(TJRQ2) <= 0 Then
- SQL = "select sum(数量)" & StrMm & " from [品质报表$] where " & TJ & " "
- ElseIf Len(TJRQ1) > 0 And Len(TJRQ2) <= 0 Then
- SQL = "select sum(数量)" & StrMm & " from [品质报表$] where " & TJ & " and (日期 between #" & Format(TJRQ1, "yyyy-mm-dd") & "# and #" & Format(Date, "yyyy-mm-dd") & "#)"
- ElseIf Len(TJRQ1) <= 0 And Len(TJRQ2) > 0 Then
- SQL = "select sum(数量)" & StrMm & " from [品质报表$] where " & TJ & " and (日期 >= #" & Format(TJRQ1, "yyyy-mm-dd") & ""
- ElseIf Len(TJRQ1) > 0 And Len(TJRQ2) > 0 Then
- SQL = "select sum(数量)" & StrMm & " from [品质报表$] where " & TJ & " and (日期 between #" & Format(TJRQ1, "yyyy-mm-dd") & "# and #" & Format(TJRQ2, "yyyy-mm-dd") & "#)"
- End If
- rs.Open SQL, cnn, 1, 3
- If rs.EOF Then
- MsgBox "未查找到记录"
- Else
- Sheet3.Range("d" & i).CopyFromRecordset rs
- rs.Close
- End If
- Next
- Set rs = Nothing
- Application.ScreenUpdating = True
- End Sub
复制代码
|
评分
-
1
查看全部评分
-
|