2010-03-05 3 views
3

그래서 양식 차트 마법사로 작성된 차트를 가져 와서 PowerPoint 프레젠테이션 슬라이드에 자동으로 삽입하는 VBA가 있습니다. 나는 차트 형태가 무엇인지 결정하기 위해 사용자가 선택할 수있는 매개 변수를 가진 더 큰 형태의 하위 형태로 차트 양식을 사용합니다. 사용자가 매개 변수를 결정하고 선호하는 차트를 작성한 다음 버튼을 클릭하고 회사의 배경 템플릿을 사용하여 ppt 슬라이드에 넣을 수 있습니다 (예 : 012h).MS Access 2003 - 프로그래밍 방식으로 차트의 데이터를 정의하는 방법이 있습니까?

So 그것은 작동하는데, 이것을 달성하기 위해 사용해야하는 객체의 양이 매우 부피가 크다.

나는 다음과 같은 표현을 사용

like forms!frmMain.Month&* 

내가 먼저 시작하지만, 너무 잘 갔을 때 괜찮다고 저장된 쿼리에 입력 값을 얻을 그들은 너무 많은 옵션을 원하고, 저장된 조회/오브젝트의 수를 늘리고 있음을 나타냅니다. 이 차트를 처리 할 수 ​​있도록 여러 가지 유형의 차트가 있기 때문에 차트가있는 여러 저장된 양식이 필요합니다.

나는 차라리 몇 가지 VBA와 즉석에서 모든 것을 할 것 : 그래서 결국 내 질문에

. 내가 목록 상자 및 양식에 텍스트 상자를 삽입하는 방법을 알고, 내가 VBA를 사용하여 테이블/쿼리에서 원하는 값을 얻으려면 VBA에서 SQL을 사용하는 방법을 알고, 나는 단지 몇 가지 VBA가 있는지 모르겠다. 결과 레코드 세트에서 차트의 데이터 값을 설정하는 데 사용하십시오.

DIM rs AS DAO.Rescordset 
DIM db AS DAO.Database 
DIM sql AS String 

sql = "SELECT TOP 5 Count(tblMain.TransactionID) AS Total, tblMain.Location FROM 
tblMain WHERE (((tblMain.Month) = """ & me.txtMonth & """)) ORDER BY Count 
(tblMain.TransactionID) DESC;" 

set db = currentDB 
set rs = db.OpenRecordSet(sql) 

       rs.movefirst 

      some kind of cool code in here to make this recordset 
      the data of chart in frmChart ("Chart01") 

감사합니다. 설명의 길이 사과드립니다. 일을

+0

그래프의 SQL을 그 달에있는 컨트롤로 고정 배선 한 것으로 생각하십니까? 즉, "" ""& me.txtMonth & "" "를 [Forms! YourFormName! txtMonth]로 바꾸고 그래프를 다시 쿼리하여 달 컨트롤의 현재 값을 반영하도록 업데이트하십시오. –

+0

폼의 많은 매개 변수/컨트롤이 있으므로 위의 예와 같이있었습니다. 그래서 내가 SQL 문에 넣을 수있는 위와 같은 표현의 양에는 한계가 있습니까? 데이빗 고마워! – Justin

+0

해당 접근 방식의 한계는 기준의 상호 작용에 따라 다릅니다. 일부가 공백으로 허용되면 잠재적 문제가 발생할 수 있습니다. 그들이 모두 채워지면 꽤 쉽습니다.이전의 문제는 해결할 수 있지만 꽤 복잡한 작업이 될 수 있으며 실제 성능을 향상시킬 수 있습니다 (특히 각 행에 대해 평가해야하는 표현식에 기준을 두어야하는 경우 인덱스가 될 수 없음을 의미 함). 익숙한). –

답변

1

내가 관리해야로서 VBA에서 직접 데이터 집합을 변경할 수 있습니다 그것. 그러나 성능이 좋지 않아 임시 테이블에 결과를 채우고 그 그래프를 기반으로했습니다 (내 유일한 질문 stackoverflow 질문을 참조하십시오) 그러나 데이터 집합이 아주 작 으면 확실히 작동시킬 수 있습니다. 나는 사무실에 없지만 코드를 원할 경우 월요일에 게시 할 수 있습니다.

EDIT : 여기 제가 사용한 오래된 코드 모듈입니다. 이것이 전부지만, 당신이보고있는 핵심 부분은 그래프의 데이터 시트를 열고 다음과 같이 값을 변경하는 부분입니다. .cells (1,0) = "badger".

