VBA Excel Direct Export sample1 - bami74/me GitHub Wiki

Private Sub Retrieve_Data()
''On Error GoTo ERR1
    Dim strSql As String
    Dim intRow As Long
    Dim intCol As Integer
    Dim i As Integer
    Dim GetTotRow As Long
    Dim lRet As Long
    Dim strSqlXls As String
    Dim bStopRetrieve As Boolean
    
    bStopRetrieve = False
    
    If F1.NumSheets > 1 Then
        F1.DeleteSheets 2, F1.NumSheets - 1
    End If
    
    F1.Sheet = 1
    
    If l_blnRetrieveData = True Then
        MsgBox "κΈ°μ‘΄ μ‘°νšŒμ€‘μž…λ‹ˆλ‹€. μž μ‹œν›„ κΈ°λ‹€λ Έλ‹€κ°€ 쑰회 λ²„νŠΌμ„ λˆŒλŸ¬μ„œ μ‘°νšŒν•΄μ£Όμ„Έμš”.", vbOKOnly, "μ•Œλ¦Ό"
        Exit Sub
    End If
    l_blnRetrieveData = True
    ''cmdMenu(l_intCancel).Enabled = True     ' μ·¨μ†Œλ²„νŠΌ ν™œμ„±ν™”

    l_intTitleRows = m_ex_lExcelTitleRows
    
    
    If F1.MaxRow > l_intTitleRows Then
        
        DoEvents
        F1.ClearRange l_intTitleRows + 1, 1, F1.MaxRow, F1.MaxCol, F1ClearAll
    
    End If
    
    ''Call g_frmxxx.ShowWaiting(1, 0, "쑰회λ₯Ό μœ„ν•œ μ—‘μ…€ μ‹œνŠΈ(Factor 연동 Sheet) Clear 쀑 μž…λ‹ˆλ‹€..")
    DoEvents

    If F1.NumSheets > 1 Then
        F1.DeleteSheets 2, F1.NumSheets - 1
    End If
    If F1_1.NumSheets > 1 Then
        F1_1.DeleteSheets 2, F1.NumSheets - 1
    End If
    
    ''Call g_frmxxx.ShowWaiting(1, 0, "쑰회 μ€€λΉ„ μ€‘μž…λ‹ˆλ‹€..")
    DoEvents
    
    F1.Row = l_intTitleRows + 1
    F1.Col = 1
    
    
    lblListCount.Caption = ""

    
    Dim strSql_OrderBy As String
    strSql_OrderBy = "  "
    strSql = strSql & strSql_OrderBy
    '----------------------------------------------------------------------------------------------------
    
    
    Dim strSql1 As String
    strSql1 = Replace(strSql, "select /*+rule*/ t.*", "select /*+rule*/ count(*) cnt")
    strSql1 = Replace(strSql1, strSql_OrderBy, "")
    
    '-- λ ˆμ½”λ“œ countλ₯Ό μ–»λŠ”λ‹€. --
    Set g_adoRs = New ADODB.Recordset
    g_adoRs.Open strSql1, g_adoCn
    
    Dim lRecordCount As Long
    lRecordCount = g_adoRs!cnt
    If g_adoRs.State <> adStateClosed Then g_adoRs.Close
        
    '-- 4만건 μ΄ν•˜ λ ˆμ½”λ“œ λͺ©λ‘ 쑰회 ν•œλ‹€. --
    If lRecordCount >= 0 And lRecordCount <= 40000 Then
    
        Set g_adoRs = New ADODB.Recordset
        g_adoCn.CursorLocation = adUseServer
        g_adoRs.Open strSql, g_adoCn
        g_adoCn.CursorLocation = adUseClient
        
        F1.MaxCol = m_ex_lExcelTitleCols
        m_ex_lExcelRowEnd = lRecordCount + m_ex_lExcelTitleRows
        
        If g_adoRs.EOF = True Then
            '-- 타이틀, 데이터 폭, 포맷, μ •λ ¬ μ„€μ • --
            Call exSetWidthHeight(F1)
            
            GoTo NoData
        End If
        
        ''Call g_frmxxx.ShowWaiting(1, 0, "데이터 쑰회 쀀비쀑 μž…λ‹ˆλ‹€..")
        DoEvents
        
        ReDim l_ary_retrieve(lRecordCount, exFindTitleIDX("wc_oc_bt_price"))
        
        ''Call g_frmxxx.ShowWaiting(1, 0, "데이터 쑰회 쀑 μž…λ‹ˆλ‹€..")
        DoEvents
        
        Dim rowcnt As Long
        
        '----------------------------------------------------------------------------------------------------
        '--F1에 쑰회 λͺ©λ‘μ„ 뿌렀주자.
        '----------------------------------------------------------------------------------------------------
        '-- F1 데이터 첫번째 μ€„λ‘œ 이동 --
        m_ex_lRowIndex = m_ex_lExcelRowStart
        
        Dim intViewDbColStart As Integer
        intViewDbColStart = 3
        For rowcnt = 1 To lRecordCount
            
            If (m_ex_lRowIndex - m_ex_lExcelTitleRows) Mod 100 = 0 Or (m_ex_lRowIndex - m_ex_lExcelTitleRows) = (lRecordCount) Then
                g_frmWait.lblcount.Caption = CStr(m_ex_lRowIndex - m_ex_lExcelTitleRows) & " / " & (lRecordCount)
                lblListCount.Caption = "쑰회λͺ©λ‘ : " & g_frmWait.lblcount.Caption
                DoEvents
            End If
            
            If rowcnt >= 40000 Then
                m_ex_lExcelRowEnd = m_ex_lRowIndex
                Exit For
            End If

            If CancelFlag = True Then
                ' μ·¨μ†Œλ₯Ό λˆŒλ €μœΌλ―€λ‘œ, 쑰회λ₯Ό μ’…λ£Œν•œλ‹€.
                
                If MsgBox("쑰회λ₯Ό μ€‘λ‹¨ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?", vbQuestion + vbYesNo, "μ•ˆ λ‚΄") = vbYes Then
                    
                    bStopRetrieve = True
                    MsgBox "μ‘°νšŒμ€‘ μ·¨μ†Œλ₯Ό μ„ νƒν•˜μ˜€μœΌλ―€λ‘œ, 쑰회λ₯Ό μ€‘λ‹¨ν•©λ‹ˆλ‹€.", vbInformation + vbOKOnly, "μ•ˆ λ‚΄"
                    
                    Unload g_frmWait
                    CancelFlag = False
                    
                    ''cmdMenu(l_intCancel).Enabled = False
                    
                    GoTo COPY
                Else
                    CancelFlag = False
                End If
                
            End If
            
            '-- 데이터 λ‹€μŒ μ€„λ‘œ 이동 --
            m_ex_lRowIndex = m_ex_lRowIndex + 1
            
            '-- λ‹€μŒ λ ˆμ½”λ“œ μ…‹μœΌλ‘œ 이동 --
            g_adoRs.MoveNext
        Next
        '----------------------------------------------------------------------------------------------------
    
