Excel otomatik sütun kopyası ve bugünün tarihi ile yeni sayfa


0

"Günlük" olacak bir VBA rutini yazmak istiyorum

  • yeni bir sayfa oluştur
  • bu yeni sayfaya , bugünün tarihine göre (örneğin, ) DD.MM.YY biçiminde bir ad verin (örneğin baştaki sıfırlarla 25.07.18)
  • sayfamın A ve B sütunlarındaki değerleri DataInputyeni sayfaya kopyalayın .

"Günlük" ile ne demek istiyorum? Geçerli saat = veya> günün belirli bir saati ise, sayfayı oluşturun, yoksa yoksayın.

Yönetimi zor değil. Bazı formülleri bir araya getirmek için bir araya getirmeye çalıştım ama onlar bana her zaman hata yaptılar.

Bir şey düşünüyordum

Option Explicit
Sub ReportSheet_Today()
    Dim szTodayDate As String

    szTodayDate = Format(Date, "dd.mm.yy")
    On Error GoTo MakeSheet
    Sheets(szTodayDate).Activate
    If Time < TimeValue("9:00:00") Then
        'MakeSheet:
        Sheets.Add , Worksheets(Worksheets.Count)
        ActiveSheet.Name = szTodayDate
        Sheets("DataInput").Select
        Range("A:A").Copy
        Sheets("szTodayDate").Select
        Range("A:A").Select
        ActiveSheet.Paste
    End IF
End Sub

Peki hata ne satırda? hata mesajı nedir?
DavidPostill

@DavidPostill, yorumlanan satır etiketinden derleme hatasını göz ardı ederek, çalışma zamanı hatası 9'un Sheets("szTodayDate")var olmayan bir denemeye çalışmayı denemesini sağlar . OP değişkenlerini bir değişmeze dönüştüren çift tırnak işareti kaldırmalıdır.
Mathieu Guindon

VBA'ya yeni başlayan biriyim ve "kodlama" yı öğrenmek benim için bir hobi. Bu değişken / string anlamlarını göremiyorum. Burada yanlış bir şey olduğunu biliyordum ama görmedim.
SarXes

Yanıtlar:


0

Hata burada:

Sheets("szTodayDate").Select

szTodayDatesayfanın adı değil; o sayfanın adını temsil eden bir dize içeren bir yerel değişken var ... ama bir olarak kullanıyorlar dize , VBA oluyor bir yaprak nesnesine KQUEUE çalışıyor böylece anlamıyla "szTodayDate" adlı ... ve o zamandan beri o olamaz bul, bom, çalışma zamanı hatası 9.

Çift tırnak işaretini kaldırın:

Sheets(szTodayDate).Select

Şimdi , dizge değişkeninin değerinden sonra adlandırılmış bir sayfa nesnesini kaldırıyor olacaksınız;szTodayDate


Sonraki adımlar...

Sayfa oluşturma mantığını kendi ayrı yordamına çekin; Bir şeyi yapan ve iyi yapan küçük, özel prosedürler yazmak, hayatınızı çok daha kolaylaştıracak.

İşlevlerin return değerlerini kaldırabilir: Worksheets.Addoluşturulan çalışma sayfası nesnesine bir başvuru döndürür - bu başvuruyu yerel bir nesne değişkenine alarak, Selectona olan ihtiyacı ortadan kaldırır ve sonra çalışabilirsiniz ActiveSheet.

Ayrıca , select-copy-select-paste işleminin tamamını bir astar olarak yaparak hedef parametre de sağlayabilirsiniz .Range.Copy

