昨日は、はてなブログでソースコードを折りたたむためのマクロを作成した。
infoment.hatenablog.com
しかし他所様から丸々引用したため意味も解っておらず、結果として複数個所の折り畳み不可となっていた。
ところが先ほど、空腹おやじさんからのご指摘で、原因が判明した
(ありがとうございます)。
z1000s.hatenablog.com
getElementById('oritatami_part')
div id=""oritatami_part""
以上の2箇所の"oritatami_part"が固定だからではないでしょうか?
折りたたみする箇所毎に、oritatami_partを違う値にしなければいけないのでは?
oritatami_partは、ユニーク(唯一無二)であれば、何でも良さそうだ。
ということで、重複しないよう以下をセットすることにした。
oritatami_part_yyyymmdd_hhmmss
- yyyymmdd ⇒ マクロ起動時の年月日
- hhmmss ⇒ マクロ起動時の時分秒
これなら、重複することもないだろう。
ということで、改修したのがこちら。
Sub 折り畳み(Optional ラベル As String = "ソースコード")
Dim myID As String
myID = "oritatami_part_" & Format(Now, "yyyymmdd_hhmmss")
Dim col As Collection
Set col = New Collection
col.Add "<div onclick=""obj=document.getElementById('" & myID & "').style; obj.display=(obj.display=='none')?'block':'none';"">"
col.Add "<a style=""cursor:pointer;"">◆" & ラベル & "(クリックで展開)◆</a>"
col.Add "</div>"
col.Add "<div id=" & myID & " style=""display:none;clear:both;"">"
col.Add ">|vb|"
Dim CB As DataObject
Set CB = New DataObject
CB.GetFromClipboard
Dim temp As String
temp = CB.GetText
Dim SplitSeq As Variant
SplitSeq = Split(temp, vbNewLine)
Dim i As Long
For i = LBound(SplitSeq) To UBound(SplitSeq)
col.Add SplitSeq(i)
Next
col.Add "||<"
col.Add "</div>"
Dim seq As Variant
ReDim seq(1 To col.Count)
For i = 1 To col.Count
seq(i) = col.Item(i)
Next
CB.SetText Join(seq, vbNewLine)
CB.PutInClipboard
End Sub
ついでに、本当は今日アップするつもりで四苦八苦中のコードを載せてみる。
Sub Test()
Dim myObj As Excel.OLEObject
For Each myObj In ActiveSheet.OLEObjects
Debug.Print myObj.progID
Next
End Sub
どうやら、上手くいったようです。
参考まで。