아래와 같이 테이블(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
'컴퓨터 > 기타' 카테고리의 다른 글
크롬 단축키(chrome shortcut) (0) | 2020.10.22 |
---|---|
[포토샵] 레이어에 그림 넣기 - 레이어에 이미지 추가 (0) | 2020.09.27 |
중국어(한어) Word 문서에 병음 붙이기 (44) | 2016.12.30 |
WORD VBA - 번체자 제거하고 병음만 남기기 (0) | 2016.12.23 |
unix에서 파일안에 있는 null character space로 대치하기 (0) | 2014.01.17 |