質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

859閲覧

セルロックが不正な動作をする場合がある

FujiCandy

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/12/05 03:26

編集2018/12/06 05:40

Excel 2016にて、VBAにてセルロックの解除をしているのですが、
解除が不正な動作をするケースがあります。

再現性は低く、問合せがあった際は、実行時のパフォーマンスの問題による不正動作として片づけていますが、何かしら発生させる手段があれば教えてください。

1.シートを保護する
ws.Protect UserinterfaceOnly:=True, Password:=str_password

2.部分的にロックをセルロックを解除する
ws.Range(ws.Cells(row_start, col_start), ws.Cells(row_end, col_end)).Locked = False

※1.row_endは都度不定行ですが、それ以外は固定。
※2.まとめてロック解除処理をしている。(ループ処理はしていない)

実行後、なぜか真ん中あたりの列だけ、ロックがかかったままになっている。
列単位で発生しており、行では発生していない。また最後の列だけとかではなく
中途半端な位置だけが解除されない。

試したこととして、
ロックがかかった部分をコピーして、貼り付けしたが、ロックはコピーされない。
※シート保護を解除すると、ロックはコピーされる。

列や行コピー貼り付けはシート保護でさせないようにしている。

ユーザ側の操作が悪いのか、PCのパフォーマンスの問題なのか、それ以外の要素があるのかが
わかればと思っています。

ソースが長いため、概略的に記載しています。

VBA

1 2 Public Const g_formant_row_start = 14 3 Public Const g_formant_col_end = 52 4 5 'ダウンロードしたファイルの最大行数を確認 6 Dim obj As Object 7 Set obj = CreateObject("Scripting.FileSystemObject") 8 int_maxRow = obj.OpenTextFile(strFileName, 8).Line - 2 9 10 Dim ws As Worksheet : Set ws = ThisWorkbook.Sheets("AAA") 11 12 'データの数だけまず枠を作成する。 13 Dim row_start As Integer: row_start = g_formant_row_start +2 14 Dim row_end As Integer: row_end = int_maxRow + g_formant_row_start 15 16 If row_start <= row_end Then 17 ws.Range(ws.Rows(g_formant_row_start), ws.Rows(row_end)).Insert (xlDown) 18 ws.Range(ws.Cells(g_formant_row_start , 1), ws.Cells(g_formant_row_start + 1, g_formant_col_end)).Copy 19 ws.Range(ws.Cells(row_start, 1), ws.Cells(row_end, g_formant_col_end)).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 20 End If 21 Application.CutCopyMode = False 22 23 'セル保護解除 24 ws.Range(ws.Cells(g_formant_row_start , 5), ws.Cells(row_end, g_formant_col_end)).Locked = False 25 26

処理の流れとしてはダウンロードしたファイルから、必要な枠数分だけ
フォーマットシートから枠組みを作成する流れになります。

※フォーマットシートは、シート保護を実施してます。
※フォーマットシートをコピーし、シート保護がかかったまま枠組み作成、必要な部分だけセル保護解除をしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

想定で落ちる落ちないでなく、想定外のことが発生したときのための
on errorですから入れるべきだと思いますよ。

確実にon errorが発生するかどうかはわかりませんが
事象が発生する原因や切り分けをするための糸口をつかむためにも
まずはon errorでエラー時の詳細な状態(変数の値とか)をログ出力をする処理を入れたモノを
運用してもらった方がいいと思います。
多分、再現性が低いということはレアな状態で発生するものと思いますので
現状のままでは解決の糸口を見つけるのは難しいように思えます。

以上

投稿2018/12/07 02:12

cutedog

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FujiCandy

2018/12/10 02:17

ありがとうございます。 やはり、On Error入れるしかないですよね。。 エラー発生時にErr.Descriptionを使って、メッセージ+ログ出力して、 何もなければユーザ操作の可能性ということで、切り分けるしかなさそうですね。 1000台導入しており、現段階では改修が難しいので、次回改修時に仕込むことにします。
guest

0

提示の情報では、ちょっとわかりかねます。

が、一応、

※1.row_endは都度不定行ですが、それ以外は固定。

これは、具体的にどういう位置になるのですか?
そして、どういうコードで特定していますか?

あと、
あてずっぽうだけど、
on error ~の
エラーの処理がまずくて意図したセル範囲が取得できてないかも?
全部のコード提示してみては?

投稿2018/12/05 11:05

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FujiCandy

2018/12/06 06:04

ご指摘ありがとうございます。 色々な個所を参照しているため、概略的にソースを記載いたしました。 row_endは、ダウンロードしたファイルの行数を判断して、特定しています。 ここで落ちる想定はしてないので、on errorは入れてないです。 ユーザビリティ的にはよくないですが、発生しだい事象確認と対応になっています。 (ダウンロードファイルのチェックは別処理)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問