VBA・マクロツール

【知らなくても使える】セル内の最初または最後に指定した値を貼り付けるアドイン(Excel VBA)

Excel内でコピーをして貼り付けを行う際に、複数セルにまたがった範囲をコピーして貼り付けた場合は、複数セルに対してコピーした値がそのまま貼り付けられます

 

これを、貼り付け先セルの元の値はそのままにして、そこに追加で値を貼り付けたい場合は、関数を別のセルで使用して実現する等で大変手間がかかります。

 

貼り付け先のセル内に既にある値はそのままにして、その値の最初か最後に貼り付けたい場合に、通常のExcelでそのような動作を実現する機能はありませんでした。

 

そんな場面で、無駄な作業が効率化できる『セルの最初または最後に値を貼り付けるツール』をExcel VBAのアドインで作りました。

 

当記事にはマクロの元になるExcelファイルがダウンロード可能で、VBAのコードも記事内に記載がありますので、Excel VBAやマクロが良く分からないという方でもすぐに使用できます

当ツールを使用すれば定例業務の業務効率化が図れるかと思いますので、是非ご活用頂けたらと思います。

 

『セルの最初または最後に値を貼り付けるツール(アドイン)』の概要

ExcelにVBAコードを入れてマクロを作成し、アドインとして保存します。

 

そのアドインを取込むとリボンに「コピペ」というタブが表示されるので、コピーした値または文字を指定して、任意のセルを選択した状態で、貼り付けボタンを押すことで該当のマクロを実行でき、元のセルの値をそのままで、セルの最初か最後に値を貼り付けることができます。

 

基本的な機能、操作方法の説明

  1. セルの最初または最後に貼り付けを実行したい(マクロを実行したい)任意のExcelファイルを開きます。
  2. 「開発」タブの「Excelアドイン」より、作成したアドインファイルを指定(参照)します。

※選択するExcelアドインは、当ぺージ内のツールをダウンロードしてVBAコードを貼り付けたアドインファイルを選択してください。

 

アドインを設定出来たら、上部リボンのタブに「コピペ」が追加されます。

 

❶-1:貼り付ける値をセルからコピーする

  1. リボンにある「コピペ」を選択します。
  2. 「値」→「セルからコピー」をクリックします。
  3. セルを選択した状態でコピー(Ctrl+C)をします。

 

  1. 貼り付けたいセルを選択します。
  2. 「コピペ」タブにある「セル内に貼り付け」をクリックします。

選択したセルに既にある値はそのままで、セルの値の最初にコピーしたセルの値が貼り付けられました。

※貼り付ける位置は、初期値として「セルの最初」になっているため、セルの先頭に貼り付けられます

 

❶-2:貼り付ける値を指定した文字にする

  1. 「値」→「文字を指定」を選択します。
  2. 指定文字に任意の値を入力します。
  3. 貼り付けるセルを選択します。
  4. 「セル内に貼り付け」をクリックします。

すると、コピーした値でなく、「指定文字」で指定した文字がセル内の最初に貼り付けられました。

 

「値」の選択肢をまとめると以下になります。

<貼り付ける値>

  • セルをコピー:セルなどをコピーしてクリップボードにある値を貼り付けることができます
  • 文字を指定:「指定文字」に記入した値を貼り付けることができます

 

❷:貼り付ける位置をセルの最初またはセルの最後にする

「位置」→「セルの最後」を選択し、指定文字に任意の値を入力して、セルを選択した状態で「セル内に貼り付け」をクリックすると、貼り付ける位置を「セルの最初」でなく「セルの最後」に貼り付けることができます。

「位置」の選択肢をまとめると以下になります。

<貼り付ける位置>

  • セルの最初:セルに既にある値の”一番最初”に、指定した値を貼り付けることができます
  • セルの最後:セルに既にある値の”一番最後”に、指定した値を貼り付けることができます

 

リボンに表示されている文字等のデザインを変更する場合は、【解説】リボンに表示されたExcelアドインのデザインを変更する方法を参照ください。

 

留意事項

セルからコピーした値を貼り付ける場合、複数のセルをコピーした状態で、一つのセルを選択して貼り付けを行うとコピーしたセル分(複数セル分)貼り付けられます。

