ExcelVBA와 투시표로 자신의 상식적인 작은 사전을 만드는 데 능숙하다

14106 단어

I. 디자인 구상


어느 분야에서든 신인이든 베테랑이든 업무 중에 명사를 자주 사용해서 정리를 해야 할 수도 있다.이런 상대적인 저주파도, 분류 귀납 정렬 등에 대해 일정한 요구가 있는 작업에 엑셀은 적합한 실현 방식이다.
Excel이 "분류 요약"과 같은 지능적인 원클릭 생성 도구를 제공하는 것은 사실이지만, 그 효과는 보기와 인쇄에 약간 불편하고, 일부 불필요한 이름과 숫자도 생겼다.
그림 1: 영역별 데이터 요약
이때 Excel에서 또 다른 자주 사용하는 기능인'데이터 투시표'가 생각나고 양식과 미관의 분류가 명확하다.문제는 생성된 투시표에 대해 원시 문자가 아닌 통계 숫자만 표시할 수 있고 표두도 원래 이름으로 바꿀 수 없다는 것이다.
그림 2: 자동으로 생성된 데이터 투시표
만약에 데이터 투시표처럼 분류하여 표시하고 문자와 헤더를 정상적으로 표시할 수 있다면 그것은 매우 좋은 것이다. 좋은 것은 간단한 VBA를 결합하면 이런 목적에 도달할 수 있다.

II. 실현 방식


