나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내

작성자:  

 이정열 (durian0606)

추천:  2
파일:     견본.xlsm (97KB) 조회:  2517
제목:   엑셀 VBA 26이 아니라 26.0으로 표현하고싶습니다.
     
  '마우스 클릭을 위한 선언하기
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
 
'마우스 좌표 가져오기를 위한 선언하기
Private Type POINTAPI
x As Long: y As Long
End Type
Dim a As POINTAPI
Private Declare Function GetCursorPos Lib "user32" (IpPoint As POINTAPI) As Long
 
'마우스 위치설정을 위한 선언하기
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Const MOUSEEVENTF_LEFTDOWN = 2
Const MOUSEEVENTF_LEFTUP = 4
 
'키보드 상태확인을 위한 선언하기
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
 
'키입력을 위한 선언하기
Const KEYEVENTF_EXTENDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
 
'시간지연(슬립)을 위한 선언하기
Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)


Sub S1_조립률()
    Const most = 540
    Const least = 500
    Const minPass = 4.5
    Const maxPass = 5
    Const minFin = 2.79
    Const maxFin = 2.99
    
    Dim i As Integer
    Dim re(7) As Double
    Dim fin As Double
    Dim fin2 As Double
    Dim pass As Double
    Dim pass2 As Double
    Dim rBase As Variant
    Randomize Timer
    rBase = Array(0, 20, 30, 120, 140, 110, 50, 20)
    
    Sheets("S1 조립률 (1)").Select
    
    
    Do
        re(0) = 0
                        
        For i = 1 To 7
            re(i) = CInt(Rnd() * 201 - 0.5) / 10 + rBase(i)
            re(0) = re(0) + re(i)
        Next i
        pass = Round(re(1) / re(0) * 100, 1)
        fin = Round(((re(1) / re(0) * 100) _
                + ((re(1) + re(2)) / re(0) * 100) _
                + ((re(1) + re(2) + re(3)) / re(0) * 100) _
                + ((re(1) + re(2) + re(3) + re(4)) / re(0) * 100) _
                + ((re(1) + re(2) + re(3) + re(4) + re(5)) / re(0) * 100) _
                + ((re(1) + re(2) + re(3) + re(4) + re(5) + re(6)) / re(0) * 100)) / 100, 2)
                            
    Loop Until re(0) >= least And re(0) <= most And _
               pass >= minPass And pass <= maxPass And _
               fin >= minFin And fin <= maxFin
                   
        Cells(10, 3) = re(0)
        Cells(7, 7) = fin
        Cells(11, 4) = pass
        
    For i = 1 To 7
        Cells(10 + i, 2) = re(i)
        Sheets("DB").Cells(1 + i, 13) = re(i)
        
    Next i
    
'***************************************************************************************************************************
Sheets("S1 조립률 (2)").Select
    
    minPass2 = pass - 0.1
    maxPass2 = pass + 0.1
    minFin2 = fin - 0.05
    maxFin2 = fin + 0.05
    
    Do
        re(0) = 0
                
        For i = 1 To 7
            re(i) = CInt(Rnd() * 201 - 0.5) / 10 + rBase(i)
            re(0) = re(0) + re(i)
        Next i
        
        pass2 = Round(re(1) / re(0) * 100, 1)
        
        fin2 = Round(((re(1) / re(0) * 100) _
                + (((re(1) + re(2)) / re(0)) * 100) _
                + (((re(1) + re(2) + re(3)) / re(0)) * 100) _
                + (((re(1) + re(2) + re(3) + re(4)) / re(0)) * 100) _
                + (((re(1) + re(2) + re(3) + re(4) + re(5)) / re(0)) * 100) _
                + (((re(1) + re(2) + re(3) + re(4) + re(5) + re(6)) / re(0)) * 100)) / 100, 2)
            

                
    Loop Until re(0) >= least And re(0) <= most And _
               pass2 >= minPass And pass2 <= maxPass And _
               fin2 >= minFin And fin2 <= maxFin And _
               pass2 >= minPass2 And pass2 <= maxPass2 And _
               fin2 >= minFin2 And fin2 <= maxFin2
                             
        Cells(10, 3) = re(0)
        Cells(7, 7) = fin2
        Cells(11, 4) = pass2
        
    For i = 1 To 7
        Cells(10 + i, 2) = re(i)
        Sheets("DB").Cells(9 + i, 13) = re(i)
    Next i
    
       Sheets("DB").Select