나는이 메소드를 enevtly 덤프하고 내 애플 리케이션에서와 같이 임시 테이블로 갔다. 그래프가 꽤 많이 다시 그려지고 나는 "실시간"느낌을주기 위해 가능한 한 가장 빠른 가능한 방법을 찾아야했다. 귀하의 요구에 잘 맞습니다.

Public Sub Draw_graph(strGraph_type As String) 
Dim objGraph As Object 
Dim objDS As Object 
Dim i As Byte 


On Error GoTo Error_trap 

Dim lRT_actual As Long 
Dim lRT_forecast As Long 
Dim Start_time As Long 
Dim aCell_buffer(49, 4) As Variant 
Me.acxProgress_bar.Visible = True 
Me.acxProgress_bar.Value = 0 
Set objGraph = Me.oleCall_graph.Object 
Set objDS = objGraph.Application.datasheet 
Start_time = GetTime() 
With objDS 
    .cells.Clear 
    Select Case strGraph_type 
     Case Is = "Agents" 
      '************************** 
      '** Draw the agent graph ** 
      '************************** 
      .cells(1, 1) = "Start Time" 
      .cells(1, 2) = "Provided" 
      .cells(1, 3) = "Required" 
      .cells(1, 4) = "Actual Required" 
      For i = 1 To 48 
       .cells(i + 1, 1) = Format(DateAdd("n", (i - 1) * 15, "08:00:00"), "HHMM") 
       If Me.Controls("txtAgents_pro_" & i) > 0 Then 
        .cells(i + 1, 2) = Me.Controls("txtAgents_pro_" & i) + Me.Controls("txtAgents_add_" & i) 
       Else 
        .cells(i + 1, 2) = 0 
       End If 
       If Me.Controls("txtAgents_req_" & i) > 0 Then 
        .cells(i + 1, 3) = Me.Controls("txtAgents_req_" & i) 
       End If 

       If Me.Controls("txtActual_" & i) > 0 Then 
        .cells(i + 1, 4) = Erlang_Agents(Me.txtServiceLevel, Me.txtServiceTime, Me.Controls("txtActual_" & i) * 4, Me.txtAVHT + CLng(Nz(Me.txtDaily_AVHT_DV, 0))) 
       End If 


       'update the progress bar 
       If Me.acxProgress_bar.Value + 2 < 100 Then 
        Me.acxProgress_bar.Value = Me.acxProgress_bar.Value + 2 
       Else 
        Me.acxProgress_bar.Value = 90 
       End If 
      Next i 
     Case Is = "Calls" 
      '************************** 
      '** Draw the Calls graph ** 
      '************************** 
      .cells(1, 1) = "Start Time" 
      .cells(1, 2) = "Forecast" 
      .cells(1, 3) = "Actual" 
      For i = 1 To 48 
       .cells(i + 1, 1) = Format(DateAdd("n", (i - 1) * 15, "08:00:00"), "HHMM") 
       If Me.Controls("txtForecast_" & i) > 0 Then 
        .cells(i + 1, 2) = Me.Controls("txtForecast_" & i) 
       Else 
        .cells(i + 1, 2) = 0 
       End If 
       If Me.Controls("txtActual_" & i) > 0 Then 
        .cells(i + 1, 3) = Me.Controls("txtActual_" & i) 
       End If 
       If Me.acxProgress_bar.Value + 2 < 100 Then 
        Me.acxProgress_bar.Value = Me.acxProgress_bar.Value + 2 
       Else 
        Me.acxProgress_bar.Value = 90 
       End If 
      Next i 

     Case Is = "Call Deviation" 
      '************************** 
      '** Draw the Call Deviation graph ** 
      '************************** 
      .cells(1, 1) = "Start Time" 
      .cells(1, 2) = "Deviation" 
      lRT_actual = 0 
      lRT_forecast = 0 
      For i = 1 To 48 
       lRT_actual = lRT_actual + Me.Controls("txtActual_" & i) 
       lRT_forecast = lRT_forecast + Me.Controls("txtForecast_" & i) 
       .cells(i + 1, 1) = Format(DateAdd("n", (i - 1) * 15, "08:00:00"), "HHMM") 

       .cells(i + 1, 2) = lRT_actual - lRT_forecast 

       If Me.acxProgress_bar.Value + 2 < 100 Then 
        Me.acxProgress_bar.Value = Me.acxProgress_bar.Value + 2 
       Else 
        Me.acxProgress_bar.Value = 90 
       End If 
      Next i 

     Case Is = "Call Deviation %" 
      '************************** 
      '** Draw the Call Deviation % graph ** 
      '************************** 

      .cells(1, 1) = "Start Time" 
      .cells(1, 2) = "Deviation" 
      lRT_actual = 0 
      lRT_forecast = 0 


      For i = 1 To 48 
       lRT_actual = lRT_actual + Me.Controls("txtActual_" & i) 
       lRT_forecast = lRT_forecast + Me.Controls("txtForecast_" & i) 
       .cells(i + 1, 1) = Format(DateAdd("n", (i - 1) * 15, "08:00:00"), "HHMM") 
       If lRT_forecast > 0 Then 
        .cells(i + 1, 2) = (lRT_actual - lRT_forecast)/lRT_forecast 
       End If 

       If Me.acxProgress_bar.Value + 2 < 100 Then 
        Me.acxProgress_bar.Value = Me.acxProgress_bar.Value + 2 
       Else 
        Me.acxProgress_bar.Value = 90 
       End If 
      Next i 



     Case Is = "SLA" 
      '************************** 
      '*** Draw the SLA graph *** 
      '************************** 
      .cells(1, 1) = "Start Time" 
      .cells(1, 2) = "SLA" 
      .cells(1, 3) = "Actual SLA" 
      For i = 1 To 48 
       .cells(i + 1, 1) = Format(DateAdd("n", (i - 1) * 15, "08:00:00"), "HHMM") 
       If Me.Controls("txtSLA_" & i) > 0 Then 
        .cells(i + 1, 2) = Me.Controls("txtSLA_" & i)/100 
       Else 
        .cells(i + 1, 2) = 0 
       End If 
       If Me.Controls("txtActual_SLA_" & i) > 0 Then 
        .cells(i + 1, 3) = Me.Controls("txtActual_SLA_" & i) 
       End If 
       If Me.acxProgress_bar.Value + 2 < 100 Then 
        Me.acxProgress_bar.Value = Me.acxProgress_bar.Value + 2 
       Else 
        Me.acxProgress_bar.Value = 90 
       End If 
      Next i 

    End Select 