COPY:
        F1.SetSelection l_intTitleRows + 1, 1, l_intTitleRows + lRecordCount, m_ex_lExcelTitleCols
        F1.SetBorder -1, 1, 1, 1, 1, 0, -1, RGB(190, 190, 190), RGB(190, 190, 190), RGB(190, 190, 190), RGB(190, 190, 190)
    
        '-- 타이틀, 데이터 폭, 포맷, μ •λ ¬ μ„€μ • --
        Call exSetWidthHeight(F1)
        
        '-- Sheet 볡사 --
        F1_1.ClearRange 1, 1, F1_1.MaxRow, F1_1.MaxCol, F1ClearAll
        F1_1.CopyAll F1.SS
        F1_1.FixedRows = 3
        '-- Sheet 볡사 끝 --
        
    
        F1.SetSelection 1, 1, 1, 1
        
        
        Unload g_frmWait
        F1.Modified = False
        m_ex_bModified = False
        
        l_blnRetrieveData = False
        ''cmdMenu(l_intCancel).Enabled = False
        ReDim UPDATE_PRICE_INFOItem(0)
        
        g_adoCn.CursorLocation = adUseClient
        If g_adoRs.State <> adStateClosed Then g_adoRs.Close
            
        
        
    '-- 4만건 초과 λ ˆμ½”λ“œμ— λŒ€ν•œ 처리 λΆ„κΈ° --
    Else
    
        Unload g_frmWait
        
        If lRecordCount > 1048500 Then
        
            MsgBox "μ΅œλŒ€κ±΄μˆ˜κ°€ 1,048,500 건을 λ„˜μœΌλ©΄ ν‘œμ‹œν•  수 μ—†μŠ΅λ‹ˆλ‹€. ", vbInformation + vbOKOnly, "μ•ˆ λ‚΄!"
            GoTo CANCEL_RETRIEVE
        
        End If
        
        If MsgBox(Str(lRecordCount) & "건이 μ‘°νšŒλ˜μ—ˆμŠ΅λ‹ˆλ‹€." & vbCrLf & vbCrLf & "40,000건이 λ„˜μœΌλ―€λ‘œ, Excel 둜 직접 ν‘œμ‹œν•©λ‹ˆλ‹€." & vbCrLf & vbCrLf & "Excel Export λ₯Ό μ§„ν–‰ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?", vbInformation + vbYesNo, "μ•ˆ λ‚΄!") = vbNo Then
        
            GoTo CANCEL_RETRIEVE
        End If
        
        MsgBox "κ±΄μˆ˜κ°€ λ§ŽμœΌλ―€λ‘œ, μ‘°νšŒμ— μ‹œκ°„μ΄ 많이 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€." & vbCrLf & vbCrLf & "κΈ°λ‹€λ €μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€." & vbCrLf & vbCrLf & " *) 진행쀑, κ°œλ³„ Excelμž‘μ—…μ„ ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.", vbInformation + vbOKOnly, "μ•ˆ λ‚΄!"
    
        '-- μ—΄λ €λŠ” 파일λͺ…μœΌλ‘œ 엑셀이 μ—΄λ €μžˆμœΌλ©΄ λ©”μ„Έμ§€ 좜λ ₯ ν›„ μ’…λ£Œ --
        lRet = gGet_ProgHwnd("xxxtemp.xlsx")
        If lRet <> 0 Then
            
            MsgBox "xxxtemp 파일이 이미 μ—΄λ € μžˆμŠ΅λ‹ˆλ‹€. 닫은 후에 μ‘°νšŒν•΄μ£Όμ„Έμš”.", vbCritical, "확인"
            Exit Sub
        End If
    
        GetTotRow = lRecordCount
        ''Call g_frmxxx.ShowWaiting(1, 0, CStr(lRecordCount) & " 건의 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 쀑....")
        
        ''cmdMenu(l_intCancel).Enabled = True     ' μ·¨μ†Œλ²„νŠΌ ν™œμ„±ν™”
    
        
        '-- μ—‘μ…€ νŒŒμΌμ— 직접 μ“°κΈ° --
        Dim strXlFileName As String
        Dim strConnExcel As String
        Dim adoConnExcel As ADODB.Connection
        
        
        strXlFileName = "c:\xxxtemp.xlsx"
        If Dir(strXlFileName) <> "" Then
            Kill strXlFileName
            DoEvents
        End If
    
        strConnExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\xxxtemp.xlsx;Extended Properties='Excel 12.0 xml;HDR=YES';"
        Set adoConnExcel = CreateObject("ADODB.Connection")
        adoConnExcel.ConnectionString = strConnExcel
        adoConnExcel.CursorLocation = adUseServer
        adoConnExcel.Open
    
        
        
        strSqlXls = "CREATE TABLE Sheet1 ("

        For i = 1 To m_ex_lExcelTitleCols
            If i > 1 Then strSqlXls = strSqlXls & ", "

                '-- Chr(34) : " --
                strSqlXls = strSqlXls & Chr(34) & Left$("(" & i & ")" & exTitleItem(i).sColName, 100) & Chr(34) & "   TEXT "
        
        Next

        strSqlXls = strSqlXls & ")"
        adoConnExcel.Execute strSqlXls
        
        
        
        
        Set g_adoRs = New ADODB.Recordset
        g_adoCn.CursorLocation = adUseServer
        g_adoRs.Open strSql, g_adoCn
        g_adoCn.CursorLocation = adUseClient
        
        F1.MaxCol = m_ex_lExcelTitleCols
        m_ex_lExcelRowEnd = lRecordCount + m_ex_lExcelTitleRows

        ''Call g_frmxxx.ShowWaiting(1, 0, "μ—‘μ…€λ‘œμ˜ 데이터 쑰회 쀀비쀑 μž…λ‹ˆλ‹€..")
        DoEvents

        ReDim l_ary_retrieve(lRecordCount, exFindTitleIDX("wc_oc_bt_price"))

        ''Call g_frmxxx.ShowWaiting(1, 0, "μ—‘μ…€λ‘œμ˜ 데이터 쑰회 쀑 μž…λ‹ˆλ‹€..")
        DoEvents


        '----------------------------------------------------------------------------------------------------
        '--F1에 μ €μž₯ 였λ₯˜ λͺ©λ‘μ„ 뿌렀주자.
        '----------------------------------------------------------------------------------------------------
        intViewDbColStart = 3



        For rowcnt = 1 To lRecordCount

            strSqlXls = "INSERT INTO Sheet1 VALUES ("

            For i = 1 To m_ex_lExcelTitleCols
                If i > 1 Then strSqlXls = strSqlXls & ", "
                strSqlXls = strSqlXls & "'" & Replace(NullToBlank(g_adoRs(intViewDbColStart + i - 2).Value), "'", "`") & "'"
            Next

            strSqlXls = strSqlXls & ")"
            adoConnExcel.Execute strSqlXls


            If (rowcnt) Mod 100 = 0 Or (rowcnt) = (lRecordCount) Then
                g_frmWait.lblcount.Caption = CStr(rowcnt) & " / " & (lRecordCount)
                lblListCount.Caption = "쑰회λͺ©λ‘ : " & g_frmWait.lblcount.Caption
                DoEvents
            End If

            If CancelFlag = True Then
                ' μ·¨μ†Œλ₯Ό λˆŒλ €μœΌλ―€λ‘œ, 쑰회λ₯Ό μ’…λ£Œν•œλ‹€.

                If MsgBox("쑰회λ₯Ό μ€‘λ‹¨ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?", vbQuestion + vbYesNo, "μ•ˆ λ‚΄") = vbYes Then

                    bStopRetrieve = True
                    MsgBox "μ‘°νšŒμ€‘ μ·¨μ†Œλ₯Ό μ„ νƒν•˜μ˜€μœΌλ―€λ‘œ, 쑰회λ₯Ό μ€‘λ‹¨ν•©λ‹ˆλ‹€.", vbInformation + vbOKOnly, "μ•ˆ λ‚΄"

                    CancelFlag = False

                    ''cmdMenu(l_intCancel).Enabled = False

                    GoTo STOP_RETRIEVE
                Else
                    CancelFlag = False
                End If

            End If

            '-- λ‹€μŒ λ ˆμ½”λ“œ μ…‹μœΌλ‘œ 이동 --
            g_adoRs.MoveNext
        Next
        '----------------------------------------------------------------------------------------------------

