2013-05-15 3 views
-1

"데이터베이스"라는 Excel 데이터베이스에서 쿼리 할 매크로/vba를 생성하여 "결과"의 여러 조건과 일치시키고 백분율을 계산하고 열에 채우는 데 도움이 필요합니다.다른 Excel 워크 시트에서 백분율을 계산하고 결과를 채우기

https://docs.google.com/file/d/0ByCB_rXHlkEba05RU3p5RGlnM1U/edit?pli=1

워크 시트 - "데이터베이스"

Fields: 
YEAR 
Region# 
Region_Name 
Store# 
Store_NAME 
ITM-GRADE 
Whse  
Item# 
Item_Desc 
Type  
Group 
Qty 

Worksheeet = "결과"

Criteria  Year  2005  2005  2005 2005 
Criteria  ITM-GRADE GradeA1 GradeA1 GradeA1 GradeA1 
Criteria  Whse  Whse2  Whse2  Whse2 Whse2 
Criteria  Group  11 to 44 11  55 to 66 55 to 66 
Criteria  Type  Q1  Q2  Q1  Q2 

Region# Store# percentage   
1001 1001-002 Group 11-44 divided by Group 11-66   
1001 1001-003 % % % % 
1001 1001-004 % % % % 
1003 1003-001 % % % % 
1003 1003-002 % % % % 
1003 1003-003 % % % % 
1005 1005-001 % % % % 

지역 번호와 일치하는 VBA를, 저장 번호, 연도, ITM- Grade, Whse, Group, "Database"유형은 11-44 그룹을 11-66 그룹으로 나누고 p를 채 웁니다. 각 컬럼의 백분율. 당신의 도움을 주셔서 감사합니다.

+1

당신은 구글 문서 도구 또는 드롭 박스에 파일,하지만 당신도 적절하게 설명 할 수없는 매우 구체적인 질문의 종류를 업로드 할 수 있으며, 아니다 많은 도움이 될만한 답변을 얻을 수 있습니다. –

+0

데이비드에게 감사드립니다. 이것은 내 처음으로 게시 하고이 환경에 처음이다. 데이터베이스, 결과 워크 시트 및 수동으로 수행하는 방법을 보여주는 파일을 첨부 할 수있는 가능한 최선을 다할 것입니다. 시각적으로 훨씬 쉽습니다. –

+0

오늘 아주 많이 배웠고, Gmail 계정을 열고이 링크를 공유했습니다. 잘하면 작동합니다. https://docs.google.com/file/d/0ByCB_rXHlkEbS3U1SDFzRkRCd00/edit?usp=sharing –

답변

0

당신을 위해 일하는 것이이 솔루션을 땜질의 작은 비트와 함께, 당신은 이미 유효한 공식을 가지고 가정 :

Set ArrayFormula to many Excel cells using VBA

그러나, 수식은 1004 오류가 발생합니다 255 개 문자를 초과한다.

명명 된 범위를 사용하여이 수식을 상당히 축소 할 수 있습니다.

는 IMO는 분자를 계산하기 위해 QTY 열에서 SpecialCells(xlCellTypeVisible)을 사용하여 다음 데이터베이스 범위에 AutoFilter 방법의 사용을 자동화하고, 아마도 더 쉽게

보다는 불쾌한 배열 수식을 사용하고 UPDATE 방정식의 & 분모는 메모리의 점수를 계산 한 다음 워크 시트 셀에 기록합니다.

