2017-10-06 3 views
0

プロジェクトを完了するためには、VBAコーディングが必要です。 VBAに関する私の知識はとても基本的なので、私は苦労しています。私は同様のリクエストを読んだがコードを完了できなかったので、できるだけ詳細を述べる。オフセットセル-1の列が空白の範囲でセルをロックするためのEXCEL VBA

日曜日から土曜日の7日間を表す一連の「2列」(パターンとデスク)(x7)があります。各日の左の列はシフトパターンを表し、右の列は各日に割り当てられたデスクを表します。私は名前の範囲で作業しているので、いくつかの空白の列があります。

シフトパターン列x7は左側にあり、 "パターン"という名前の範囲として定義されています。デスク列は各シフト列のすぐ右にあり、Desksという名前の範囲が定義されています。列は約25セルです。しかし、これはワークブックからワークブックまで様々です。したがって、名前付き範囲の使用。

"Desks"という名前の範囲内の各セルをロックしたいところで、 "Pattern"という名前の範囲に残っているセル-1の列に値が設定されていません。

シートはすでに選択されて保護されておらず、「デスク」の範囲はロックされていません。

Sheets("Assign Desks").Select 
    ActiveSheet.Unprotect 
    Application.Goto Reference:="Desks" 
    Selection.ClearContents 
'Unlock Cells 
    Selection.Locked = False 

セルをロックするコードの後、ワークシートは保護され、リボンは隠され、画面分割はワークシートに表示されます。それはうまくいきます。

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 

その他の情報パターン列は、データがリフレッシュされるパターン(ブックの別のシートに貼り付ける)を表示する数式を含みます。両方の列には、一度入力したセルを書式設定するための条件付き書式が含まれています。

一度リフレッシュすると、シフトごとにデスクを割り当てる必要があります(人間の判断が必要なため自動化できません)。しかし、私は、デスクをリストから割り当てる必要があるセルをタブで移動できるようにしたい利用可能な残りの利用可能なデスク。私はスキップされている(したがってロックされている)横のシフトがないことを細胞に欲しい。 Part of worksheet

答えて

0

このようなことが起こりますか?私は可能な限り名前のついた範囲で作業するのは好きではありません。私はこの例で行/列を見ることができなかったので、このメソッドはそれらを動的に定義しようとしました。また、ロックされたセルは黄色に変わります。ユーザーはロックされているものを知っていますが、希望どおり(明らかに)これを削除/変更することは自由です。

Option Explicit 
Sub UnlockSomeCells() 
Dim headerRow As Long, lastRow As Long, firstCol As Long, lastCol As Long 
Dim x As Long, y As Long 
Dim ws As Worksheet 

'set the worksheet to work with 
Set ws = ThisWorkbook.Sheets("Assign Desks") 

'unlock sheet 
ws.Unprotect 

'define the row where the headers are located (change as necessary) 
headerRow = 5 

'determine the last column 
lastCol = ws.Cells(headerRow, ws.Columns.Count).End(xlToLeft).Column 

'determine firstcol 
For y = 1 To lastCol 
    If ws.Cells(headerRow, y).Value <> "" Then 
     firstCol = y 
     Exit For 
    End If 
Next y 

'lock all cells by default 
ws.Cells.Locked = True 

'loop through columns 
For y = firstCol To lastCol 

    'if finding the start of a set, start 
    If ws.Cells(headerRow, y) = "Shift Pattern" Then 

     'define last row for set 
     lastRow = WorksheetFunction.Max(_ 
     ws.Cells(ws.Rows.Count, y + 0).End(xlUp).Row, _ 
     ws.Cells(ws.Rows.Count, y + 1).End(xlUp).Row, _ 
     ws.Cells(ws.Rows.Count, y + 2).End(xlUp).Row) 

     'clear middle col 
     'With ws.Range(ws.Cells(headerRow + 1, y + 1), ws.Cells(lastRow, y + 1)) 
     ' .ClearContents 
     ' .Interior.ColorIndex = xlNone 
     'End With 

     'find cells to unlock 
     For x = headerRow + 1 To lastRow 
      If ws.Cells(x, y) <> "" Then 

       'unlock the cell 
       ws.Cells(x, y + 1).Locked = False 

       'show that the cells are UNlocked in some way for the user's benefit 
       'ws.Cells(x, y + 1).Interior.Color = RGB(0, 255, 255) 

      End If 
     Next x 

    End If 

Next y 

'lock sheet 
ws.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 

End Sub 

編集:変更は、デフォルトでロックされたすべてのセルを作り、そして唯一のシフトパターン列内の非空白のエントリの右側にあるセルのロックを解除します。

+0

私の質問にお返事いただきありがとうございます。私は要件をうまく説明していると思ったが、実際には、シフトパターンを含むセルの+1右以外のすべてのセルをロックする必要がありました。ヘッダー行はそれを変更しても問題ありません。シフトパターン列には、式= IFNA(IF(OR(E6 = "x"、E6 = "xs"、E6 = "XR"、E6 = "XR"、E6 = "")、LEFT 、9))、 "") – Penelope53

+0

すべてをロックするように上記の私の答えを編集し、シフトパターンの列で非空白のセルの右側にあるセルのロックを解除するだけです。それはあなたが必要とするものではありますか? –

+0

私は間違っているかもしれませんが、 "clear middle col"は動作しません。これらのセルには、ユーザーが第3列に表示されているリストから机を選択できるようにするデータ検証付きのドロップダウンリストが含まれているため、これが想定されています。その日に選ばれた机はすでに消えています。したがって、細胞をクリアすることはできません。 – Penelope53

関連する問題