2017-09-19 1 views
1

내 통합 문서에는 3 개의 시트가 있습니다.Excel VBA : 다른 셀 값을 사용하여 동일한 함수를 반복합니다.

  1. 홈페이지
    enter image description here

  2. RawImport
    enter image description here

  3. PullData
    enter image description here

I 메인 시트 B2:B5 세포에 입력을 입력합니다.이 입력에 따라 달라집니다. 계산 결과를 내 시트 RawImport A8:G8 셀에 저장하고 있습니다. 이제 마지막으로, RawImport A8:G8 셀 값, 다른 기능 및 최종 결과 수행은 PullData A:L 열에 저장됩니다.이 릴리스에서는 사용자가 Main 시트 (일반적으로 단일 데이터 세트)에만 B2:B5 셀을 사용할 수 있습니다.

이제 다음 버전의 일환으로, 나는 즉, 하나 개 이상의 데이터 세트, C2:C5, D2:D5, E2:E5 등하지만 첫 세트와 완전히 동일합니다 내 다른 시트에서 실행되는 기능을 가지고 싶습니다. C2의 경우 : C5, 나는 내 다른 시트에 사용 가능한 다음 열을 사용할 필요가

홈페이지 시트 B2:B5는 RawImport A8 :G8 (8 열) 및 PullData A3:L3 (12 열)

홈페이지 시트 C2:C5 사용 RawImport H8:N8 (다음 사용 8 열) 및 PullData M3:X3 (다음 12 열) ... .... 현재

, 나는 동일한 기능을 실행하기 위해 같은 VBA 스크립트를 여러 번 쓰고 있어요. 즉, B2 : B5의 경우 RawImport A8 :G8 (8 열) 및 PullData A3:L3을 내 코드에 사용하고 C2 : C5 다음 다른 열 집합을 다른 시트에 사용합니다. 모든 데이터 세트에서 사용되는 열 수는 모든 시트에서 동일합니다.

내가 따르는 논리는 B2 : B5의 끝에서 C2가 비어 있는지 확인하고 그 비어있는 경우에는 거기에서 내 코드를 끝내겠다. 그렇지 않으면 C2를 위해 작성된 코드를 호출 할 것이다. C5

어쨌든 나는 여러 번 코드를 작성하는 대신 간단한 방법을 사용할 수 있습니까?

Option Explicit 

Sub GetData() 
Dim Main As Worksheet 
Dim RawImport As Worksheet 
Dim PullData As Worksheet 
Dim ticker As String 
Dim exchange As String 
Dim interval As Integer 
Dim numPastTradingDays As Integer 
Dim qurl As String 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 
Application.Calculation = xlCalculationManual 

'''''''Data Entry to Sheet Main''''''''''''''' 

Set Main = Workbooks("1.xlsm").Sheets("Main") 
Set RawImport = Workbooks("1.xlsm").Sheets("RawImport") 
Set PullData = Workbooks("1.xlsm").Sheets("PullData") 

ticker = Main.Range("B2").Value 
exchange = Main.Range("B3").Value 
interval = Main.Range("B4").Value * 60 
numPastTradingDays = Main.Range("B5").Value 

'''''''Fill RawImport sheet A to G using Main sheet B2 to B5''''''''''''''' 

RawImport.Range("A8").Value = ticker 
RawImport.Range("B8").Value = interval 
RawImport.Range("C8").Value = 300 
RawImport.Range("D8").Value = 400 
RawImport.Range("E8").Value = 500 
RawImport.Range("F8").Value = exchange 
RawImport.Range("G8").Value = interval 


'''''''PullData sheet fill using RawImport data from A8 to G8''''''''''''''' 

Dim lrA As Integer 

lrA = RawImport.Range("B" & Rows.Count).End(xlUp).Row 

PullData.Range("A3:A" & lrA - 5).Value = RawImport.Range("G8:G" & lrA).Value 
PullData.Range("A3:A" & lrA).NumberFormat = "d mmm yyyy h:mm;@" 
PullData.Range("A:A").Columns.AutoFit 

