ひできちの楽天ブログ

2026/02/04
XML
カテゴリ: VBA
Excelを使ってデータを整理した内容を
楽天ブログのようなhtmlで記述するサービスに貼り付けたい場合

以下のようなオンラインサービスの合わせ技で解決していたのですが

https://tech-unlimited.com/exceltable.html
Excel to Table | Excel表からHTMLテーブルへ一発変換 | すぐに使える便利なWEBツール | Tech-Unlimited

https://html-css-javascript.com/n-space-tab/
改行・空白・タブ削除ツール|ちょっと便利なツール・ジェネレーター置き場

操作は簡単とは言え作業が2段階になってしまっておりますし
そもそもExcelシート上の操作で完結できるほうが

AIに実装を任せると簡単に作ってくれるので
自分のPCの中で完結できるようになりましたよ

というわけで
範囲指定したエクセルのシートの領域を
html テーブルとしてhtmlソースコードをクリップボードにコピーする
VBA(マクロ)を作ってみましたよ

以下のような感じでマクロを使えば便利という想定ですよ

これは便利すぎますな


 


' WinAPI 方式(DataObject が使えない環境用)
'-----------------------------------------------------------
#If VBA7 Then
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal Destination As LongPtr, _
ByRef Source As Any, _
ByVal Length As LongPtr)
#Else
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal Destination As Long, _
ByRef Source As Any, _
ByVal Length As Long)
#End If

Const CF_TEXT As Long = 1
Const GMEM_MOVEABLE As Long = &H2

Const TABLE_HTML_TAG_OPEN As String = "<table>"
Const TABLE_HTML_TAG_CLOSE As String = "</table>"
Const TR_HTML_TAG_OPEN As String = "<tr>"
Const TR_HTML_TAG_CLOSE As String = "</tr>"
Const TD_HTML_TAG_OPEN As String = "<td>"
Const TD_HTML_TAG_CLOSE As String = "</td>"

Const AMP_HTML_ENCODE As String = "&" & "amp;"
Const LT_HTML_ENCODE As String = "&" & "lt;"
Const GT_HTML_ENCODE As String = "&" & "gt;"
Const DOUBLE_QUOT_HTML_ENCODE As String = "&" & "quot;"
Const SINGLE_QUOT_HTML_ENCODE As String = "&" & "#39;"
'===========================================================
' クリップボードコピー(DataObject → 失敗時は WinAPI)
'===========================================================

Public Sub CopyToClipboard(ByVal text As String)
If TryCopyByDataObject(text) Then
Exit Sub
End If
CopyByWinAPI text
End Sub


'-----------------------------------------------------------
' ① DataObject 方式(標準・最優先)
'-----------------------------------------------------------
Private Function TryCopyByDataObject(ByVal text As String) As Boolean
On Error GoTo ErrHandler

Dim obj As Object
Set obj = CreateObject("MSForms.DataObject")
obj.SetText text
obj.PutInClipboard

TryCopyByDataObject = True
Exit Function

ErrHandler:
TryCopyByDataObject = False
End Function

Private Sub CopyByWinAPI(ByVal text As String)
Dim hMem As LongPtr
Dim pMem As LongPtr
Dim s As String
Dim cb As Long

' 改行を CRLF に統一(HTML なら不要だが念のため)
s = text & vbNullChar

' Unicode のバイト数
cb = LenB(s)

' メモリ確保
hMem = GlobalAlloc(&H2, cb)
If hMem = 0 Then Exit Sub

' ロックしてポインタ取得
pMem = GlobalLock(hMem)
If pMem = 0 Then Exit Sub

' 文字列をコピー
CopyMemory ByVal pMem, ByVal StrPtr(s), cb

' アンロック
GlobalUnlock hMem

' クリップボードへ
If OpenClipboard(0) Then
EmptyClipboard
SetClipboardData 13, hMem ' CF_UNICODETEXT = 13
CloseClipboard
End If
End Sub

