VBA: Копиране/поставяне в нов лист, включително заключващи клетки

Положението е следното:

Имам Excel лист, с входна работна книга за попълване на лични неща и за всеки отделен месец работна книга. Сега има бутон, когато потребителят иска да има нов Excel лист, поради промяна на работното място.

Така например: г-н Дийн е попълнил дневния си час работа до 15 април. Сега той се премества на друго място и натиска бутона, за да промени работното място. Той получава нов Excel лист, който изглежда точно както преди, попълнен с данните, които е написал от първия лист (copy/paste от vba-sript). Съществуващите записи (клетки) до 15.април също са заключени, така че той не може да ги редактира. Той продължава да си записва часовете за 16. Април и т.н.

Мисля, че е по-добре, ако вторият лист на Excel се създаде от макроса (копиране/поставяне).

Име на първия лист: sheet1 Име на втория лист: sheet2

Така че кодът ми не работи досега:

Sub Test()
Dim ws1 As Worksheet
Set ws1 = sheet1.Worksheets("Master")
ws1.Copy sheet2.Sheets(Sheets.Count)
End Sub

Това ще копира целия лист?

Този код е за защита с парола за работните книги. Как мога да заключа само отделни клетки до 15 април? И така, как трябва да прочета датата?

Sub sbProtectAllSheets()

    Dim pwd1 As String, pwd2 As String
    pwd1 = InputBox("Please Enter the password")
    If pwd1 = "" Then Exit Sub
    pwd2 = InputBox("Please re-enter the password")

    If pwd2 = "" Then Exit Sub

     'Check if both the passwords are identical
    If InStr(1, pwd2, pwd1, 0) = 0 Or _
    InStr(1, pwd1, pwd2, 0) = 0 Then
        MsgBox "You entered different passwords. No action taken"
        Exit Sub
    End If

    For Each ws In Worksheets
        ws.Protect Password:=pwd1
    Next

    MsgBox "All sheets Protected."

    Exit Sub

End Sub

Или имате някакви други предложения?

Поздрави Duc


person donduc_jr    schedule 10.07.2015    source източник
comment
Първият под ще копира целия лист1 след лист2 (ред по раздели). За да заключите една клетка, можете да използвате Sheet1.Cells(1,1).Locked = True, тогава ще трябва да защитите листа, но е много по-лесно да заключите или отключите цял набор от клетки като (A1: F20)   -  person paul bica    schedule 10.07.2015
comment
Добре, значи няма да използвам заключването с парола?   -  person donduc_jr    schedule 10.07.2015
comment
Можете да оставите паролата празна и всеки ще може да я дезащити по всяко време, но ако използвате парола, ще трябва да намерите начин да я съхраните, така че VBA да може да я използва (като свойството Tag на обект на един от постоянните листове)   -  person paul bica    schedule 10.07.2015
comment
Опитахте ли да стартирате кода си? За вашия Sub Test() вие питате дали това ще проработи, а не заявявате, че не става. Ще си позволя да предположа, че няма да работи, защото изглежда много, много грешно, но не знам какъв вид глобални променливи може да сте задали извън Sub, който ни показахте (или ако имате Option Explicit комплект - трябва). Моля, редактирайте публикацията си, за да включите точните съобщения за грешка, които получавате, ако искате да увеличите шансовете за получаване на добър отговор.   -  person FreeMan    schedule 10.07.2015
comment
Моля, не използвайте маркера макроси за MS Office / VBA.   -  person Byron Wall    schedule 12.07.2015


Отговори (1)


Предполагам, че имате редове за всяка дата и че те следват един друг. В колоната с въведени часове можете да видите първия празен. Написах този код за това преди време. Попълнете за +колона+ номера на колоната, в която се въвеждат часовете.

LastRowR = ActiveSheet.UsedRange.Rows.Count
    For row = 2 To LastRowR
        If ActiveSheet.Cells(row, +column+) = "" Then
            LastRowR = row - 1
            Exit For
        End If
    Next row

След това можете да заключите диапазона от клетки, които са в миналото. Така че можете да направите диапазон от ("A1":Cells(LastRowR,+LastColumn+)), в който +LastColumn+ е номерът на последната колона, която се използва във вашия лист.

person Luuklag    schedule 10.07.2015