※Excelで複数セルをコピーし、一つのセルを選択して貼り付けをした場合と同じ挙動となります。

 

使用する際の事前準備

このページの下部にある「Excelファイルのサンプル」からExcelファイルを取得し、「準備の手順」内にあるVBAコードを取得したExcelファイルに記載して保存すれば、すぐに当ツールを使用できます。

 

以下にその手順を説明していきます。

 

準備の手順

サンプルのダウンロードはこちら」からサンプル(Excelファイル)をダウンロードします。
※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています

 

<手順1>

ダウンロードしたExcelファイルを開いて、VBE(Visual Basic Editor)を起動させます。

  1. Excelファイルの上部にあるリボンの「開発」タブを選択します。
  2. 「Visual Basic」をクリックして、VBE(Visual Basic Editor)を起動させます。

 

リボンに「開発」タブが表示されていない場合は、以下を参照ください。
(参考サイト:記事「Excel VBAを始める前に、最初にやっておくべき初期設定内容はこれ」の『開発』タブを表示させる

 

<手順2>

  1. 左欄にある「Microsoft Excel Object」を右クリックします。
  2. 「挿入」を選択します。
  3. 「標準モジュール」をクリックします。

 

<手順3>

  1. 「Module1」をダブルクリックして、表示されている右側の欄(エディター)に以下のVBAコードを記載します。

 

VBAのソースコードはこちら

以下のVBAコードをコピーして、「Module1」内のエディターに貼り付けます。

※VBAコードの右上のアイコンをクリックするとソースコードをコピーできます

Option Explicit

'-----(設定値)------------------------
Private Const PLACE_FIRST = "1"         '1.セルの最初(貼り付け位置)
Private Const PLACE_END = "2"           '2.セルの最後(貼り付け位置)
Private Const SELECT_CELL = "1"         '3.セルからコピー(コピーする値)
Private Const SELECT_WORD = "2"         '4.指定文字(コピーする値)
'---------------------------------------

Private RbRibbon As IRibbonUI           'リボン
Private SetPlace As String              '貼り付け位置
Private SetCopyType As String           '貼り付ける値
Private SpecifiedWord As String         '指定文字(コピーする値)
Private CellValue As String             'コピーしたセルの値(コピーする値)

'===================================
'リボンの初期処理
'===================================
Sub onLoad(ribbon As IRibbonUI)

    'リボンの表示を更新できるようにするためにリボンをセットする
    Set RbRibbon = ribbon
    RbRibbon.Invalidate
    SetPlace = PLACE_FIRST          '初期値:貼り付け位置 セルの最初
    SetCopyType = SELECT_CELL       '初期値:貼り付ける値 セルからコピー
    
End Sub

'===================================
'セル内に貼り付ける際の処理
'===================================
Sub Paste_onClick(control As IRibbonControl)

    Dim tmpValueArr() As Variant
    Dim cntRow As Long, cntCol As Long, i As Long, j As Long
    Dim tmpValue As String

    Dim c As Range
    Set c = Selection
    
    Dim obj As Object
    Set obj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        
    '貼り付ける値をセルからコピーとした場合
    If SetCopyType = SELECT_CELL Then

        obj.GetFromClipboard
        
        'クリップボードのコピーデータが存在する場合
        If obj.GetFormat(1) Then
        
            '最後の改行を取り除く処理
            CellValue = TrimLWord(obj.getText)
            
        Else
            CellValue = ""
        End If
        
        Dim arrTabSpecifiedWord As Variant
        Dim arrLFSpecifiedWord As Variant
        
        arrLFSpecifiedWord = Split(CellValue, vbCrLf)
        
        'クリップボードにある値において改行の数だけ繰り返す
        For i = 0 To UBound(arrLFSpecifiedWord)
        
            arrTabSpecifiedWord = Split(arrLFSpecifiedWord(i), vbTab)
            
            'クリップボードにある値においてタブの数だけ繰り返す
            For j = 0 To UBound(arrTabSpecifiedWord)
            
                'セル内改行がある場合はダブルクォーテーションが存在するので取り除く処理
                arrTabSpecifiedWord(j) = TrimDQ(arrTabSpecifiedWord(j))
                
                If SetPlace = PLACE_FIRST Then
                    ActiveSheet.Cells(c.Row + i, c.Column + j).Value = arrTabSpecifiedWord(j) & ActiveSheet.Cells(c.Row + i, c.Column + j).Value
                Else
                    ActiveSheet.Cells(c.Row + i, c.Column + j).Value = ActiveSheet.Cells(c.Row + i, c.Column + j).Value & arrTabSpecifiedWord(j)
                End If
            Next
        Next
            
    '貼り付ける値を指定文字にした場合
    Else
    
        '指定文字に値がなければ処理を終了する
        If SpecifiedWord = "" Then
            Exit Sub
        End If
        
        '貼り付ける際に選択されたセルが一つの場合は単純に貼り付ける
        If Selection.Cells.Count = 1 Then
            
            If SetPlace = PLACE_FIRST Then
                c.Value = SpecifiedWord & c.Value
            Else
                c.Value = c.Value & SpecifiedWord
            End If
        
        '貼り付ける際に選択されたセルが複数の場合は全てのセルに指定文字を貼り付ける
        Else
            tmpValueArr = c.Value
            cntRow = UBound(tmpValueArr)
            cntCol = UBound(tmpValueArr, 2)
        
            For i = 1 To cntRow
                For j = 1 To cntCol
        
                    If SetPlace = PLACE_FIRST Then
                        tmpValueArr(i, j) = SpecifiedWord & tmpValueArr(i, j)
                    Else
                        tmpValueArr(i, j) = tmpValueArr(i, j) & SpecifiedWord
                    End If
        
                Next
            Next
            c.Value = tmpValueArr
            
        End If
    End If
    
End Sub

'===================================
'貼り付け位置(セルの最初、セルの最後)を選択した際の処理
'===================================
Sub TglPaste_onSel(control As IRibbonControl, pressed As Boolean) ' トグルボタンのクリック処理

    Select Case control.ID
    
        Case "tglBtn_pasteFirst"      'セルの最初を選択した場合
            SetPlace = PLACE_FIRST
        
        Case "tglBtn_pasteEnd"        'セルの最後を選択した場合
            SetPlace = PLACE_END
        
    End Select
    
    RbRibbon.InvalidateControl ("tglBtn_pasteFirst")
    RbRibbon.InvalidateControl ("tglBtn_pasteEnd")
End Sub

'-------------------------
'貼り付け位置を変更する際に行われる処理
'-------------------------
Sub TglPaste_getPressed(control As IRibbonControl, ByRef returnedVal)

    Select Case control.ID
    
        Case "tglBtn_pasteFirst"    'セルの最初を選択した場合
        
            If SetPlace = "" Then
                returnedVal = True
            Else
                If SetPlace = PLACE_FIRST Then
                    returnedVal = True
                Else
                    returnedVal = False
                End If
            End If
        
        Case "tglBtn_pasteEnd"      'セルの最後を選択した場合
            
            If SetPlace = "" Then
                returnedVal = False
            Else
                If SetPlace = PLACE_END Then
                    returnedVal = True
                Else
                    returnedVal = False
                End If
            End If
        
    End Select
    
End Sub

'===================================
'貼り付ける値(セルからコピー、指定文字)を選択した際の処理
'===================================
Sub TglPoint_onSel(control As IRibbonControl, pressed As Boolean)

    Select Case control.ID
        
        Case "tglBtn_tgtCell"               'セルからコピーを選択した場合
            SetCopyType = SELECT_CELL
        
        Case "tglBtn_tgtWord"               '指定文字を選択した場合
            SetCopyType = SELECT_WORD
        
    End Select
    
    RbRibbon.InvalidateControl ("tglBtn_tgtCell")
    RbRibbon.InvalidateControl ("tglBtn_tgtWord")
    RbRibbon.InvalidateControl ("edbox_tgtWord")
End Sub

'-------------------------
'貼り付ける値を変更する際に行われる処理
'-------------------------
Sub TglCopy_getPressed(control As IRibbonControl, ByRef returnedVal)

    Select Case control.ID
    
        Case "tglBtn_tgtCell"       'セルからコピーを選択した場合
        
            If SetCopyType = "" Then
                returnedVal = True
            Else
                If SetCopyType = SELECT_CELL Then
                    returnedVal = True
                Else
                    returnedVal = False
                End If
            End If
        
        Case "tglBtn_tgtWord"       '指定文字を選択した場合
        
            If SetCopyType = "" Then
                returnedVal = False
            Else
                If SetCopyType = SELECT_WORD Then
                    returnedVal = True
                Else
                    returnedVal = False
                End If
            End If
        
    End Select
    
End Sub

'-------------------------
'指定文字のテキスト内容を取得する際の処理
'-------------------------
Sub TgtWord_getText(control As IRibbonControl, ByRef returnValue)
    '初期値なし
End Sub

'-------------------------
'指定文字に変更があった際の処理
'-------------------------
Sub TgtWord_onChange(control As IRibbonControl, text As String)
    SpecifiedWord = text
End Sub

'-------------------------
'指定文字の活性/非活性を変更する処理
'-------------------------
Sub TgtWord_getEnabled(control As IRibbonControl, ByRef returnedVal)
    If SetCopyType = "" Or SetCopyType = SELECT_WORD Then
        returnedVal = True
    Else
        returnedVal = False
    End If
End Sub

'-------------------------
'汎用処理:文字列の最後に改行があれば取り除く
'-------------------------
Function TrimLWord(strTmp As String)

    If Right(strTmp, 1) = vbLf Then
        strTmp = Left(strTmp, Len(strTmp) - 2)
    End If
    
    TrimLWord = strTmp
    
End Function

'-------------------------
'汎用処理:ダブルクォーテーションを取り除く(セル内改行の場合)
'-------------------------
Function TrimDQ(strTmp As Variant)

    If InStr(strTmp, vbLf) > 0 And Right(strTmp, 1) = """" And Left(strTmp, 1) = """" Then
        
        strTmp = Left(strTmp, Len(strTmp) - 1)
        strTmp = Right(strTmp, Len(strTmp) - 1)
        strTmp = Replace(strTmp, """""", """")
        
    End If
    
    TrimDQ = strTmp
    
End Function

 

<手順4>

マクロを含んだExcelとして、ファイルを保存します。

  1. 左上にある「保存」アイコンをクリックします。
  2. 表示されたダイアログで「いいえ」をクリックします。
  3. 「ファイルの種類」から「Excelアドイン(*.xlam)」を選択します。
  4. 「保存」をクリックします。

    これで事前準備は完了です。

    あとは「基本的な機能、操作方法の説明」で記載された方法でツールを実行できます。

     

    なお、当マクロの開発環境は、OS:Windows10 、Excelソフトウェア:Microsoft Office 365となっており、当環境では動作確認ができていますが、他の環境で正常に動作するかは確認できていません。

    正常に動作しない場合は、コメントいただければ幸いです。

     

     

    また以下にて、このような業務効率化できるツールを機能ごとの一覧でまとめてますので、ご興味のある方はご覧ください。

     

    自力で業務効率化できるツール等を作成する場合は、オンラインITスクール」を利用するとモチベーションを保ちつつ、効率的に学習とアウトプットができると思います。

    \ 今なら1か月間全額返金保証!! /

    上記の「侍テラコヤ」月額2,980円~ という日本最安級の料金でプログラミング学習ができ、今なら初めての方でも安心できる「1か月全額返金保証」があります

    自分に合わないと感じた場合は返金してもらえるため、ノーリスクで試すことができます。是非一度体験してみることをオススメします ^ ^

     

    ツールのダウンロードはこちら

    下記よりExcelファイルをダウンロードして、記事の途中にありました VBAのソースコードをツール内に組み込んで使用してください。

    【Excel VBA】セルの最初または最後に値を貼り付けるアドインツール

    ツールのダウンロードはこちら

    ※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています

    他に要望等ありましたら、可能な限り改修等を対応しますのでコメント頂ければと思います

     

    <このツールが『結構使える!』と思ったら、下のグッドボタンを押していただけたら幸いです>