• DİKKAT

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

R1C1 Başvuru Stiline Göre Hazırlanan değişkenli SumProduct formülü

Katılım
16 Ağustos 2004
Mesajlar
137
Excel Vers. ve Dili
Office 2010 En 64 Bit
Merhaba,

Yaptığım bir çalışmada Topla.çarpım (SumProduct) fonksiyonunu kullanmam gerekiyor. Ancak fonksiyonun hangi sayfadaki veriyi alacağını bir Combobox üzerinden getirmem gerekiyor. Ayrıca getirilecek değerlerin bulunacağı sütunu da değişkenden getireceğim için R1C1 başvuru sitili kullanmaya karar verdim.

Ancak ne yazık ki istediğim formülü kurabilmeme rağmen kod "Type mismatch" hatası veriyor.

Kod aşağıdadır.

Kod:
Sub FncVeriAlaniEkleLst(VeriTuru As String)
Dim Bassat As Integer, Bitsat As Long, Bassut As Integer, Bitsut As Integer, a As Long, b As Long, ProjeKriteri As String
Dim Sayfa As Worksheet, SSayfa As Worksheet
'
Bassat = 11: Bitsat = 2000
    For Each SSayfa In Worksheets
        If SSayfa.Name = Cmb_Rapor.Value Then
        Set Sayfa = SSayfa
        Exit For
        End If
    Next
'
    If VeriTuru = "B" Then
    Bassut = 53: Bitsut = 103
    Else
    Bassut = 105: Bitsut = 155
    End If
'
    If Cmb_Proje.Value = "Konsolide" Or Cmb_Proje.Value = "Genel Merkez" Then
    ProjeKriteri = Cmb_Rapor.Value & "!R" & Bassat & "C2:R" & Bitsat & "C2<>""""" & Cmb_Proje.Value & """"""
    Else
    ProjeKriteri = Cmb_Rapor.Value & "!R" & Bassat & "C2:R" & Bitsat & "C2=""""" & Cmb_Proje.Value & """"""
    End If
'
    For a = Bassut To Bitsut
        If Sayfa.Cells(10, a) <> "" Then
        MsgBox Evaluate("=SumProduct((" & ProjeKriteri & ")*(1=1)*(" & Cmb_Rapor.Value & "!R" & Bassat & "C" & a & ":R" & Bitsat & "C" & a & "))")
        End If
    Next a
End Sub

Kodun içinde geçen Cmb_Proje bir combobox ve içinde sayfa adları var. O kısımda hiçbir sorun olmadığını biliyorum.

Kodda yer alan SumProduct fonksiyonunu formül olarak değil de string olarak bir hücreye aldığımda ve bu stringi olduğu gibi (değişkensiz) yeni bir makroda çalıştırdığımda hiçbir hata almıyorum. O kod da aşağıda:


Kod:
Sub Macro1()
    Range("AA15").Select
    ActiveCell.FormulaR1C1 = _
        "=SUMPRODUCT((Sayfa1!R11C2:R2000C2=""Girişler"")*(1=1)*(Sayfa1!R11C105:R2000C105))"
End Sub


Sitede arattım, hatta SumProduct fonksiyonunun VBA projelerinde kullanımını açıklayan güzel bir yazıyı da Üyelere Özel bölümünün altında buldum. Ancak orada belirtilenleri de denememe rağmen sonuç hep aynı oldu.


Yardımcı olabilirseniz sevinirim.
 
Selamlar,

Ekte basit bir dosya hazırladım. İsteğe göre dahada geliştirilebiliriz. İncelermisiniz.

Örnek dosyada UserForm üzerinden kriterler seçerek iki kritere göre TOPLA.ÇARPIM formülü oluşturulmaktadır.
 

Ekli dosyalar

Merhaba Korhan Bey,

Kusura bakmayın, araya haftasonu girdiğinden ancak cevaplayabiliyorum.

Çalışmanız süper olmuş, benzer konularda soruları olan / olacak arkadaşlara da çok yardımcı olacağını düşünüyorum.


Bu durumda siz yazmamış olsanız bile sanırım evaluate fonksiyonunda R1C1 başvuru biçiminin desteklenmediği anlamını çıkartmam gerekiyor. Ancak sizin örneğinizdeki

Kod:
Split(Cells(1, 10).Address, "$")(1)

ifadesi ile R1C1 başvuru gerekliliği de benim için ortadan kalkmış oluyor.

Kendi kodumu örneğinizdeki yapıya uyarladım ve sorunsuz bir biçimde çalışıyor. Size sadece üstteki Split fonksiyonunun sonundaki "(1)" ifadesinin anlamını sormam gerekiyor. "$J$1" gibi bir ifadeden "J" sütun etiketini getiriyor (ve istediğimiz de bu zaten) ama anlamı nedir bilmiyorum.

Yardımlarınız için çok teşekkür ediyorum.
 
Son düzenleme:
Selamlar,

Split fonksiyonu verileri belli bir parametrik değere göre ayırmamızı sağlar.
Bu fonksiyonun ayırdığı değerlerin başlangıç index numarası ise sıfırdır. Yani ayrılan parçalardan ilkine ulaşmak istiyorsanız parantez içine 1 yerine 0 yazmanız gerekecekti.

Sizin örneğinizde ayırıcı işaretimiz "$" sembolüdür.

"$J$1" adresini "$" sembolüne göre ayırdığımızda;

0 indexli veri boşluk olacaktır.
1 indexli veri "J" harfi olacaktır.
2 indexli veri "1" değeri olacaktır.

Aşağıdaki kodu sayfa üzerinde değişik hücreler seçip denerseniz mantığını daha iyi anlayabilirsiniz.

Kod:
Option Explicit
 
Sub TEST()
    MsgBox Split(Selection.Address, "$")(0)
    MsgBox Split(Selection.Address, "$")(1)
    MsgBox Split(Selection.Address, "$")(2)
End Sub
 
Açıklamalarınız için çok teşekkür ederim Korhan Bey.

İyi Çalışmalar.
 
Geri
Üst