• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Makro açıklaması

Katılım
5 Eylül 2007
Mesajlar
1,247
Excel Vers. ve Dili
ofis 2010
iyi akşamlar; kullandığım makro var, tam detayını anlayamadım.

son = S1.Range("A" & Rows.Count).End(3).Row
a = S1.Range("A3:K" & son).Value
ReDim b(1 To UBound(a), 1 To 12)
For i = 1 To UBound(a)
bu kısımda ve
If Len(a(i, 4)) > 1 Then
b(Say, 3) = a(i, 4)
Else
b(Say, 3) = a(i, 11)
End If
bu kısımda ne demek isteniyor. uygulamada deneme yanılma yoluyla işi görüyorum, anlayarak yapmak istiyorum.

Kod:
Sub Aktar_Rapor()

Dim a(), b(), i As Long, Say As Long
Dim S1 As Worksheet, S2 As Worksheet
Set S2 = Sheets("Rapor")
Set S1 = Sheets("Sayfa2")
Application.ScreenUpdating = False: Application.Calculation = xlCalculationManual

    son = S1.Range("A" & Rows.Count).End(3).Row
    a = S1.Range("A3:K" & son).Value
   ReDim b(1 To UBound(a), 1 To 12)
        For i = 1 To UBound(a)
            Say = Say + 1
            b(Say, 1) = a(i, 1)
            b(Say, 2) = a(i, 3)
            b(Say, 4) = a(i, 5)
            b(Say, 5) = a(i, 6)
            b(Say, 6) = a(i, 7)
            b(Say, 7) = a(i, 8) ' formülle gelen değer
            b(Say, 9) = a(i, 10) ' formülle gelen değer
            b(Say, 8) = a(i, 9) ' formülle gelen değer
            
            If Len(a(i, 4)) > 1 Then
                b(Say, 3) = a(i, 4)
            Else
                b(Say, 3) = a(i, 11)
            End If
        Next i
    S2.Range("a3:K" & son).ClearContents
    S2.[a3].Resize(Say, 10) = b
    Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic
End Sub
Normalde daha basit raporlamada kullandığım makro vardı, ama Sayfa2' deki
ÖZEL İNDİRİM yazısında diğerleri arasına yazdırmak için bu kodu bulmuştum. gayet kullanışlı. Tam anlayamadığım için deneme yaparak tutturmaya çalışıyorum.
 

Ekli dosyalar

  • Sayfa2.jpg
    Sayfa2.jpg
    117.8 KB · Görüntüleme: 4
  • Rapor.jpg
    Rapor.jpg
    148 KB · Görüntüleme: 2
Son düzenleme:
son yazan; A hücresinin son dolu satırını bulur ve bunun değerini alır. Örneğin A250'de bitiyorsa son=250 olur. Bu rakamı hesaplamanın sebebi, döngü ile belirsiz hücreye bir şey yazdırmak isterseniz son tanımlaması hedef olarak gösterilir.

a yazan = A3 ile (son'da tanımlı rakamı örn 250 baz alırsak) K250 arasının değeri.

Kod:
ReDim b(1 To UBound(a), 1 To 12)
dediğini bende bilmiyorum bir ustamız açıklarsa bende öğrenmiş olurum.

Ama For 1 To dediği 1'den Ubound(a) 'ya kadar döngü uygula demek. Döngü başında say dediğinin 1 rakam artmasını sağlamış ama kalanları söylemek için formülün ne için kullanıldığını bilmem gerek. Şu anda verebileceğim bilgi bu kadar.

EDİT: yazdılarımı tam olarak anlamanız için söyle bir izah yapayım;

Son ile a'nın bittiği hücre sayısı bulunur, böylece bu hücre baz alınarak döngü dediğimiz For işlevi kullanılır ve satır satır ne işlem yapılacağı kodlanabilir. Örn: A1 ile A5 arasında + - değerler var. Biz - değerleri b hücresinde toplamak istiyoruz. Ama A 'ya sürekli değer geliyor ve A6 A7 diye gidebiliyor. Kodumuz şöyle olur

Son = Range("A" & Rows.Count).End(xlUp).Row
A'nın son hücresi

ilk = 1 'ilk hücrenin sayı numarası

For v = 1 to son

1.satıdan başla ve son satıra kadar sırayla aşağıdaki işlemi uygula demek

If Not Range ("A" & ilk) <0 then Goto atla
Range("B1").value = Range("B1") + Range("A" & ilk)
atla:
ilk = ilk + 1
next v


Burada Eğer A hücresindeki değer 0'dan küçük değilse komutu atla satırına kadar geç dedik. Sonrasında B1 hücresine - olan satırlarını toplaması için bir komut verdik. Böylece örn. a2 satırında - değer varsa onu b1 ile toplayıp b1 satırına yazacak ve sıradaki satıra geçecek. Ama a2 de - değer yoksa direkt a3 'e geçecek.

Umarım anlatabilmişimdir :) Zira For ile yazılan döngüler ile yapılabileceklerin bir sınırı yok. Mantığı kavrandıktan sonra sınırsız ihtimali olan bir nimettir.



