Makro ile Noktaya Çevirme

Katılım
21 Eylül 2011
Mesajlar
115
Excel Vers. ve Dili
Office 365 - İngilizce
Altın Üyelik Bitiş Tarihi
6.6.2022
Merhaba,

Farklı excel'lerden veri aldığım ve Power Automate ile birleştirdiğim bir excel dosyam var.
Tarih aralarını (/) ile bölüyor. Bu şekilde olunca da aya göre sıralama yapmak isterken güne göre sıralıyor. (Temmuz ayının ilk günleri haziran'ın önüne geçiyor)
Hücre içindeki değerlerde sorunlar var, kimisinin başında boşluk falan var. Hepsini düzelttim.
Düzeltilmiş tarihleri olmasına gereken sütuna kopyaladım.
Sonra makro ile "/" işaretini "." ile değiştirdim ama yine olmuyor. Sırala dediğimde yine güne göre sıralıyor.
Bu işlemi ctrl+h komutu ile yaparsam sorun yok ama makro ile yapınca görüntüde noktaya dönüyor ama tarih formatı düzelmiyor.
Makro ile değiştirilmiş veriyi tekrar ctrl+h ile değiştir yapınca hepsi nokta olmasına rağmen yine değiştiriyor ve tarihler düzeliyor.

Elle müdahale etmeden makro ile bu sorunu nasıl aşabilirim.
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Tarihler metin olarak göründüğü için böyle yapıyor. Makro ile değiştirdiğiniz kodun altına hücreleri 1 ile çarpan bir satır ekleyin. Böylece sayısal bir değer olan tarih verisine dönecektir. Ya da kodu yazın ben gerekli satırı eklerim.
 
Son düzenleme:

omerfarukzorlu

Altın Üye
Katılım
11 Eylül 2012
Mesajlar
150
Excel Vers. ve Dili
Microsoft Office Personal 2010
Versiyon: 14.0.7015.1000 (32 bit)
Dil: Japonca
Altın Üyelik Bitiş Tarihi
06-06-2028
Makro kullanarak tarih formatını değiştirirken, Excel bazen değişiklikleri doğru bir şekilde uygulamaz. Bu durum genellikle, Excel'in otomatik tarih algılama özelliğinin çeşitli dil ve bölge ayarları ile uyumlu olmamasından kaynaklanır.
Bunu çözmenin bir yolumakroda tarihleri bir string olarak işleyip ardından tekrar bir tarih formatına dönüştürmektir. Bu yaklaşım, Excel'in otomatik tarih algılama özelliğini bypass eder ve istenen formatın kullanılmasını sağlar. İşte örnek bir makro:

For Each cell In rng
If cell.Value <> "" Then
' "/" ile ayrılmış tarih değerini böler
yil = Split(cell.Value, "/")(0)
ay = Split(cell.Value, "/")(1)
gun = Split(cell.Value, "/")(2)
' Tarih formatını düzelt
tarih = DateSerial(yil, ay, gun)
' Hücreye yeni tarih formatını yaz
cell.Value = Format(tarih, "dd.mm.yyyy")
End If
Next cell
 
Katılım
21 Eylül 2011
Mesajlar
115
Excel Vers. ve Dili
Office 365 - İngilizce
Altın Üyelik Bitiş Tarihi
6.6.2022
Tarihler metin olarak göründüğü için böyle yapıyor. Makro ile değiştirdiğiniz kodun altına hücreleri 1 ile çarpan bir satır ekleyin. Böylece sayısal bir değer olan tarih verisine dönecektir. Ya da kodu yazın ben gerekli satırı eklerim.
Merhaba,
Makro kodu yazmayı bilmediğim için genellikle makro kaydet ile işlerimi hallediyorum.
Dediğiniz gibi kendim 1 ile çarpma işlemi yaparsam düzeliyor ama makro ile yapamadım.
Aşağıdaki kodu oluşturdum ama 1 ile çarpma işlemini yapmıyor.
"T3" hücresinde "1" değeri var.

Sub bir_ile_carp()
Range("T3").Select
Selection.Copy
Range("D3:E3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
End Sub
 

omerfarukzorlu

Altın Üye
Katılım
11 Eylül 2012
Mesajlar
150
Excel Vers. ve Dili
Microsoft Office Personal 2010
Versiyon: 14.0.7015.1000 (32 bit)
Dil: Japonca
Altın Üyelik Bitiş Tarihi
06-06-2028
Excel'in tarihleri genellikle "ay/gün/yıl" formatında algıladığını unutmayın. Ancak, sizin durumunuzda, muhtemelen "gün/ay/yıl" formatını kullanıyorsunuz. Bu yüzden tarihleri doğru bir şekilde işleyebilmek için önce onları "ay/gün/yıl" formatına döndürmemiz gerekecek.

Aşağıda, makronuzda küçük bir değişiklik yaparak bu sorunu çözebilecek bir VBA kodu bulabilirsiniz:




Sub bir_ile_carp()
Dim rng As Range
Dim cell As Range
' D3:E3 hücrelerinde ve aşağısındaki tüm hücrelerde işlem yapacağımızı belirliyoruz
Set rng = Range("D3:E3", Range("D3:E3").End(xlDown))
' Her hücreyi tek tek işliyoruz
For Each cell In rng
' Hücredeki tarihi "ay/gün/yıl" formatına çeviriyoruz
cell.Value = Replace(cell.Value, "/", ".")
' Hücreyi tekrar birleştirmek için T3 hücresindeki 1 ile çarpıyoruz
cell.Value = cell.Value * Range("T3").Value
' Tarihin formatını düzeltmek için 'Tarih' formatını kullanıyoruz
cell.NumberFormat = "dd.mm.yyyy"
Next cell
End Sub
 
Katılım
21 Eylül 2011
Mesajlar
115
Excel Vers. ve Dili
Office 365 - İngilizce
Altın Üyelik Bitiş Tarihi
6.6.2022
Excel'in tarihleri genellikle "ay/gün/yıl" formatında algıladığını unutmayın. Ancak, sizin durumunuzda, muhtemelen "gün/ay/yıl" formatını kullanıyorsunuz. Bu yüzden tarihleri doğru bir şekilde işleyebilmek için önce onları "ay/gün/yıl" formatına döndürmemiz gerekecek.

Aşağıda, makronuzda küçük bir değişiklik yaparak bu sorunu çözebilecek bir VBA kodu bulabilirsiniz:

Sub bir_ile_carp()
Dim rng As Range
Dim cell As Range
' D3:E3 hücrelerinde ve aşağısındaki tüm hücrelerde işlem yapacağımızı belirliyoruz
Set rng = Range("D3:E3", Range("D3:E3").End(xlDown))
' Her hücreyi tek tek işliyoruz
For Each cell In rng
' Hücredeki tarihi "ay/gün/yıl" formatına çeviriyoruz
cell.Value = Replace(cell.Value, "/", ".")
' Hücreyi tekrar birleştirmek için T3 hücresindeki 1 ile çarpıyoruz
cell.Value = cell.Value * Range("T3").Value
' Tarihin formatını düzeltmek için 'Tarih' formatını kullanıyoruz
cell.NumberFormat = "dd.mm.yyyy"
Next cell
End Sub
cell.Value = cell.Value * Range("T3").Value satırında hata veriyor.
Range("T3").Value yerine direk 1 yazdım yine olmadı.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,245
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Bozuk tarih içeren basit bir örnek dosya paylaşabilirmisiniz.
 
Katılım
21 Eylül 2011
Mesajlar
115
Excel Vers. ve Dili
Office 365 - İngilizce
Altın Üyelik Bitiş Tarihi
6.6.2022
Merhaba,

Örnek dosya ektedir. D ve E kolonundaki tarihleri noktalıya çevirip, tarih formatında algılamasını sağlamak istiyorum.

 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,245
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Deneyiniz.

C++:
Option Explicit

Sub Fix_Dates()
    Dim WS As Worksheet, Last_Row As Long
    Dim My_Data As Variant, X As Long
    Dim Y As Integer, Process_Time As Double
    
    Process_Time = Timer
    
    Set WS = Sheets("KALIP EKIPMAN")
    
    Last_Row = WS.Cells(WS.Rows.Count, 1).End(3).Row
    
    My_Data = WS.Range("D3:E" & Last_Row).Value
    
    ReDim My_Fix_Date_List(1 To UBound(My_Data, 1), 1 To 2)
    
    For X = LBound(My_Data, 1) To UBound(My_Data, 1)
        For Y = LBound(My_Data, 2) To UBound(My_Data, 2)
            If My_Data(X, Y) <> "" Then
                My_Fix_Date_List(X, Y) = CDbl(CDate(Replace(My_Data(X, Y), "/", ".")))
            End If
        Next
    Next
    
    WS.Range("D3:E" & Last_Row).NumberFormat = "dd.mm.yyyy hh:mm:ss"
    WS.Range("D3").Resize(UBound(My_Data, 1), UBound(My_Data, 2)) = My_Fix_Date_List
    
    Set WS = Nothing
    
    MsgBox "Tarihler düzeltilmiştir." & vbCrLf & _
           "İşlem süresi ; " & Format(Timer - Process_Time, "0.00") & " Saniye"
End Sub
 
Katılım
21 Eylül 2011
Mesajlar
115
Excel Vers. ve Dili
Office 365 - İngilizce
Altın Üyelik Bitiş Tarihi
6.6.2022
Deneyiniz.

C++:
Option Explicit

Sub Fix_Dates()
    Dim WS As Worksheet, Last_Row As Long
    Dim My_Data As Variant, X As Long
    Dim Y As Integer, Process_Time As Double
   
    Process_Time = Timer
   
    Set WS = Sheets("KALIP EKIPMAN")
   
    Last_Row = WS.Cells(WS.Rows.Count, 1).End(3).Row
   
    My_Data = WS.Range("D3:E" & Last_Row).Value
   
    ReDim My_Fix_Date_List(1 To UBound(My_Data, 1), 1 To 2)
   
    For X = LBound(My_Data, 1) To UBound(My_Data, 1)
        For Y = LBound(My_Data, 2) To UBound(My_Data, 2)
            If My_Data(X, Y) <> "" Then
                My_Fix_Date_List(X, Y) = CDbl(CDate(Replace(My_Data(X, Y), "/", ".")))
            End If
        Next
    Next
   
    WS.Range("D3:E" & Last_Row).NumberFormat = "dd.mm.yyyy hh:mm:ss"
    WS.Range("D3").Resize(UBound(My_Data, 1), UBound(My_Data, 2)) = My_Fix_Date_List
   
    Set WS = Nothing
   
    MsgBox "Tarihler düzeltilmiştir." & vbCrLf & _
           "İşlem süresi ; " & Format(Timer - Process_Time, "0.00") & " Saniye"
End Sub
Hocam çok teşekkürler, sorunsuz çalışıyor...
 
Üst