none
도움 요청 vba -> vb.net변환 RRS feed

  • 질문

  • vba로 짜던 건데 vb.net로 변환해보니

    속도가 너무 늦어 쓸수가 없는데

    어떻게 하면 빨라 질까요

    <참고>

     'objBOOK.Sheets.Count = 150,000개 입니다.

    '=========================

    Dim shp As Shape
     For Each shp In ActiveSheet.Shapes
        If shp.Type = msoPicture Then
            shp.Delete()
        End If
     Next

    'vb.net

    Imports System.IO   '화일 입출력
    Imports excel = Microsoft.Office.Interop.Excel '엑셀
    Imports Microsoft.Office.Core

     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

            Dim objExcel As excel.Application
            Dim objBOOK As excel.Workbook
            Dim objsheet As excel.Worksheet

            Dim FILES_명 As String
            Dim SHEET_명 As String

            '바탕 화면 경로
            Dim Desktop As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)

            With OpenFileDialog1
                .Filter = "Excel files (*.xls,*.xlsx)|*.xls*"
                .FileName = ""
                .InitialDirectory = Desktop 'App_Path()

                .Title = "Excel 화일 불러오기"
                .ShowDialog()
                OPEN화일명 = .FileName '선택 된 화일 이름
            End With

            FILES_명 = OPEN화일명 

            objExcel = CreateObject("Excel.Application")  '엑셀 어플리케이션 생성
            objBOOK = objExcel.Workbooks.Open(FILES_명)

            Dim myTableName(objBOOK.Sheets.Count) ' SHEET 갯수 만큼 변수갯수 만들기

            For i = 1 To objBOOK.Sheets.Count
                myTableName(i) = objBOOK.Sheets.Item(i).NAME
            Next

            For I = 1 To objBOOK.Sheets.Count
                SHEET_명 = myTableName(I)
                objsheet = objBOOK.Worksheets.Item(SHEET_명)

                Dim shp As excel.Shape
                Dim AA = objsheet.Shapes.Count
                For Each shp In objsheet.Shapes
                    If shp.Type = MsoShapeType.msoPicture Then
                        shp.Delete()
                    End If
                Next
            Next I

            FILES_명 = 1 & FILES_명
            objBOOK.SaveAs(FILES_명)

            objBOOK.Close()  '화일 닫기
            objExcel.Quit()
            objExcel = Nothing '엑셀프로그램 종료

    • 편집됨 박희철 2016년 3월 14일 월요일 오전 8:12
    2016년 3월 14일 월요일 오전 4:35

답변

  • objBOOK.Sheets.Count 값이 15만개인데 그 값을 이용하는 루프가 두 개나 있네요.

    물론 컴퓨터 성능이 좋거나 루프 내에서 처리하는 작업이 가볍다면 빠르게 끝날 수 있지만, 빈 루프를 돌리거나 가벼운 작업을 해도 그 정도의 숫자면 약간 딜레이가 생기는 것을 감안하면 염두해 두어야 할 부분 같습니다.

    그리고 나머지는 코드로 봐서는 파악이 어렵고 디버깅을 해봐야 알 수 있는 부분인데, Visual Studio 2015 사용 중이라면, 아래 그림과 같이 각 라인을 처리할 때 얼마나 시간이 걸리는지 확인할 수 있으므로 line by line으로 어떤 줄에서 처리 시간이 오래 걸리는지 확인을 해보시는 것이 좋을 것 같습니다. 해당 라인의 처리 속도가 납득이 안 되신다면 그 때 다시 한번 질문을 올려보시는 것이 좋을 것 같습니다.

    2016년 9월 10일 토요일 오전 4:53