STOP_RETRIEVE:
        
        ''Call g_frmxxx.ShowWaiting(1, 0, "μ—‘μ…€νŒŒμΌμ„ μ—¬λŠ”μ€‘....")
        DoEvents

        adoConnExcel.Close
        Set adoConnExcel = Nothing
        
        DoEvents
        Shell "rundll32 url,FileProtocolHandler " & strXlFileName, vbMaximizedFocus

        Unload g_frmWait
        ''cmdMenu(l_intCancel).Enabled = False

        
        MsgBox "Excel둜의 Exportκ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.", vbOKOnly + vbInformation, "μ•ˆ λ‚΄!"

CANCEL_RETRIEVE:
        Unload g_frmWait
        F1.Modified = False
        m_ex_bModified = False

        l_blnRetrieveData = False
        ''cmdMenu(l_intCancel).Enabled = False
        ReDim UPDATE_PRICE_INFOItem(0)

        
        g_adoCn.CursorLocation = adUseClient
        If g_adoRs.State <> adStateClosed Then g_adoRs.Close
        

    End If
    
    Set g_adoRs = Nothing
    Exit Sub
    
NoData:
    F1.ClearRange m_ex_lExcelTitleRows + 1, 1, F1.MaxRow, F1.MaxCol, F1ClearAll
    
    Unload g_frmWait
    
    g_frmxxx.StatusBar.Panels(g_frmxxx.m_StatusIdx).Text = "μ‘°νšŒν•  데이터가 μ—†μŠ΅λ‹ˆλ‹€"
    
    
    l_blnRetrieveData = False
    
    MsgBox "μ‘°νšŒν•  데이터가 μ—†μŠ΅λ‹ˆλ‹€. ", vbOKOnly, "확인창"
    
    If g_adoRs.State <> adStateClosed Then g_adoRs.Close
    Set g_adoRs = Nothing
    Exit Sub
    
ERR1:
    Unload g_frmWait
    MsgBox Err.Description, vbOKOnly, "였λ₯˜"

    
    l_blnRetrieveData = False
    ''cmdMenu(l_intCancel).Enabled = False
    
    g_adoCn.CursorLocation = adUseClient
    
    If g_adoRs.State <> adStateClosed Then g_adoRs.Close
    Set g_adoRs = Nothing

End Sub