Private Function HtmlEncode(ByVal s As String) As String
s = Replace(s, "&", AMP_HTML_ENCODE)
s = Replace(s, "<", LT_HTML_ENCODE)
s = Replace(s, ">", GT_HTML_ENCODE)
s = Replace(s, """", DOUBLE_QUOT_HTML_ENCODE)
s = Replace(s, "'", SINGLE_QUOT_HTML_ENCODE)
HtmlEncode = s
End Function


'改行なしバージョン
Sub SelectionToHtmlTableWithoutWrap_Clipboard()

Dim html As String
Dim r As Long, c As Long, v

html = TABLE_HTML_TAG_OPEN

' 対象範囲
If TypeName(Selection) <> "Range" Then
MsgBox "セル範囲を選択してください。", vbExclamation
Exit Sub
End If
Set rng = Selection

For r = 1 To rng.Rows.Count
html = html & TR_HTML_TAG_OPEN
For c = 1 To rng.Columns.Count
v = HtmlEncode(rng.Cells(r, c).text)
html = html & TD_HTML_TAG_OPEN & v & TD_HTML_TAG_CLOSE
Next c
html = html & TR_HTML_TAG_CLOSE
Next r

html = html & TABLE_HTML_TAG_CLOSE

CopyToClipboard html

MsgBox "改行なしのHTMLテーブルソースコードをクリップボードにコピーしました。", vbInformation

End Sub




'改行ありバージョン
Sub SelectionToHtmlTable_Clipboard()

Dim rng As Range
Dim r As Long, c As Long
Dim html As String
Dim v
Dim objData As Object

' 対象範囲
If TypeName(Selection) <> "Range" Then
MsgBox "セル範囲を選択してください。", vbExclamation
Exit Sub
End If
Set rng = Selection

' HTMLテーブル生成
html = TABLE_HTML_TAG_OPEN & vbCrLf

For r = 1 To rng.Rows.Count
html = html & TR_HTML_TAG_OPEN & vbCrLf
For c = 1 To rng.Columns.Count
v = HtmlEncode(rng.Cells(r, c).text)
html = html & TD_HTML_TAG_OPEN & v & TD_HTML_TAG_CLOSE & vbCrLf
Next c
html = html & TR_HTML_TAG_CLOSE & vbCrLf
Next r

html = html & TABLE_HTML_TAG_CLOSE

' クリップボードへ格納
'動作しない!!!!
'参照設定が必要!
'Microsoft Forms 2.0 Object Library
'Set objData = CreateObject("MSForms.DataObject")
'objData.SetText html
'objData.PutInClipboard

CopyToClipboard html

MsgBox "改行ありのHTMLテーブルソースコードをクリップボードにコピーしました。", vbInformation


End Sub







お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026/02/04 05:31:40 PM
コメント(0) | コメントを書く
[VBA] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

PR

×

キーワードサーチ

▼キーワード検索

カテゴリ

カテゴリ未分類

(41)

楽天サービス

(45)

ポイント生活

(51)

電子書籍

(30)

yahoo

(3)

クレジットカード

(36)

楽天Edy

(35)

楽天銀行デビットカード

(14)

nanacoカード

(8)

WAON

(2)

ジャパンネット銀行

(4)

ECサイト比較

(17)

majica カード

(5)

Tポイント

(3)

動画配信

(81)

デビットカード

(10)

PASMO

(2)

電気自由化

(2)

音楽配信

(9)

楽天ブックス

(9)

au WALLET

(9)

年末商戦

(4)

ふるさと納税

(2)

Yahooプレミアム会員特典

(7)

楽天ポイント獲得数報告

(5)

ポイント交換

(2)

クレカ入会特典

(6)

楽天市場

(7)

電子マネー

(12)

福袋・初売り

(2)

BABYMETAL

(7)

Yahooショッピング

(30)

Yahooクレジットカード

(6)

税金対策

(2)

楽天銀行プリペイドカード

(3)

楽天ペイ

(5)

ゾンビ

(4)

銀行カード

(2)

ヤフオク!

(1)

ポイント・キャンペーン

(23)

Amazon

(3)

Ponta

(2)

ギタリスト

(3)

プリペイドカード

(1)

クーポン・キャンペーン

(18)

暗号・分割・隠蔽

(2)

ガジェット

(43)

プログラミング

(15)

ネット銀行

(7)

Chrome 機能拡張

(1)

リアル銀行

(1)

数学と算数

(14)

格安SIM

(5)

将棋

(89)

クラウド

(14)

国語

(3)

ニュース

(26)

社会

(2)

電子決済

(2)

割引券

(0)

日記

(1)

TIPS

(4)

ソフトウェア

(18)

商品レビュー

(1)

映画視聴

(7)

洋楽

(2)

マンガ

(0)

お買い物パンダ

(1)

3Gケータイ3Gスマホ

(3)

互換オフィス

(4)

IT用語

(0)

地球温暖化

(53)

植民地時代

(0)

古代史

(1)

楽天ポイントビットコイン

(11)

ITの仕事

(1)

楽天購入品リスト

(0)

ご挨拶

(0)

楽天リワード

(1)

Visual Studio

(4)

wikipedia

(1)

コロナ

(1)

python

(4)

地球温暖化懐疑/否定論者

(14)

youtubeライブカメラ

(1)

自然災害

(4)

SNS

(1)

動物

(1)

楽天ブログ

(4)

藤岡幹大

(1)

グレタ

(2)

HTML

(1)

AIの活用

(0)

令和のコメ騒動

(2)

xEV

(2)

スポーツ

(1)

EV

(2)

VSCode

(0)

エネルギー

(1)

snowflake

(4)

Microsoft Copilot

(2)

VBA

(2)

Excel計算式

(1)

Windows

(1)

お気に入りブログ

【重要】接続しづら… 楽天ブログスタッフさん

マックのポテトのL… ミスミ ジローさん

iPhone 17e 本体代1… 楽天家計簿スタッフさん

【重要】ゴールデン… 楽天写真館スタッフさん

【楽天ポイントモー… 楽天ポイントモールさん

【2026年最新】楽天… Rakuten Staffさん

【4月21日】メンテナ… infoseeknewsさん

4月19日(日) シス… 楽天 ブックスさん

[お知らせ]メンテナ… ROOM編集部さん

楽天レシピスタッフB… 楽天レシピスタッフさん

コメント新着

弱火の中火@ Re:ファイル名の先頭に指定文字を付加するバッチとな?(01/25) ひできちくん、最近楽天PLAYの記事見てな…

プロフィール

ひできち(hidekichi45)

ひできち(hidekichi45)


© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: