요즘 VBA를 익히느라 이리저리 코딩을 해보는데 왕초보라 어려움이 많습니다
변동되는 표의 맨마지막 특정 셀에 "소계" 표시를 하고
수량과 금액셀의 합계만 해당 렿 맨 마지막에 표시하고 싶은데
잘 안되네요 아래 코딩을 어떻게 고쳐야할지 고수님들
도움 부탁드립니다

Dim sh1, sh2, sh3 As Worksheet
Dim i, j, k As Long
Dim rngE1, rngE2, rngA1, rngA2, rngT As Range
<중간 생략>
Set rngE1 = Range("K" & Range("B1"))
Set rngE2 = Range("K5:K" & Range("B1"))
Set rngA1 = Range("O" & Range("B1"))
Set rngA2 = Range("O5:O" & Range("B1"))
Set rngT = Range("D" & Range("B1"))
Range(rngT + 1).Value = "소계"
Range(rngE1 + 1).Value = WorksheetFunction.Sum(rngE2)
Range(rngA1 + 1).Value = WorksheetFunction.Sum(rngA2)
이런식으로 해보세요
rngT.Offset(1) = "소계"
rngE1.Offset(1) = WorksheetFunction.Sum(rngE2)
rngA1.Offset(1) = WorksheetFunction.Sum(rngA2)
대단히 감사합니다
그런데 합계가 value가 아닌 수식인 =sum( : )으로
표시되도록 하는 방법은 없을까요?
이렇게 수정하여 실행해 보세요. 그러면 합계 값 대신에 합계식이 들어갈 겁니다.
그런데 오류가 납니다 -ㅠ-ㅠ
Sub 매크로1() Set 영역 = Range("영역") ' [G1:G4]를 시트에서 '영역'으로 이름정의 하고 Range("G6").Formula = "=SUM(영역)" ' [G6] 셀에 합계를 구합니다. End Sub혼동을 드려 미안합니다. 오후에 다른 업무를 보느라 보았습니다. 위와 같은 방법으로 처리해 보세요.
그런데 자꾸 번거롭게 해서 조;송합니다만
rngE1, rngE2, rngA1, rngA2가 다 위에 정의되어 있는데
이름정의를 따로 쓰지 않고(이름정의는 영역이 고정되는 듯하여)
이런 식으로 코딩을 넣으면 안되나요? 에러가 나네요 ㅠㅠ
Sub 매크로1() ActiveWorkbook.Names.Add Name:="영역", RefersTo:="=시트이름!$K$5:$K$" & Range("B2") Set 영역 = Range("영역") Range("G6").Formula = "=SUM(영역)" End Sub이런 형식으로...
그런데 제가 사용법이 서툴러서 그런지 적용해보아도 계속 오류가 나네요
이젠 거의 포기상태인데 작업파일을 올리니 혹시 봐 주시면 감사하겠습니;다
양산택배,샘플택배 2개의 시트를 합산택배 시트로 합산하여 소계를
내는 건데 합산택배 버튼을 누르면 2개가 잘 합쳐지는데 마지막 수량, 금액소계 산식이 안들어 오네요
Set rngT = Range("$D" & Range("B1")) '=== 수정 Set rngE1 = Range("$K" & Range("B1")) '=== 수정 Set rngA1 = Range("$O" & Range("B1")) '=== 수정 Set rngE2 = Range("$K$5:$K$" & Range("B1")) '=== 수정 Set rngA2 = Range("$O$5:$O$" & Range("B1")) '=== 수정 rngT.Offset(1, 0) = "소계" rngE1.Offset(1, 0) = "=Sum(" & rngE2.Address & ")" '=== 수정된 부분 rngA1.Offset(1, 0) = "=Sum(" & rngA2.Address & ")" '=== 수정된 부분댓글채택과 함께... 첨부파일 참고하여 업무에 적용해 보세요.
rngT.Offset(1, 0) 은 바로 아래 셀, rngT.Offset(0, 1) 은 바로 오른쪽 셀. 이런 방법으로...
그런데 rngT는 현재로는 [D11] 셀인데 이미 열 숨기기로 지정되어 있어서 '소계'라는 값이 보이지 않을 것 같아요..ㅠㅠ
sh1, sh2는 Variant로, sh3만 Worksheet로 선언된 겁니다. 앞의 두 개는 타입이 생략된 건데 그럼 Variant로 지정됩니다.
=> Dim sh1 as Worksheet, sh2 as Worksheet, sh3 as Worksheet 이런 식으로 선언하셔야 변수 타입이 의도한 대로 지정됩니다.
Dim i, j, k As Long도 k만 Long으로, i와 j는 Variant로 선언되었습니다. Dim rngE1, rngE2, rngA1, rngA2, rngT As Range도 마찬가지고요. rngE1 등을 range 개채로 제대로 사용하려면 변수 선언할 때 타입을 정확히 지정하시는 게 좋습니다.
변수 타입이 뭐냐에 따라서 변수 앞에 Set을 넣기도 안 넣기도 합니다. 가령 어떤 영역을 Range로 선언하면 변수 앞에 반드시 Set을 써야 합니다. 그럼 그 변수는 Range형태가 됩니다. 그런데 변수 선언에서 타입을 생략하거나 As Variant로 선언하면 Set을 사용할 수 없고 이 변수는 Range가 아니라 Variant 타입이 되어 범위 대신 배열값으로 들어가게 됩니다. 나중에 그 변수를 영역으로 사용하려고 하면 Range 타입이 아니기 때문에 에러가 나겠지요. 예를 들어 영역을 Variant로 선언하면 그 변수는 Range가 아니기 때문에 당연히 Offset이나 Resize 등을 쓸 수가 없고 에러가 발생하겠지요. 그래서 변수 선언 시 반드시 변수 타입을 정확히 지정해 주셔야 합니다.
위처럼 엑셀 함수와 VBA의 변수를 같이 사용하시려면 아래 처럼 큰 따옴표와 '&'로 연결해 주셔야 합니다.
rngE1.Offset(1, 0) = "=Sum(" & rngE2 & ")"
첨부파일에는 시트가 하나밖에 없어서 프러시저를 테스트하지 못 했습니다.
그런데 rngA 등등도 모두 range로 선언했지만 여전히 오류가 나네요
이젠 거의 포기상태인데 작업파일을 올리니 혹시 봐 주시면 감사하겠습니;다
양산택배,샘플택배 2개의 시트를 합산택배 시트로 합산하여 소계를
내는 건데 합산택배 버튼을 누르면 2개가 잘 합쳐지는데 마지막 수량, 금액
소계 산식이 안들어 오네요
에러가 발생했던 합계 내는 부분은 두 가지 잘 못 된 부분이 있었습니다. 계산할 범위와 계산 결과가 들어갈 셀의 범위가 겹치는 '순환참조' 오류가 있었고, SUM 함수를 사용할 때 인수로 셀의 범위가 들어가야 하는데 .Address가 빠져서 계산을 할 수 없었던 겁니다. rngE2 변수를 그냥 String 타입으로 영역을 입력하던지 아니면 Range.Address로 완전한 형태로 넣어줘야 함수 계산이 가능합니다. 아래 수정한 내용을 참고하시기 바랍니다.
Sub 택배합산() Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet Dim i As Long, j As Long, k As Long Dim rngE1 As Range Dim rngE2 As Range Dim rngA1 As Range Dim rngA2 As Range Dim rngT As Range Application.ScreenUpdating = False Rows("5:" & Rows.Count).ClearContents Set sh1 = Worksheets("양산택배") Set sh2 = Worksheets("샘플택배") Set sh3 = Worksheets("택배합산") i = sh1.Range("B1").Value j = sh2.Range("B1").Value k = sh3.Cells(Rows.Count, "c").End(xlUp).Row + 1 sh1.Cells(5, 3).Resize(i, 11).Copy sh3.Cells(k, 3).PasteSpecial xlValues ' sh3.Activate ' Cells(k, 3).Select ' Selection.PasteSpecial xlPasteValues ' Cells(k, 3).Select ' ' Application.CutCopyMode = False sh1.Cells(5, 16).Resize(i, 2).Copy sh3.Cells(k, 16).PasteSpecial xlValues ' sh3.Activate ' Cells(k, 16).Select ' Selection.PasteSpecial xlPasteValues ' Cells(k, 16).Select ' Application.CutCopyMode = False sh1.Cells(5, 14).Resize(i, 2).Copy sh3.Cells(k, 14).PasteSpecial xlValues ' sh3.Activate ' Cells(k, 14).Select ' Selection.PasteSpecial xlPasteFormulas ' Cells(k, 14).Select sh2.Cells(5, 3).Resize(j, 11).Copy sh3.Cells(Rows.Count, "c").End(xlUp)(2).PasteSpecial xlValues ' sh3.Activate ' k = sh3.Cells(Rows.Count, "c").End(xlUp).Row + 1 ' Cells(k, 3).Select ' Selection.PasteSpecial xlPasteValues ' Cells(k, 3).Select ' Application.CutCopyMode = False sh2.Cells(5, 16).Resize(j, 2).Copy sh3.Cells(Rows.Count, "c").End(xlUp)(2).Offset(-j, 13).PasteSpecial xlValues ' sh3.Activate ' k = sh3.Cells(Rows.Count, "c").End(xlUp).Row + 1 ' Cells(k - j, 16).Select ' Selection.PasteSpecial xlPasteValues ' Cells(k - j, 16).Select ' ' Application.CutCopyMode = False sh2.Cells(5, 14).Resize(j, 2).Copy sh3.Cells(Rows.Count, "c").End(xlUp)(2).Offset(-j, 11).PasteSpecial xlPasteFormulas ' sh3.Activate ' k = sh3.Cells(Rows.Count, "c").End(xlUp).Row + 1 ' Cells(k - j, 14).Select ' Selection.PasteSpecial xlPasteFormulas ' Cells(k - j, 14).Select Application.CutCopyMode = False Set rngE1 = Range("K" & Range("B1")) Set rngE2 = Range("K5:K" & Range("B2")) '//합계의 범위는 B1이 맞음 Set rngA1 = Range("O" & Range("B1")) Set rngA2 = Range("O5:O" & Range("B1")) Set rngT = Range("D" & Range("B2")) rngT.Offset(1) = "소계" rngE1.Offset(2, 0) = "=Sum(" & rngE2.Address & ")" '//SUM 함수의 인수는 셀 범위이므로 Address가 들어가야 함 rngA1.Offset(2, 0) = "=Sum(" & rngA2.Address & ")" '//"소계"와 행이 맞지 않아 Offset을 2로 수정 '//합계할 범위(rngE2)와 결과값이 들어갈 범위(rngE1.Offset(1, 0))가 겹치면서 '순환참조 오류'가 발생한 것임 rngA1.Offset(2, 0).Select Application.ScreenUpdating = True End Sub구문이 아주 심플해졌네요~~