,
 
Son düzenleme:
dim ile "i" ve "Say" uzunluk olarak tanımlanmış.

Taner Bey, gayretli bir arkadaşsınız.

Mesajınız biraz uzun olduğu için; ilk satırı okuyunca geri kalanını okumaktan vazgeçip, aşağıdaki bilgiyi vermek istedim.

Koddaki "i As Long, Say As Long" ifadesinde söz konusu "i" ve "Say" değişkenlerinin tipi "uzunluk" anlamında değil, bu değişkenlerin alabileceği maksimum değerlerin Long olarak belirlenmesi amacıyla belirtilmiş. Burada, Long ifadesini Türkçe olarak tercümesi gibi bir durum söz konusu olamaz yani ....:???:

Long tipindeki bir değişkenin alabileceği değerler için bakınız;

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/data-types/long-data-type

.
 
Merhaba,
Alternatif olarak aşağıdaki açıklamaları yapayım:
son = S1.Range("A" & Rows.Count).End(3).Row = A sütununun son dolu satırı
a = S1.Range("A3:K" & son).Value = A3:K (son dolu satır) aralığını kapsayan tablo
ReDim b(1 To UBound(a), 1 To 12) = 12 sütunlu ve a tablosunun satır sayısına denk bir dizi tanımlanıyor.
For i = 1 To UBound(a) = 1 den a tablosunun satır sayısı kadar devam eden ve birer artan for ... next döngüsü oluşturuluyor.
If Len(a(i, 4)) > 1 Then = eğer a tablosunun i değerini alan satırı ve 4 sütunu ile kesişen değerin uzunluğu 1 den büyükse
b(Say, 3) = a(i, 4) = b dizisinin say değerini alan satırı ve 3.ncü sütununa denk gelen değer belirtilen tablo değerini alır
Else değilse
b(Say, 3) = a(i, 11) belirtilen dizi değeri, a tablosunun i değeri ile 11.nci sütuna tekabül eden değerini alır
End If
 
teşekkürler

Merhaba,
Alternatif olarak aşağıdaki açıklamaları yapayım:
son = S1.Range("A" & Rows.Count).End(3).Row = A sütununun son dolu satırı
a = S1.Range("A3:K" & son).Value = A3:K (son dolu satır) aralığını kapsayan tablo
ReDim b(1 To UBound(a), 1 To 12) = 12 sütunlu ve a tablosunun satır sayısına denk bir dizi tanımlanıyor.
For i = 1 To UBound(a) = 1 den a tablosunun satır sayısı kadar devam eden ve birer artan for ... next döngüsü oluşturuluyor.
If Len(a(i, 4)) > 1 Then = eğer a tablosunun i değerini alan satırı ve 4 sütunu ile kesişen değerin uzunluğu 1 den büyükse
b(Say, 3) = a(i, 4) = b dizisinin say değerini alan satırı ve 3.ncü sütununa denk gelen değer belirtilen tablo değerini alır
Else değilse
b(Say, 3) = a(i, 11) belirtilen dizi değeri, a tablosunun i değeri ile 11.nci sütuna tekabül eden değerini alır
End If

Teşekkürler, bu kısımı özellikle tahmini yapıyordum. Açıklamanız için teşekkürler.
 
teşekkürler

açıklama yapan arkadaşlara teşekkür ederim. ama hazır kod kullanmaya devam etsem iyi olacak, Hazır kodları düzenleyip kullanmak bana daha uygun, alt yapı olmadan konu pek anlaşılamıyor.
 
Rica ederim. Kolay gelsin.
 
Haluk Bey uyarınız için teşekkürler :) Ben Long'u yanlış biliyor muşum, sayenizde öğrenmiş oldum.

antonio, ayrıntılı anlatımınız için teşekkürler.
 
Geri
Üst