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
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