結合されたセルの一部を変更するマクロ
我々SIerはMicrosoft Excelに触れる機会が多いと思います。SIerはドヤ顔ですぐExcelを方眼紙にするので頭おかしいと思っている私ですが、Excelをさわっていると、週に一度は、


のコンボをくらうことでしょう。なぜか、結合されたセルに文字列の貼り付けができないのです(編集モードに入ればできるけど、そうすると今度は複数セルにまたがって貼り付けられない)。と、いうことで対策マクロを作りました。もちろんタブ区切りで列、改行区切りで行に貼り付けられます。具体的にはこう。

ここに貼り付けたいとすると、

元になるTSVをコピーして、この例の場合はB3の上でマクロ実行!

以下ソースコード。Ctrl+Shift+Vとかにショートカットキーを割り当てておくと便利です。
Sub paste_value()
Dim cb As New DataObject
Dim sel As Range
Set sel = Selection
If Application.CutCopyMode Then
sel.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Else
' ペーストの起点を決定
Dim st As Range ' ペースト起点
Set st = sel.Range("A1")
' クリップボードからデータ取得
Dim c_rows As Variant
cb.GetFromClipboard
c_rows = Split(cb.GetText, vbCrLf)
' 処理中の行/列番号
Dim i_row As Integer
i_row = st.Row
Dim i_col As Integer
i_col = st.Column
' ペースト処理
For i = LBound(c_rows) To UBound(c_rows)
Dim c_cols As Variant
c_cols = Split(c_rows(i), vbTab)
For j = LBound(c_cols) To UBound(c_cols)
Dim cell As Range
Set cell = Cells(i_row, i_col)
With cell
.Value = c_cols(j)
i_col = i_col + .MergeArea.Columns.Count
End With
Next j
' 改行
i_col = st.Column
i_row = i_row + Cells(i_row, i_col).MergeArea.Rows.Count
Next i
End If
End Sub セルをコピーしているときは、値の貼り付け、文字列をコピーしているときは、結合されたセルの一部を変更貼り付けモードになります。これはきっと多くの場合、期待した動作になることでしょう。