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
処理の流れとしてはダウンロードしたファイルから、必要な枠数分だけ
フォーマットシートから枠組みを作成する流れになります。
※フォーマットシートは、シート保護を実施してます。
※フォーマットシートをコピーし、シート保護がかかったまま枠組み作成、必要な部分だけセル保護解除をしています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/10 02:17