Public Function CreateReportSheet(ByVal reportDate As Date) As Worksheet

    Dim reportSheet As Worksheet
    Set reportSheet = AddNamedWorksheet(ThisWorkbook, Format$(reportDate, "dd.mm.yy"))

    'only needed if the sheet doesn't exist at compile-time.
    'if it *does* exist at compile-time, just set the sheet's (Name) property to "inputSheet".
    'that identifier will then be globally available anywhere in the project.
    'Dim inputSheet As Worksheet
    'Set inputSheet = ThisWorkbook.Worksheets("DataInput")

    inputSheet.Range("A:A").Copy reportSheet.Range("A:A")
    Set CreateReportSheet = reportSheet

End Function

Public Function AddNamedWorksheet(ByVal wb As Workbook, ByVal sheetName As String) As Worksheet
    Dim sheet As Worksheet
    Set sheet = wb.Worksheets.Add
    On Error Resume Next ' naming the sheet will throw if name already exists
        sheet.Name = sheetName
    On Error GoTo 0 ' restore error handling
    Set AddNamedWorksheet = sheet
End Function

1. aşamada bir End Sub'unuz olduğunu görüyorum, ancak çalışması için "Sub" referansı göremiyorum, öyle değil mi? Ayrıca, saat 1'de yoksa ve nasıl 1'i görmezden geldiyse, bu sayfayı oluşturmaya nasıl karar verdim 1. senin için kolay olduğunu biliyorum ama çok yeni başlayanlar için okyanusta bir şey bulmak gibi. Burada ne yazdığını görüyorum ve Anlamaya çalışıyorum. Bu zaman = veya>, IF durumunun doğru mu yanlış mı olduğunu görmek için boolean değişkeni tarafından ayarlanır. Tarif etsem bile bu ifadeyi anlayamıyorum. 'Çalışma Sayfası Olarak Dim inputSheet' Giriş Sayfasını Ayarla = ThisWorkbook.Worksheets ("
DataInput

@SarXes yazım hatası, olması gereken End Function- düzeltildi. Kasten zamanlama kısmını atladım .. IMO bir makro ne yapman gerektiğini söylesin; Belirli bir zamanda çalıştırılması gerekirse, o zaman başka bir yere uygulamalı ve o prosedürü oradan çağırmalısınız. Bu şekilde, günün saatinden bağımsız olarak her zaman her şeyi test edebilir ve çeşitli parametrelerle istediğiniz zaman yeniden çalıştırabilirsiniz.
Mathieu Guindon

Makroyu yazdığınız kodda uygulayın? Evet, yorum yazarken zaten gördüğünüzü biliyorum ama sadece wth olarak bakıyorum? Makro belki bir Sub işlevi ile olmalıdır ..
SarXes

"Belirli bir zamanda bir prosedürü çağırmak vba" gibi bir şey arayın, Yığın Taşması ile ilgili pek çok sonuç alacaksınız ; Temel olarak Workbook_Openolayı (in ThisWorkbook) ele almak Application.OnTimeve belirtilen zamanda prosedürü çağırmak için kurulum yapmak isteyeceksiniz . Yine de bu yaklaşımdan hoşlanmıyorum, çünkü Excel'in bir tür görev zamanlayıcısı gibi davranmasına neden oluyor ve bu belirli bir zamanda açık olmasını gerektiriyor, bu nedenle gecede Windows Update makinenizi yeniden başlatarak bozacak. Ama evet, bu uygulanabilir ve herhangi bir özel şartlı mantığı içermiyor.
Mathieu Guindon

Basitleştirmek için, sadece çalışma kitabının açılmasından sonra ayarlanan zamanla mevcut zamanı kontrol etmek ve ardından o rapor sayfasını otomatik olarak oluşturmak için her zaman çalıştırmak istemiyorum. Unutursam ya da ne sebeple olursa olsun bypass etmem sorunu çözer. Acemi noob, bir düğme oluşturarak o sayfayı yapması için nasıl bir düğme atayacağını soruyor. Komutun ona bir makro atamak gibi gözüktüğünü kastediyorum, çünkü şimdi çalıştırmak istiyorsam zaten okuduğum makroları göremiyorum.
SarXes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.