仕事で、下記のような場面に遭遇したことは無いでしょうか?
- 黄色のセルには別のセルやシートやファイルから値を参照する数式が入っている。
- 黄色のセルの部分のみを数式から値に直したいが、セルが飛び飛びとなっているため、まとめて値貼り付けすることができない。(まとめて値貼り付けしてしまうと小計欄の数式が消えてしまう)
- つながっている範囲のみを指定して地道に値貼り付けを実行していくしかない。
このような時、エクセルマクロを使えば、簡単に指定したセルのみを値貼り付けすることができます。
本記事では、エクセルマクロを使って指定したセルのみを値貼り付けする方法を解説いたします。エクセルマクロに興味のある方は必見です。
指定したセルのみを値貼り付けする方法
エクセルマクロは下記画像のように範囲をユーザーに選択させ、選択した範囲のみに特定の処理を実行させることができます。
範囲指定はctrlキーを押しながらクリックしていけば、飛び飛びの範囲も指定できます。そのため、指定した範囲のセルを値貼り付けするというような設定をしていれば(コードを書けば)指定したセルのみを値貼り付けすることができます。
範囲指定の画面
但し、上記のマクロだと一つ課題があります。
それは値貼り付けする箇所が飛び飛びでかつ膨大であった場合、ctrlキーを押しながらクリックして範囲を指定していくのがすごく大変になることです。
そこでマクロに以下の条件を加えます。
<選択した範囲の中で黄色のセルのみを値貼り付けする。>
この条件を加えることで、範囲選択も列単位で指定してしまえば(E~Q列をまとめて選択すれば)OKです。その範囲の中の黄色のセルのみを値貼り付けしてくれるので、範囲選択は粗く選択していても大丈夫となります。
ここでまた一つ以下の疑問が生まれるかもしれません。
これなら範囲選択をする手間は解消されたけども、そもそも値貼り付けしたいセルを黄色に塗りつぶすのが大変なのでは?
しかし、そこはマクロではなく、エクセルの機能を使えば割と簡単に黄色に塗りつぶすことができます。
例えば、以下のようにフィルタ(ctrl+shift+L)とグループ化(alt+shift+→)をかけ、数式を残したいところを非表示にし、可視セルのみを選択(alt+;)→黄色の塗りつぶしを実行などでいけます。
フィルターがけ
グループ化
可視セルを選択
このようにエクセルの機能とマクロを組み合わせれば、色々なことができるようになります。
サンプルコードご紹介
上記処理を実行するには以下のサンプルコードをコピペすれば実行できるようになります。実際に使ってみたいという方はVBEに以下のコードをコピペして試してみてください。
Sub 範囲と色を指定して値貼り付け()
Dim color As Long
Dim sh As Long
Dim path1 As String
Dim path2 As String
Dim bname1 As String
Dim bname2 As String
Dim r As Range
Dim c As Object
‘B2セルの背景色を取得
col = Range(“B2”).Interior.ColorIndex
‘Thisworkbookのファイル名を取得
path1 = ThisWorkbook.FullName
bname1 = Dir(path1)
MsgBox “ファイルを選択してください”
‘値貼り付けをしたいファイルを選択させファイル名を取得
path2 = Application.GetOpenFilename
Workbooks.Open path2
bname2 = Dir(path2)
‘値貼り付けをしたいシート番号を入力させ取得しアクティブに
sh = InputBox(“値貼り付けを実施するシート番号(左から1,2,3・・・)を半角で入力してください”)
Workbooks(bname2).Worksheets(sh).Activate
‘値貼り付けをしたい範囲を選択させる
Set r = Application.InputBox(prompt:=”範囲を選択してください(指定範囲の数式を値貼り付けします)”,
Type:=8)
‘選択した範囲のセルがB2セルの背景色と同じなら値貼り付けを実行
For Each c In r
If c.Interior.ColorIndex = col Then
c.Value = c.Value
End If
Next c
MsgBox “完了しました”
End Sub
因みに値貼り付けをしたい色についてはコードを貼り付けたファイルのsheet1のB2セルの色が値貼り付けをしたい色として設定されるようコードを書いているので、下記の画像のようにコードを貼り付けたファイルを加工しておけば、使い易いものとなると思います。