PullData.Range("B3:B" & lrA - 5).Value = RawImport.Range("E8:E" & lrA).Value 
PullData.Range("C3:C" & lrA - 5).Value = RawImport.Range("C8:C" & lrA).Value 
PullData.Range("D3:D" & lrA - 5).Value = RawImport.Range("D8:E" & lrA).Value 
PullData.Range("E3:E" & lrA - 5).Value = RawImport.Range("B8:B" & lrA).Value 
PullData.Range("F3:F" & lrA - 5).Value = RawImport.Range("F8:F" & lrA).Value 

PullData.Range("G3:G" & lrA - 5).Formula = "=(C3+D3+E3)/3" 
PullData.Range("H3:H" & lrA - 5).Formula = "=G3*F3" 
PullData.Range("I3:I" & lrA - 5).Formula = "=sum(H$2:H3)" 
PullData.Range("J3:J" & lrA - 5).Formula = "=sum(F$2:F3)" 
PullData.Range("K3:K" & lrA - 5).Formula = "=sum(I3/J3)" 
PullData.Range("L3:L" & lrA - 5).Formula = "=((E3-K3)/K3)" 

PullData.Range("G3:G" & lrA - 5) = PullData.Range("G3:G" & lrA - 5).Value 
PullData.Range("H3:H" & lrA - 5) = PullData.Range("H3:H" & lrA - 5).Value 
PullData.Range("I3:I" & lrA - 5) = PullData.Range("I3:I" & lrA - 5).Value 
PullData.Range("J3:J" & lrA - 5) = PullData.Range("J3:J" & lrA - 5).Value 
PullData.Range("K3:K" & lrA - 5) = PullData.Range("K3:K" & lrA - 5).Value 
PullData.Range("L3:L" & lrA - 5) = PullData.Range("L3:L" & lrA - 5).Value 

PullData.Range("G3:G" & lrA - 5).NumberFormat = "0.00" 
PullData.Range("K3:K" & lrA - 5).NumberFormat = "0.00" 
PullData.Range("L3:L" & lrA - 5).NumberFormat = "0.00%" 

Application.Calculation = xlCalculationAutomatic 

Application.ScreenUpdating = True 

End Sub 
+1

암이 정확하게 설정,하지만 내 첫번째 생각은 당신이 루프를 추가 할 때마다 관련 범위를 변경하려면 오프셋을 사용하는 것입니다 시각화하기 위해 애 쓰고 : 그러나 이것은 일반적인 개념은 가능성이 구현해야합니다입니다 . – SJR

+0

더 나은 이해를 위해 스크린 샷을 추가했습니다. – acr

답변

1

100 % 확실하지만,이 올바른 방향을 가리켜 야합니다 (이것은 원래의 코드가 아니라 원래 하나의 유사. 주)

다음은 샘플 코드입니다. 우리가하는 일은 루프입니다. 다음 열의 2 행에있는 셀이 비어있을 때까지 무한정 계속됩니다. 루프 내에서 전체 코드를 작성하지 않았기 때문에 올바른 코드라고 보증 할 수 없기 때문에 발생할 수있는 모든 회선 예외 문제를 해결하지는 않습니다.

Dim collOffset as Long 
collOffset = 0 

Do While Main.Range("B2").Offset(,collOffset) <> "" 
    ticker = Main.Range("B2").Offset(,collOffset).Value 
    exchange = Main.Range("B3").Offset(,collOffset).Value 
    interval = Main.Range("B4").Offset(,collOffset).Value * 60 
    numPastTradingDays = Main.Range("B5").Offset(,collOffset).Value 

    '''''''Fill RawImport sheet A to G using Main sheet B2 to B5''''''''''''''' 

    RawImport.Range("A8").Offset(,collOffset).Value = ticker 
    RawImport.Range("B8").Offset(,collOffset).Value = interval 
    RawImport.Range("C8").Offset(,collOffset).Value = 300 
    RawImport.Range("D8").Offset(,collOffset).Value = 400 
    RawImport.Range("E8").Offset(,collOffset).Value = 500 
    RawImport.Range("F8").Offset(,collOffset).Value = exchange 
    RawImport.Range("G8").Offset(,collOffset).Value = interval 

    ' Etc. 
    ' 
    ' 
    ' You'll need to add the rest of your code, 
    ' I'm not going to try and reverse-engineer what you did 
    ' or how to fix every line :) 


    ' Increment your offset index 
    collOffset = collOffset + 1 
Loop 
+0

감사합니다. 지금 아이디어가 있어요. – acr

관련 문제