0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Excelのシートを壊す方法(VBAマクロ)

Posted at

みなさんこんにちは。
SESで派遣されていることを理由に技術的負債のメンテナンスを拒否し始めた私です。
あまりの環境の酷さに、派遣先の社員が数ヶ月先の展望すら見ない作業をし始めていて、色々不安に思っています。
(まあ、ブラックボックス化の原因が社員だったらまだマシだろうと、見なかったことにしています。)

今日もそんな職場のバッドノウハウを広め、Excelマクロの普及を妨害していきます。

要点

APIとして外部から提供されているプロパティの名称は無視してはいけません。
無駄に柔軟性の高いシステムをしているので、予想外の部分に影響が出ます。

問題

特定のマクロを実行し、保存した後にそのファイルを開こうとすると「~~の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックして下さい。」との表記が出る。
データに破損した様子はなかったが、書式やフォームオブジェクト(ボタン)などが破損していた。

原因

自分の環境では再現性が取れなかったが、シートに止めを刺したのは下記のようなマクロが組まれていたことだったようだ。
職場では下記の部分を修正したところ破損箇所が条件付き書式関係だけになった。
(まだ条件付き書式まわりにこんな感じのバグがあるんだろうなぁ……)


Sub BreakMacro()
    Dim formula As String
    
    formula = "=VLOOKUP(A" & "TAG_ROW" & ",データ置き場!A:B,2,FALSE)"
    
    Sheet1.Cells(2, 2).Value = Replace(formula, "TAG_ROW", "2")
    Sheet1.Cells(2, 3).Value = Replace(formula, "TAG_ROW", "3")
    Sheet1.Cells(2, 4).Value = Replace(formula, "TAG_ROW", "4")

End Sub

今回の場合は、Value(値)プロパティに、関数(Formula)を入れていることがバグの温床になっている。
これが、Sheet1.Cells(2, 2).Formula = Replace(formula, "TAG_ROW", "2")や、Sheet1.Cells(2, 2) = Replace(formula, "TAG_ROW", "2")だったら問題は無い。

そもそも、「値」のプロパティに「関数」を入れず、APIの指示にきちんと従いましょう。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?