이 메서드는 배열 수식과 동일한 결과를 반환하는 것으로 나타나며 수식에서 허용하지 않는 여러 "그룹"조건도 허용합니다. 여러 "그룹"기준 (예를 들어, 당신은을 통해 그룹 (11)을 수행 할 경우

Option Explicit 
Sub UsingAutoFilters() 

Dim wsDB As Worksheet, wsResults As Worksheet 
Dim rngResults As Range, dbRange As Range 
Dim sYear$, sRegion$, sStore$, sItmGrade$, sItem$, sWhse$, sType$, sGroup$ 
Dim r As Long, c As Long 'row & column iterator 
Dim myDenominator, myNumerator As Double 'used for calculations 

Set wsDB = Worksheets("Database") 
'## This is the database table ##' 
Set dbRange = wsDB.Range("A1:L8043") 

Set wsResults = Worksheets("QueryResult") 
'## This is the range of data in the QueryResults table, E8 to the end of the data ##' 
Set rngResults = wsResults.Range("E8:H13") '## Modify as needed' 

    '## Iterate over columns in the results table' 
    For c = 1 To rngResults.Columns.Count 
     'Capture the filter values for each COLUMN.' 
     With wsResults 
      sYear = .Cells(1, c + 4).Value 
      sItmGrade = .Cells(2, c + 4).Value 
      sWhse = .Cells(3, c + 4).Value 
      sItem = .Cells(4, c + 4).Value 
      sType = .Cells(5, c + 4).Value 
      sGroup = .Cells(6, c + 4).Value 
     End With 

    '## Set the filters ##' 
     'Filter the year 
     dbRange.AutoFilter Field:=1, Criteria1:=sYear 
     'Filter the itemgrade' 
     dbRange.AutoFilter Field:=6, Criteria1:=sItmGrade 
     'Filter the whse' 
     dbRange.AutoFilter Field:=7, Criteria1:=sWhse 
     'Filter the Item#' 
     dbRange.AutoFilter Field:=8, Criteria1:=sItem 

    '## Now, for each row in the table...' 
     For r = 1 To rngResults.Rows.Count 
      'Capture the row filter values for each ROW.' 
      sRegion = wsResults.Cells(r + 7, 1).Value 
      sStore = wsResults.Cells(r + 7, 3).Value 

     '## Apply the row filters ##' 
      'Filter the region' 
      dbRange.AutoFilter Field:=2, Criteria1:=sRegion 
      'filter the store #' 
      dbRange.AutoFilter Field:=4, Criteria1:=sStore 

     '## Calculate the denominator ##' 
      'SUM OF VISIBLE CELLS IN wsDB.Column L 
      myDenominator = Application.WorksheetFunction.Sum(_ 
          dbRange.Columns(12).SpecialCells(xlCellTypeVisible)) 

     '## Now, filter for the type & group, to get the Numerator' 
      'Filter the type' 
      dbRange.AutoFilter Field:=10, Criteria1:=sType 
      'Filter the group(s) criteria 
      dbRange.AutoFilter Field:=11, Criteria1:=Array(Split(sGroup, ",")), _ 
       Operator:=xlFilterValues 

     '## Calculate the numerator ##' 
      myNumerator = Application.WorksheetFunction.Sum(_ 
          dbRange.Columns(12).SpecialCells(xlCellTypeVisible)) 

      If myDenominator = 0 Then 
       'Avoid Div/0 errors:' 
       rngResults(r, c).Value = "N/A" 
      Else: 
       '## get the result and place it in the cell ##' 
       rngResults(r, c).Value = myNumerator/myDenominator 
      End If 
      'turn off the autofilter on fields 10 & 11' 
      dbRange.AutoFilter Field:=10 
      dbRange.AutoFilter Field:=11 
     Next r 

     'turn off the autofilter' 
     wsDB.AutoFilterMode = False 

    Next c 
End Sub 

:

Using the updated file

Screenshot of results, 다음 코드를 정상적인 코드 모듈을 삽입하고 붙여 넣기 33)의 경우 해당 셀에서 쉼표로 구분 된 목록을 사용하십시오 (예 : 11, 22, 33). "그룹"기준은 여러 기준을 수용 할 수있는 유일한 필드입니다. 이 업데이트 된 XLSM 파일에서 유효하지 않기 때문에

Group Criteria

당신은, 열 G & H의 기준 필드를 업데이트해야합니다. 자신의 문제를 해결에서 시도를 보여줍니다하지

Criteria fields need updating

+0

도와 주셔서 고맙습니다. 그것은 나를위한 학습 곡선입니다. 매우 감사. –

+0

확인. 처음에는 하나의 기준으로 작동하는 방법을 생각해 냈습니다. 그런 다음 여러 기준에 따라 작동하는 다른 방법이 있다고 생각합니다. 두 가지 방법을 시도해 보았는데 모두 같은 결과를 얻었습니다. 하지만 꽤 귀엽다. 나는 내일 무언가를 올리거나, 관심이 있다면 구글에 업데이트 된 XLSM 파일을 보냅니다. –

+0

또 다른 쉬운 방법은 자동 필터를 사용하는 것입니다. 이것은 기본적으로 내 지식/학습을 위해 수행 한 배열 수식보다 훨씬 쉽게 자동화 할 수 있습니다. 나는 그것을 함께 두려고 노력할 것이다. –

관련 문제