블로그 이미지
이비그치면

태그목록

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

아래와 같이 테이블(18*2)을 생성하고 생성한후에 랜덤하게(무작위로) 첫째칼럼의 열과

둘째칼럼의 열을 shading/hiding 하는 vba이다

단어장을 만들고 랜덤하게 뜻과 의미를 감추어 단어암기에 도움을 주기위해 만들었다

vba로 만들어져 매번 실행시마다 감추어지고 드러나는 셀들이 변경된다


Sub MakeTable()

    '--- 먼저 18*2  [row(행):18, col(열):2]테이블을 만든다
    ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=18, NumColumns:= _
            2, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
            wdAutoFitFixed
    With Selection.Tables(1)
        If .Style <> "표 구분선" Then
            .Style = "표 구분선"
        End If
        .ApplyStyleHeadingRows = True
        .ApplyStyleLastRow = False
        .ApplyStyleFirstColumn = True
        .ApplyStyleLastColumn = False
        .ApplyStyleRowBands = True
        .ApplyStyleColumnBands = False
    End With
    
    '--- 두번째 렬(column)에서 행(row)을 둘로 나눈다
    x = 1
    nTab = ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.Count
    nRows = ActiveDocument.Tables(nTab).Rows.Count
    For i = 1 To nRows
        ActiveDocument.Tables(nTab).Cell(x, 2).Split NumRows:=2
        x = x + 2
    Next
    
End Sub

워드(WORD) VBA에서 

위와 같은 형태의 행이 합쳐진(vertically merged cell) 테이블(TABLE)내의 특정 셀(cell)이  merge되어있는지를 check하는데에는 약간의 어려움이 있다

그리고 랜덤으로 특정셀을 가리거나 드러내는 작업도 좀 복잡하다



Sub RandomHiding()

Dim R As Row
Dim C As Cell
Dim RowSpan, iCol, iRow

Const lo = 1
Const hi = 18
Const itms = 1

Dim i, k As Integer
Dim x As Variant

    '--- 먼저 전체 숫자집합(원소수 18)에서 몇개를 선택할것인가를 임의로 결정
    '--- 여기에선 6개이상 9개이하로 함
    Do While 1
        x = getRandomNumbers(lo, hi, itms)
    
        For i = lo To hi
            If x(i) = True Then k = i
        Next i
        If (k > 5) And (k < 10) Then
            Exit Do
        End If
    Loop
    
    '--- 다시 무작위로 위에서 정해진 갯수(k) 만큼의 숫자를 선택함
    x = getRandomNumbers(lo, hi, k)
    
    '--- 이제 테이블의 셀들을 돌면서 위에서 정해진 위치의 셀을 찾아
    '--- hiding/shading 한다
    
    Set tbl = ActiveDocument.Tables(1)
    
    For Each C In tbl.Range.Cells
        C.Select
        
        '--- 해당셀이 열병합(vertically merged)되어있는지 check
        RowSpan = (Selection.Information(wdEndOfRangeRowNumber) - _
            Selection.Information(wdStartOfRangeRowNumber)) + 1
        If RowSpan > 1 Then
            If x(Fix(C.RowIndex / 2) + 1) = True Then
                tbl.Cell(C.RowIndex, 1).Shading.BackgroundPatternColor = wdColorGray25
            End If
        Else
            If x(Ceiling(C.RowIndex / 2)) = False Then
                tbl.Cell(C.RowIndex, 2).Shading.BackgroundPatternColor = wdColorGray25
            End If
        End If
    Next C
End Sub

Function getRandomNumbers(lo As Integer, hi As Integer, toSelect As Integer)
'--- 기능 : 특정범위의 연속된 숫자집합에서 지정된 갯수만큼 무작위로 선택
'---        배열(boolean array)을 return(선택된 숫자들이 array index가 되고 그값은 true)
'---        예를 들어 1..18까지고 3개를 random으로 뽑은 숫자가 1,7, 17 이라면
'---        retArr(1) = True, retArr(7) = True, retArr(17) = True
'--- 입력값 : lo : 숫자집합의 최저값, hi : 숫자집합의 최고값, toSelect : 선택할 갯수
'--- 결과값 : 배열(boolean array)

    ReDim Items(lo To hi) As Variant
    Dim selected As Integer
    
    Randomize
    
    Do While selected < toSelect
        Dim rec As Integer
        rec = Int((hi - lo + 1) * Rnd + lo)
        If Items(rec) = False Then
            Items(rec) = True
            selected = selected + 1
        End If
    Loop

    getRandomNumbers = Items
    
End Function

Function Ceiling(Number As Double) As Long
'--- 기능: 소숫점 이하값 무조건 올림

    Ceiling = -Int(-Number)
    
End Function