End With 

Set objDS = Nothing 
Set objGraph = Nothing 
Me.acxProgress_bar.Visible = False 


Exit Sub 

Error_trap: 
DoCmd.Hourglass False 

MsgBox "An error happened in sub Draw_graph, error description, " & Err.Description, vbCritical, "Tracker 3" 

End Sub 
+0

예 제발 ... 나는 그것을보고 싶습니다! 감사! – Justin

+0

이것은 굉장합니다 .... 대단히 감사합니다! – Justin

1

한 아주 쉬운 방법이 예를 들어, 쿼리에 차트를 기반으로 쿼리를 업데이트하는 것입니다 :

strSQL = "SELECT ..." 

QueryName = "qryByHospital" 

If IsNull(DLookup("Name", "MsysObjects", "Name='" & QueryName & "'")) Then 
    CurrentDb.CreateQueryDef QueryName, strSQL 
Else 
    CurrentDb.QueryDefs(QueryName).SQL = strSQL 
End If 

DoCmd.OpenReport "rptChartByHospital", acViewPreview 
+0

@Remou가 말하는 것을 강조하기 위해, 이것은 Access에서 Jet/Jet 표현식 서비스를 사용하는 경우를 제외하고 실제로 Access에서 그래프 뒤에 결과 집합을 변경하는 유일한 방법입니다. 나는이 c를 만났다. 1996 년, 그리고 그것은 변하지 않았습니다. 그리고 예, 그것은 짜증납니다. –

+0

이 방법을 사용하더라도 '쿼리'를 개체로 저장해야합니까? 'QueryName'을 문자열로 정의해야합니까? 언제나처럼 고마워 Remou? – Justin

+0

이 예제에서 QueryName은 문자열입니다. 누락 된 경우 조회를 작성하지만, 가장 적합한 것은 적합한 조회를 작성하고 양식 또는 보고서에 도표를 빌드 한 다음 위의 그림과 같이 SQL을 변경하는 코드를 추가하는 것입니다. 쿼리는 영구적으로 변경됩니다. – Fionnuala

관련 문제