2017-06-29 4 views
2

Ich habe eine Tabelle, die zwei Schaltflächen hat - Um Datensätze aus der Datenbank abrufen und eine andere, um Änderungen von Excel in die Datenbank hochzuladen. Das Makro zum Abrufen von Datensätzen aus der Datenbank lautet wie folgt. Nach dem Abrufen der Datensätze möchte ich, dass die Benutzer nur bestimmte Spalten (hier die Spalten von Januar bis Szenario) bearbeiten, damit die Benutzer nach dem Aktualisieren dieser Zellen auf die Schaltfläche zum Aktualisieren klicken können, um die Änderungen in der Datenbank zu speichern. Ich möchte jedoch nicht, dass sie die anderen Spalten berühren (EmpID über Status). Ich möchte ein Makro, das diese Spalten nach dem Abrufen und Entsperren der Daten sperrt, während die Datensätze beim Klicken auf die Schaltfläche Retrieval abgerufen werden. Dies liegt daran, dass ich das Arbeitsblatt lösche, wenn ich auf die Schaltflächen zum Abrufen von Datensätzen klicke. Ich habe mehrere Methoden ausprobiert und es funktioniert nicht. Ich würde Ihre Hilfe schätzen.So entsperren und sperren Excel-Zellen zum Ausführen eines Makros

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 

Danke, Hema

+0

Wenn dies gelöst ist, markieren Sie bitte die am besten geeignete Antwort als die Antwort mit dem Häkchen auf der linken Seite. – ti7

Antwort

1

Eine der besten Möglichkeiten, zu lernen, wie etwas in VBA zu tun, ist einfach auf die Aufgabe, mit dem Makrorecorder durchzuführen. Auf diese Weise kennen Sie den grundlegenden Code, der zum Ausführen der Aufgabe erforderlich ist.

Es hilft auch zu verstehen, dass alle Zellen mit einer Eigenschaft von „Locked“ beginnen, aber das wird nur dann sinnvoll, wenn die Arbeitsmappe die Bewertung unter Verwendung geschützt> Sheet Option schützen.

So um sicherzustellen, dass niemand alle eine der Zellen in Ihrem Buch ändern kann, nachdem die Daten geändert wurden, können Sie mit der Arbeitsmappe zu schützen brauchen würden:

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

Die verschiedenen Optionen geändert werden oder entfernt, je nachdem, was Sie tun möchten.

Wie ich es verstehe, möchten Sie nur bestimmte Spalten gesperrt. In diesem Fall musst du entsperren die Zellen, die Sie ihnen erlauben zu betreten - so müssen Sie rückwärts darüber nachdenken.

Diese Codezeile die Locked Eigenschaft der Zellen C1 würde eingestellt: C1000 auf Falsch so dass, wenn die Arbeitsmappe geschützt ist, noch der Benutzer die Zellen bearbeiten:

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

Wenn Sie habe noch weitere Fragen, einfach posten.

finden Sie in der Microsoft-Dokumentation hier: https://msdn.microsoft.com/en-us/VBA/excel-vba/articles/range-locked-property-excel

1

Haben Sie schon ActiveSheet.Protect versucht?

Am Anfang des Skripts müssen Sie Folgendes hinzufügen, um den Arbeitsblatt mit dem Schutz aufzuheben.

activesheet.unprotect 

Dann wird das Skript ausgeführt. Am Ende Ihres Unter definieren zunächst die Spalten, die Sie Ihren Benutzer ändern möchten in der Lage sein: (Als Beispiel Colum B)

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

folgt, schützen das Blatt

activesheet.protect 

Ich denke, es sollte funktionieren.

+0

Danke! Das funktioniert!! – Hema

1

nach dem:

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

Platzieren Sie diesen Code:

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 

Wenn Sie das Verfahren ein, wo Sie brauchen, um alles neu zu schreiben:

Public Sub RetrieveDBToWorkSheet() 

Platzieren Sie diesen Code zum Entsperren der ganzes Blatt:

ActiveSheet.Unprotect ' This will unprotect the whole sheet 

Sie müssen daran denken, zuerst alle Spalten auf dem Blatt zu entsperren. Wenn Sie dies nicht tun, sperrt der Schutz alle Ihre Spalten (auch wenn Sie den gewünschten Bereich ausdrücklich "gesperrt" haben). Dies ist nicht intuitiv und hat viele Excel-Benutzer verblüfft.

+0

Vielen Dank! Es funktioniert wunderbar !! – Hema

Verwandte Themen