2017-06-29 13 views
2

スプレッドシートには2つのボタンがあります。データベースからレコードを取得するには、もう1つはエクセルからデータベースに変更をアップロードします。データベースからレコードを取得するマクロは、次のとおりです。レコードを取得した後、ユーザーは特定の列(ここではJanuaryからScenarioまでの列)のみを編集して、ユーザーが更新ボタンをクリックして変更をデータベースに保存できるようにします。しかし、他の列(EmpIDからStatusまで)に触れないようにしたいと思います。Retrievalボタンをクリックしてレコードを取得しながら、データの取得とロック解除後にこれらの列をロックするマクロが必要です。これは、レコード検索ボタンをクリックするたびにワークシートをクリアしているためです。私はいくつかの方法を試して、それは動作していません。私はあなたの助けに感謝します。マクロを実行するためのExcelセルのロックを解除してロックする方法

Public Sub RetrieveDBToWorkSheet() 
Dim sQry As String 
Dim iRows As Integer 
Dim iCols As Integer 
Dim SQL As String 



On Error GoTo ErrHandler 



'Clear worksheet 
Call ClearExistingRows(4) 

'Create ADODB Recordset for retrieved data 
Call DBConnection.OpenDBConnection 

'Create Recordset 
Dim rsMY_Resources As ADODB.Recordset 
Set rsMY_Resources = New ADODB.Recordset 

SQL = "SELECT EmpID, EName, CCNum, CCName, ProgramNum, ProgramName, ResTypeNum, ResName, Status, January, February, March, April, May, June, July, August, September, October, November, December, Total_Year, Year, Scenario from Actual_FTE2" 

'Query the database 

rsMY_Resources.Open SQL, DBConnection.oConn, adOpenStatic, adLockReadOnly 
If rsMY_Resources.EOF = True Then 
    MsgBox ("No record found in database") 
    Exit Sub 
End If 

'Fill excel active sheet, starting from row# 3 
iRows = 3 
For iCols = 0 To rsMY_Resources.Fields.Count - 1 
    ActiveSheet.Cells(iRows, iCols + 1).Value = rsMY_Resources.Fields(iCols).Name 
Next 
ActiveSheet.Range(ActiveSheet.Cells(iRows, 1), ActiveSheet.Cells(iRows, rsMY_Resources.Fields.Count)).Font.Bold = True 

iRows = iRows + 1 
ActiveSheet.Range("A" + CStr(iRows)).CopyFromRecordset rsMY_Resources 

iRows = rsMY_Resources.RecordCount 

'Clean up 
rsMY_Resources.Close: 
Set rsMY_Resources = Nothing 

Call DBConnection.CloseDBConnection 


MsgBox (CStr(iRows) + " records have been retrieved from the database!") 


Exit Sub 

ErrHandler: 
MsgBox (Error) 

End Sub 

Public Sub ClearExistingRows(lRowStart As Long) 
Dim lLastRow As Long 
Dim iLastCol As Integer 

If (Not (Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious) 
Is Nothing)) Then 
    lLastRow = Cells.Find("*", Range("A1"), xlFormulas, , 
    xlByRows,xlPrevious).Row ' Find the last row with data 

    If (lLastRow >= lRowStart) Then 
     iLastCol = Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, 
    xlPrevious).Column ' Find the last column with data 
     Range(Cells(lRowStart, 1), Cells(lLastRow, iLastCol)).Select 
     Selection.EntireRow.Delete 
     End If 
    End If 
    End Sub 

おかげで、VBAで何かをする方法を学習するための最良の方法の ヘマ

+0

これが解決された場合は、最も適切な回答を回答としてマークし、左側にチェックマークを付けてください。 – ti7

答えて

1

一つは、上のマクロレコーダーでタスクを実行するだけです。そうすれば、タスクを完了するために必要な基本コードを知ることができます。

また、すべての細胞が「ロック」のプロパティでオフを開始することを理解するのに役立ちますが、ワークブックがレビューを使用してを保護されている場合にのみ有効になること>シートオプションを保護します。

ので、データは、使用してワークブックを保護する必要があるだろう、変更された後、誰があなたの本の中のすべてのセルを変更することはできませんことを確認します

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

様々なオプションを変更することができまたはあなたが何をしたいかによって削除されます。

私が理解しているように、特定の列だけがロックされたほうがいいです。この場合、実際にはにはのセルをロック解除する必要があります。そのセルを入力することができます。そのため、逆に考える必要があります。

このコード行は、セルC1のロックプロパティを設定します:ワークブックが保護されている場合、ユーザーはまだセルを編集できるように虚偽にC1000を:

Range("C1:C1000").Locked = False 

あなたの場合他の質問があり、投稿するだけです。

は、ここでは、Microsoftのドキュメントを参照してください: https://msdn.microsoft.com/en-us/VBA/excel-vba/articles/range-locked-property-excel

1

は、すでにのActiveSheet.Protectを試してみましたか?

スクリプトの冒頭で、作業するシートの「保護を解除する」ために、次の行を追加する必要があります。

activesheet.unprotect 

スクリプトが実行されます。あなたのサブの終わりに、最初のあなたは、ユーザーが変更できるようにしたい列を定義します(例Colum Bとして)

Columns("B:B").Select 
    Selection.Locked = False 

私は考えてシートに

activesheet.protect 

を保護する、ことを次のようそれは動作するはずです。

Dim rngCol As Range ' Create a Range object 

Set rngCol = ActiveSheet.Range("A:Z") ' Select all columns on sheet 
    rngCol.Locked = False    ' Unlock all columns 
Set rngCol = ActiveSheet.Range("A:I") ' Now Select columns EmpID - Status 
    rngCol.Locked = True    ' Lock only those columns 
    ActiveSheet.Protect    ' Protect will now only protect the Locked columns 

あなたはすべてを書き直す必要がプロシージャを入力します:

Public Sub RetrieveDBToWorkSheet() 

場所のロックを解除するには、このコードは、このコード

MsgBox (CStr(iRows) + " records have been retrieved from the database!") 

場所:あなたの後

+0

ありがとう!これは動作します! – Hema

1

シート全体:

ActiveSheet.Unprotect ' This will unprotect the whole sheet 

シートのすべての列のロックを解除することを忘れないでください。そうしないと、プロテクトによってすべての列がロックされます(必要な範囲を明確に「ロック」していても)。これは直感的ではなく、多くの優れたユーザーを困惑させています。

+0

ありがとうございました!それは美しく動作します! – Hema

関連する問題