特殊・他 CSSのIDとClass名をHtmlと同時に変更する
※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。
※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。
'*********************************************** 'CSSのIDとClass名をHtmlと同時に変更する '*********************************************** 'CSSは1行づつ並んでいることが条件です。 'http://www.akiyan.com/css_beautifier '↑オンラインで無料で整形可能です(スペースが必要) '先にHTMLの方からIDとClassを探します。 '動作確認済ですがバックアップをとってから実行願います。 '同階層に[変換元][変換先]フォルダが必要です。 '[変換元]フォルダに変更するそれぞれのファイルを入れて実行。 Dim shtDdata As Worksheet Sub 開始1() '*********************************************** 'フォルダ内の全てのファイル取得 '*********************************************** Dim buf As String, tgtPath As String, sbuf As String Dim strExtension As String, OutPath As String Dim TargetFile As String, n As Long Dim sampleName As String strExtension = "*.htm*" '拡張子指定 Set shtDdata = ThisWorkbook.Worksheets("Data") shtDdata.Cells.ClearContents shtDdata.Cells(1, 1).Value = "HTMLID" shtDdata.Cells(1, 2).Value = "→" shtDdata.Cells(1, 3).Value = "変更" shtDdata.Cells(1, 5).Value = "HTMLClass" shtDdata.Cells(1, 6).Value = "→" shtDdata.Cells(1, 7).Value = "変更" shtDdata.Cells(1, 9).Value = "【説明】" shtDdata.Cells(2, 9).Value = "・変更不要な場合は空白のまま。" shtDdata.Cells(3, 9).Value = "・id=""aaa""のaaa部分のみ入力" shtDdata.Cells(4, 9).Value = "・一目で変更したと判るような変更が良い" tgtPath = ThisWorkbook.Path & "\変換元" OutPath = ThisWorkbook.Path & "\変換先" DeleteFile OutPath & "\", strExtension sbuf = Dir(tgtPath & "\" & strExtension) Do While sbuf <> "" n = FreeFile '使われていないファイル番号を自動的に割り振る TargetFile = tgtPath & "\" & sbuf buf = Space(FileLen(TargetFile)) Open TargetFile For Binary As #n 'binaryモードで開いたファイル Get #n, , buf 'からデータを読み込むにはGetステートメントを使う Close #n SearchAllLettersBetween buf, " id=", """", 1 SearchAllLettersBetween buf, " class=", """", 5 sbuf = Dir() Loop sampleName = InputBox("ここでサンプル改変名で入力できます。※英字小文字で入力" _ & vbCr & vbCr & "※全て実行されます。", "サンプル", "sample") If sampleName <> "" Then SampleMaking sampleName 開始2 Else MsgBox "シート" & shtDdata.Name & "を参照し変更後、[開始2]を行って下さい。" End If End Sub Private Sub SearchAllLettersBetween(str As String, strFoundFront As String, strFoundBack As String, lngCol As Long) '************************************************ '文字中の指定文字と指定文字間の文字を全て検索 '************************************************ '引数strは対象文字群 '引数strFoundFrontは前方検索対象文字 '引数strFoundBackは後方検索対象文字 '<例> 'str = "zyzyzyzabc="def"zyzyzyzabc="ghij"zyz" 'strFoundFront = "abc=" 'strFoundBack = """" '返値は [abc="def"] と[abc="ghij"] になります。 '<解説> 'Replace関数で一度検索したものは全て消すところがミソ! '検索文字がなくなるまで実行します。 '書き出したい場合は[Debug.Print Xa]の個所を改変してください。 Dim i As Long, Xa As String, Xb As Long, j As Long reTRY: '再帰① i = InStr(1, str, strFoundFront) '前方検索対象文字位置 If i = 0 Then GoTo TheEnd: '無ければ終了② Xb = InStr(i + Len(strFoundFront) + 1, str, strFoundBack) '後方検索対象文字位置 Xa = Mid(str, i, Xb - i + 1) '値をゲット Debug.Print Xa j = shtDdata.Cells(65536, lngCol).End(xlUp).Row + 1 shtDdata.Cells(j, lngCol).Value = Xa shtDdata.Cells(j, lngCol + 1).Value = "→" str = Replace(str, Xa, "") 'ゲット後は削除する(対象文字群内全て) GoTo reTRY: '再帰① TheEnd: '無ければ終了② End Sub Sub 開始2() '*********************************************** 'フォルダ内の全てのファイル取得 '*********************************************** Dim buf As String, tgtPath As String, sbuf As String Dim strExtension As String, OutPath As String Dim TargetFile As String, n As Long Dim strExtension2 As String Dim i As Long, vrnCSS As Variant, vrnCSS2 As Variant, vrnCSS3 As Variant Dim strA As String, lngCSS As Long Set shtDdata = ThisWorkbook.Worksheets("Data") tgtPath = ThisWorkbook.Path & "\変換元" OutPath = ThisWorkbook.Path & "\変換先" DeleteFile OutPath & "\", strExtension strExtension = "*.htm*" '拡張子指定 strExtension2 = "*.css" '拡張子指定 '=================================================================================== '【HTML】 sbuf = Dir(tgtPath & "\" & strExtension) Do While sbuf <> "" n = FreeFile '使われていないファイル番号を自動的に割り振る TargetFile = tgtPath & "\" & sbuf buf = Space(FileLen(TargetFile)) Open TargetFile For Binary As #n 'binaryモードで開いたファイル Get #n, , buf 'からデータを読み込むにはGetステートメントを使う Close #n strA = buf With shtDdata For i = 1 To .Cells(65536, 1).End(xlUp).Row If .Cells(i, 3).Value <> "" Then If InStr(1, .Cells(i, 1).Value, "=") <> 0 Then strA = Replace(strA, Trim(.Cells(i, 1).Value), "id=""" & Trim(.Cells(i, 3).Value) & """") End If End If Next i For i = 1 To .Cells(65536, 5).End(xlUp).Row If .Cells(i, 7).Value <> "" Then If InStr(1, .Cells(i, 5).Value, "=") <> 0 Then strA = Replace(strA, Trim(.Cells(i, 5).Value), "class=""" & Trim(.Cells(i, 7).Value) & """") End If End If Next i pbsTxtWrites TargetFile, strA End With sbuf = Dir() Loop '=================================================================================== '【CSS】 sbuf = Dir(tgtPath & "\" & strExtension2) Do While sbuf <> "" n = FreeFile '使われていないファイル番号を自動的に割り振る TargetFile = tgtPath & "\" & sbuf buf = Space(FileLen(TargetFile)) Open TargetFile For Binary As #n 'binaryモードで開いたファイル Get #n, , buf 'からデータを読み込むにはGetステートメントを使う Close #n strA = buf With shtDdata For i = 1 To .Cells(65536, 1).End(xlUp).Row If .Cells(i, 3).Value <> "" Then If InStr(1, .Cells(i, 1).Value, "=") <> 0 Then vrnCSS = Split(Trim(.Cells(i, 1).Value), """") strA = Replace(strA, "#" & Trim(vrnCSS(1)) & " ", "#" & Trim(.Cells(i, 3).Value) & " ") End If End If Next i For i = 1 To .Cells(65536, 5).End(xlUp).Row If .Cells(i, 7).Value <> "" Then If InStr(1, .Cells(i, 5).Value, "=") <> 0 Then vrnCSS = Split(Trim(.Cells(i, 5).Value), """") '複数要素設定の場合 vrnCSS2 = Split(Trim(vrnCSS(1))) '原文字 vrnCSS3 = Split(Trim(.Cells(i, 7).Value)) '変更文字 For lngCSS = LBound(vrnCSS2) To UBound(vrnCSS2) strA = Replace(strA, "." & Trim(vrnCSS2(lngCSS)) & " ", "." & Trim(vrnCSS3(lngCSS)) & " ") Next lngCSS End If End If Next i pbsTxtWrites TargetFile, strA End With sbuf = Dir() Loop '=================================================================================== MsgBox "完了" tgtPath = ThisWorkbook.Path & "\変換元" OutPath = ThisWorkbook.Path & "\変換先" Name tgtPath As ThisWorkbook.Path & "\変換元A" Name OutPath As ThisWorkbook.Path & "\変換先A" Name ThisWorkbook.Path & "\変換元A" As ThisWorkbook.Path & "\変換先" Name ThisWorkbook.Path & "\変換先A" As ThisWorkbook.Path & "\変換元" End Sub Private Sub pbsTxtWrites(TxtPath As String, str As String) '******************************************************************************* '指定パスのテキストファイルに書き込み '******************************************************************************* Dim n As Long n = FreeFile '使われていないファイル番号を自動的に割り振る Open TxtPath For Output As #n Print #n, str Close #n ' キーワード 処理 モード ' Input 読み込み 入力モード ' Output 書き込み 出力モード ' Append 書き込み 追加モード ' Random 読み込み/書き込み ランダムアクセスモード(データベースのデータファイルにアクセスするモード) ' Binary 読み込み/書き込み バイナリモード(ファイルのデータを一気に読み込む) End Sub Private Sub DeleteFile(strPath As String, strFileName As String) '************************************** 'ファイルを削除 引数指定 'パスの最後に[\]を付けない '************************************** On Error Resume Next Kill strPath & "\" & strFileName On Error GoTo 0 End Sub Private Sub SampleMaking(str As String) Dim shtDdata As Worksheet, i As Long, vrnCSS As Variant, vrnCSS2 As Variant Dim lngCSS As Long, smName() As String, cntName As Long, blnName As Boolean Dim mkName As String ReDim smName(cntName) As String Set shtDdata = ThisWorkbook.Worksheets("Data") With shtDdata For i = 1 To .Cells(65536, 1).End(xlUp).Row If .Cells(i, 3).Value = "" Then If InStr(1, .Cells(i, 1).Value, "=") <> 0 Then .Cells(i, 3).Value = "id_" & str & "_" & i - 1 End If End If Next i For i = 1 To .Cells(65536, 5).End(xlUp).Row If .Cells(i, 7).Value = "" Then If InStr(1, .Cells(i, 5).Value, "=") <> 0 Then vrnCSS = Split(Trim(.Cells(i, 5).Value), """") '複数要素設定の場合 vrnCSS2 = Split(Trim(vrnCSS(1))) For lngCSS = LBound(vrnCSS2) To UBound(vrnCSS2) '既にあるかチェック blnName = False For cntName = LBound(smName) To UBound(smName) If smName(cntName) = vrnCSS2(lngCSS) Then blnName = True Exit For End If Next cntName If blnName = False Then ReDim Preserve smName(cntName) smName(cntName) = vrnCSS2(lngCSS) cntName = cntName + 1 End If Next lngCSS End If End If Next i For i = 1 To .Cells(65536, 5).End(xlUp).Row If .Cells(i, 7).Value = "" Then If InStr(1, .Cells(i, 5).Value, "=") <> 0 Then vrnCSS = Split(Trim(.Cells(i, 5).Value), """") '複数要素設定の場合 vrnCSS2 = Split(Trim(vrnCSS(1))) mkName = "" For lngCSS = LBound(vrnCSS2) To UBound(vrnCSS2) For cntName = LBound(smName) To UBound(smName) If vrnCSS2(lngCSS) = smName(cntName) Then mkName = mkName & "cls_" & str & "_" & cntName & " " End If Next cntName Next lngCSS .Cells(i, 7).Value = Trim(mkName) End If End If Next i End With End Sub Private Sub test() SampleMaking "smsmsms" End Sub |