아래와 같이 테이블(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