USBにあるエクセルファイルのデータを参照して、PCにあるエクセルファイルで作業する機会があった。というのは、USBのエクセルファイルには、自分のPCに置いておきたくないような情報が入っていたので、そのファイルをPCに移してしまうことはせずに、PCのエクセルファイルからデータを読み出し、そのPC上のエクセルファイルで作業を進めたのだ。
イメージとしてはこのような感じ:
もうすこし具体的には、エクセルファイル1 (PC上のファイル) で
='/Volumes/USB名/.../[エクセルファイル2.xlsx]シート名'セル番地という数式を入力して、PC上でUSB内のエクセルデータの値を参照していた。
想定としては、USBを抜いてしまえば、PCのファイルからは参照されたデータが見えなくなってしまうと思っていたのだが、そうでもなさそう。エクセルファイル1 を開いた際に、リンクを更新しなければ、エクセルファイル2 のデータが見えてしまう (ようだ)。
USBのデータがPCから見えてしまうのを避けたい。ということで、解決策として、上記の数式を値にしてしまうマクロ、つまりイコールを取ってしまうマクロを書いてみた。イコールを取られた値に対して実行すると、またイコールが付与された数式になります。次のようなイメージ:
='/Volumes/USB名/.../[エクセルファイル2.xlsx]シート名'セル番地
↓↑'/Volumes/USB名/.../[エクセルファイル2.xlsx]シート名'セル番地
Sub mySecure() '数式を値に、値を数式に変換 | |
Dim mycell As Range | |
Dim mystring As String | |
For Each mycell In Selection | |
If mycell.Value <> "" Then '空欄のセルには操作を加えない | |
'数式であればイコール(=)をとる | |
If mycell.HasFormula Then '.HasFormula は数式であれば True を返す | |
mystring = mycell.Formula | |
mycell.Value = Right(mystring, Len(mystring) - 1) | |
'数式でなければイコール(=)を加える | |
ElseIf Not mycell.HasFormula Then | |
If Left(mycell.Value, 8) = "/Volumes" Then | |
mycell.Formula = "='" & mycell.Value 'single quotation mark | |
Else | |
mycell.Formula = "=" & mycell.Value | |
End If | |
End If | |
End If | |
Next mycell | |
End Sub |
*変換したい範囲を選択してから実行します。