다음 절차에 따라 우리의 생각을 실현한다.
  • 기본 데이터 원본 양식을 작성하여 이 양식에서 단어를 계속 업데이트할 수 있음
  • 버튼 컨트롤을 클릭하면 VBA로 해당 투시표 자동 생성
  • 투시표를 작업표에 자동으로 복사합니다. 이 표는 일반적인 편집 가능한 데이터입니다
  • 새 표의 유용한 데이터를 식별하고 원본 표에서 원본 문자 찾기
  • 교체 및 형식 정리 완료
  • 그림 3: 원본 테이블
    그림 4: 이니셜로 요약
    그림 5: 영역별 요약

    III. 테이블 초기화


    먼저 만들어진 것은 scopes_sheet 작업표로 단어가 귀납된 영역을 일일이 열거하고 원본 테이블에서 밑에 있는 선택 동작을 실현한다.
    그런 다음 원본 테이블source_sheet을 작성하여'이름, 전칭, 별칭, 해석'몇 열의 데이터를 채우고'영역'일열의 데이터 검증을 scopes_sheet에서 열거한 서열로 설정합니다.
    두 개의 버튼 컨트롤을 삽입하여 적절한 매크로를 지정합니다.
    그리고 개발 도구의 VBA 개발 환경에 들어가 코드를 작성하기 시작합니다 (formac에 버그가 있을 수 있습니다. 이 예는 Excel 2016 for Windows 개발을 기반으로 합니다)

    IV. VBA 지식 포인트


    이상 포착


    다른 언어 try...catch 와 비슷하게 VBA 의 잘못된 캡처는 다음과 같습니다.
    On Error GoTo errfailback
        '  try  
    errfailback:
        '  catch  
        If Err.Number <> 0 Then
            Debug.Print (Err.Description)
        End If
        Resume errresume
    errresume:
        '  finally  

    테이블에서 행렬의 최대 범위를 얻을 수 있는 몇 가지 방법:

    Dim lastCol As Long, lastRow As Long
    lastCol = Sheet1.Cells(1, Sheet1.Columns.Count).End(xlToLeft).Column
    lastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).row
    Dim name As String, row As Integer
    For row = 2 To Sheet1.UsedRange.Rows.Count
        name = Sheet1.Cells(row, 1).Value
    Next row

    데이터 원근 테이블 만들기

    Dim pvtTable As PivotTable
    Set pvtTable = Sheet1.PivotTableWizard
    
    'specify row & col
    pvtTable.AddFields _
        RowFields:=Array(COL_FIRST, COL_NAME), _
        ColumnFields:="Data"
    
    'sepcify data fields
    Dim dfName As String, pvtField As PivotField
    For i = 2 To lastCol
        dfName = Sheet1.Cells(1, i).Value
        Set pvtField = pvtTable.PivotFields(dfName)
        pvtField.Orientation = xlDataField
        pvtField.Function = xlCount
    Next i

    복제 테이블

    sheet.Range(Cells(1, 1), Cells(lastRow, lastCol)).Select
    Selection.Copy
    
    Dim ShtName As String
    ShtName = Replace(PvtName, "pvt_", "sheet_")
    
    Sheets.Add.Select
    ActiveSheet.name = ShtName
    Cells(1, 1).Select
    Selection.PasteSpecial _
        Paste:=xlPasteValues, _
        Operation:=xlNone, _
        SkipBlanks:=False, _
        Transpose:=False
    
    Sheets(ShtName).Select
    ActiveSheet.Move after:=Sheets(Sheets.Count)

    한자의 이니셜을 추출하다

    Function toPinyin(p As String) As String
        Dim i As Long
        i = Asc(p)
        Select Case i
            Case -20319 To -20284: toPinyin = "A"
            Case -20283 To -19776: toPinyin = "B"
            Case -19775 To -19219: toPinyin = "C"
            Case -19218 To -18711: toPinyin = "D"
            Case -18710 To -18527: toPinyin = "E"
            Case -18526 To -18240: toPinyin = "F"
            Case -18239 To -17923: toPinyin = "G"
            Case -17922 To -17418: toPinyin = "H"
            Case -17417 To -16475: toPinyin = "J"
            Case -16474 To -16213: toPinyin = "K"
            Case -16212 To -15641: toPinyin = "L"
            Case -15640 To -15166: toPinyin = "M"
            Case -15165 To -14923: toPinyin = "N"
            Case -14922 To -14915: toPinyin = "O"
            Case -14914 To -14631: toPinyin = "P"
            Case -14630 To -14150: toPinyin = "Q"
            Case -14149 To -14091: toPinyin = "R"
            Case -14090 To -13319: toPinyin = "S"
            Case -13318 To -12839: toPinyin = "T"
            Case -12838 To -12557: toPinyin = "W"
            Case -12556 To -11848: toPinyin = "X"
            Case -11847 To -11056: toPinyin = "Y"
            Case -11055 To -2050: toPinyin = "Z"
            Case Else: toPinyin = p
        End Select
    End Function

    행 높이 자동 변환 및 조정

    Columns(3).ColumnWidth = 20
    Columns(lastCol).ColumnWidth = 40
    Range(Cells(1, 1), Cells(lastRow, lastCol)).Rows.WrapText = True

    인쇄 영역 및 배율 설정

    With ActiveSheet.PageSetup
        .FitToPagesWide = 1
        .FitToPagesTall = False
    End With

    SQL로 워크시트 질의


    이것은 Excel VBA에서 가장 실용적인 기능이라고 할 수 있다. 외부 데이터 원본을 사용하지 않고 작업표를 직접 조회한다.
    Dim cn As ADODB.Connection
    Dim rs As ADODB.recordSet
    
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName _
        & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    
    Dim sql As String
    sql = "SELECT * FROM [source_sheet$] WHERE [" & COL_NAME & "] = '" & theName & "';"
    
    rs.Open sql, cn
    
    ...
    Cells(r, c).Value = rs.Fields(theField).Value
    ...
    
    cn.Close
    Set cn = Nothing
    Set rs = Nothing

    V. 전체 코드

    https://bitbucket.org/tonylua/useful_words_for_web
    주의사항 등은 상기 링크의 설명을 참고할 수 있다

    VI. 참고 자료

  • baike.baidu.com/item/데이터 투시표/...
  • msdn.microsoft.com/zh-cn/libra…
  • jingyan.baidu.com/article/63a…
  • stackoverflow.com/questions/5…
  • stackoverflow.com/questions/2…
  • software-solutions-online.com/excel-vba-w…
  • www.exceltip.net/thread-3949…
  • stackoverflow.com/questions/1…
  • bbs.csdn.net/topics/6013…
  • www.w3school.com.cn/ado/ado_ref…
  • stackoverflow.com/questions/3…
  • zhidao.baidu.com/question/31…
  • msdn.microsoft.com/en-us/libra…
  • www.ozgrid.com/forum/forum…
  • blog.163.com/ycy_sdfc/bl…
  • blog.csdn.net/iamlaosong/…
  • www.experts-exchange.com/questions/2…

  • (end)

    좋은 웹페이지 즐겨찾기