=====================================================================
윗부분 코드중 견본파일에 빨간셀부분에 표시되는 소숫점 첫째자리까지 표현하고 싶은데 다른숫자들은 되는데 26.0 처럼 뒤에 0이 표현이 안됩니다.
FORMAT,FORMATNUMBER 등등 다 해봤는데 표현이 안되네요...
뭐가 잘못된걸까요? 직접실행으로는 되는데요
 
[불량 게시물 신고]  
조삿갓Cells(10 + i, 2) = Format(re(i), "0.0")
Cells(10 + i, 2).NumberFormat = "0.0"

두 번째 명령은 엑셀 시트 메뉴를 실행하여 미리 세팅해 주어도 됩니다.
VBA에서 Format 함수를 이용하여 끝수 처리를 아무리 잘 해 주었다고 해도, 그것이 시트에 출력되었다면, 눈에 보이는 모양은 또 시트 서식(셀 서식)에 의해 최종 결정됩니다. 따라서, 셀 서식을 그에 맞추어 조정해 주어야 합니다.
10-01 (17:11)
삭제 ■신고
조삿갓가만 보니, re 배열에는 이미 Cint나 Round 함수를 이용하여 소수 첫째자리까지 끝수처리 완료된 값이 들어가네요?
그러면 다음과 같이 간단히 하셔도 되겠습니다.

With Cells(10 + i, 2)
   .Value = re(i)
   .NumberFormat = "0.0"
End With

With Sheets("DB").Cells(9 + i, 13)
   .Value = re(i)
   .NumberFormat = "0.0"
End With
10-01 (17:46)
삭제 ■신고
이정열조삿갓님 매번 답변 감사합니다.
덕분에 정말 업무효율이 부쩍 오르고 있습니다.
헌데 답변해주신대로 
With Cells(10 + i, 2)
   .Value = re(i)
   .NumberFormat = "0.0"
End With

With Sheets("DB").Cells(9 + i, 13)
   .Value = re(i)
   .NumberFormat = "0.0"
End With
이렇게 해서 문제 해결은 됐습니다 그런데 
        Cells(10 + i, 2) = re(i)
        Sheets("DB").Cells(9 + i, 13) = re(i)
이방법과 언듯 보면 같아보이는데 차이점이 무엇인지 여쭤봐도 될까요?
10-10 (16:59)
삭제 ■신고
이정열저도 format등등 다 써봤는데 해결되지 않았는데요10-10 (17:01)
삭제 ■신고
조삿갓어떤 방법으로 하든, 실제로 해당 셀에 저장되는 값은 26입니다. 이것을 26으로 보이게 할 것인지, 26.0으로 보이게 할 것인지는 '셀 서식'이 결정하는 것입니다.
format 함수는 수치 데이터를 문자열로 변환해서 "26.0"으로 만들어주지만, 이것을 셀에 단순 대입하게 되면 워크시트의 기본 기능에 의해서 수치로 해석하여 26으로 바꾸어 저장해 버리기 때문에 해결이 안되는 것처럼 보이는 것이지요.
Cells(10 + i, 2) = format(re(i),"'0.0")
로 저장하면 첫 문자  ' 때문에 강제로 문자열로 해석하여 26.0으로 보이긴 하겠지요. 그러나 이 방법으로 저장하게 되면 셀에 있는 값은 문자열이기 때문에 다른 값들과 사칙연산이 불가합니다.(뭐 굳이 하려면 또 VALUE 함수를 쓰면 되겠지만... 좀 복잡한 바보 짓이겠죠?)
10-11 (16:17)
삭제 ■신고
조삿갓좀 더 효율적으로 하려면, 셀 서식 지정은 VBA로 그 때 그 때 일일이 하는 것보다는 그냥 워크시트 메뉴에서 해당 행 또는 열 전체를 소숫점 자리수 지정을 해 주면, 이정열님께서 말씀하신 두 번째 방법으로 대입해도 원하는 결과를 얻겠지요.10-11 (16:20)
삭제 ■신고
        
  

작성일 : 2017-09-30(15:13)
최종수정일 : 2017-10-01(07:33)