• DİKKAT

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

array dizininden eleman silmek

mersilen

Destek Ekibi
Destek Ekibi
Katılım
31 Aralık 2009
Mesajlar
1,105
Excel Vers. ve Dili
excel 2007 türkçe
Excel Vers. ve Dili Ofis 2003
Merhabalar

Oluşturulmuş tek boyutlu bir dizinin herhangi bir elemanını makro içinde silmek mümkünmüdür?
Aşağıda Erase cities komutu ile dizi tamamen silinmekte;
ben mesela 3.elemanı tamaben silmek istiyorum.
Erase cities (3) ????




Kod:
Sub FunCities()
    Dim cities(1 To 5) As String
    cities(1) = "Las Vegas"
    cities(2) = "Orlando"
    cities(3) = "Atlantic City"
    cities(4) = "New York"
    cities(5) = "San Francisco"

    MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
        & cities(3) & Chr(13) & cities(4) & Chr(13) _
        & cities(5)

    Erase cities

    MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
        & cities(3) & Chr(13) & cities(4) & Chr(13) _
        & cities(5)
End Sub


Kod:
Private Sub CommandButton1_Click()
'--------------------------------------------------------
kat = Worksheets(ActiveSheet.Name).Cells(Rows.Count, "A").End(3).Row
ReDim deg(kat)
For k = 4 To kat
deg(k) = Worksheets(ActiveSheet.Name).Cells(k, "A").Value
Next k

[COLOR="Red"]
'Erase deg(6)[/COLOR]
'erase array(

veri = ""

For i = 4 To kat
  veri = veri & deg(i) & ","
Next i

MsgBox UBound(deg)
Cells(1, "e") = veri
Cells(4, "e") = veri
Cells(5, "e") = deg(6)
End Sub
 

Ekli dosyalar

Son düzenleme:
Merhaba,

Dizi elemanını silmekten kastınız eleman sayısını azaltmaksa farklı kod gerekir. Yok belli bir elemanını sileyim diğer elemanların pozisyonu kaysın derseniz aşağıdaki kodları kullanabilirsiniz. Sadece belli elemanını sileyim (yani içini boşaltayım derseniz) cidies(4)="" şeklinde kullanabilirsiniz.
İnceleyiniz.

Kod:
Sub FunCities()
 
    Dim i   As Integer
    Dim j   As Integer
    Dim cities(1 To 5) As String
 
    cities(1) = "A"
    cities(2) = "B"
    cities(3) = "C"
    cities(4) = "D"
    cities(5) = "E"
    MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
        & cities(3) & Chr(13) & cities(4) & Chr(13) _
        & cities(5)
'    Erase cities
    j = Application.InputBox("Silinecek Elemanı Belirtiniz", "Mesaj", 1, Type:=1)
    If j > 0 And j <= UBound(cities) Then
        If j = UBound(cities) Then
            cities(j) = ""
        Else
            For i = j To UBound(cities) - 1
                cities(i) = cities(i + 1)
                cities(i + 1) = ""
            Next i
        End If
    End If
 
    MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
        & cities(3) & Chr(13) & cities(4) & Chr(13) _
        & cities(5)
End Sub
 
Sn mersilen, güzel bir konu başlığı açmışsınız. İlgimi çeken bir konu olduğundan beni araştırmaya sevk etti. Çözüme bir çok mantık ile ulaşmak mümkün. Bu mantıklarla ilgili aşağıda kod örnekleri yazıyorum. Sanıyorum ilgilenen üyelerimiz içinde güzel bir arşiv oluşturacaktır.

Standart bir dizi uygulamasında aradan tek bir veri silinemiyor. Ancak veriyi dizi boyutunu değiştirmeden boş bırakabilirsiniz. Eğer dizinin içinden tek bir veriyi tamamen kaldırmak isterseniz dizi boyutunu yeniden tanımlamanız gerekir. Bunula ilgili iki örnek kodu aşağıda veriyorum.

Not: Aşağıda verdiğim tüm kod örneklerinde "Deniz" isimli verinin silindiği kabul edilmiştir. Aşağıdaki kodları kopyaladığınız modülün en üstüne dizi indexinin 1'den başlaması için "Option Base 1" satırını kopyalayın.

1. UYGULAMA: DİZİ BOYUTUNU YENİDEN TANIMLAMA

Kod:
Sub dizidenelemansil()
ReDim dizi(5), dizi1(5)
 
dizi(1) = "Ali"
dizi(2) = "Ayşe"
dizi(3) = "Deniz"
dizi(4) = "Fatma"
dizi(5) = "Sedat"
 
MsgBox dizi(1) & Chr(10) & dizi(2) & Chr(10) _
        & dizi(3) & Chr(10) & dizi(4) & Chr(10) _
        & dizi(5)
 
dizi1 = dizi
 
Erase dizi
 
ReDim dizi(4)
 
For a = 1 To UBound(dizi1)
If dizi1(a) <> "Deniz" Then
c = c + 1
dizi(c) = dizi1(a)
End If
Next
 
MsgBox dizi(1) & Chr(10) & dizi(2) & Chr(10) _
        & dizi(3) & Chr(10) & dizi(4)
End Sub
2. UYGULAMA: ARRAY İLE TANIMLANMIŞ BİR DİZİ İÇİN UYGULAMA

Kod:
Sub dizidenelemansil1()
Dim dizi(), dizi1()
 
dizi = Array("Ali", "Ayşe", "Deniz", "Fatma", "Sedat")
 
MsgBox dizi(1) & Chr(10) & dizi(2) & Chr(10) _
        & dizi(3) & Chr(10) & dizi(4) & Chr(10) _
        & dizi(5)
 
dizi1 = dizi
 
Erase dizi
 
ReDim dizi(4)
 
For a = 1 To UBound(dizi1)
If dizi1(a) <> "Deniz" Then
c = c + 1
dizi(c) = dizi1(a)
End If
Next
 
MsgBox dizi(1) & Chr(10) & dizi(2) & Chr(10) _
        & dizi(3) & Chr(10) & dizi(4)
 
End Sub
3. UYGULAMA: COLLECTION NESNESİ KULLANIMI

Kod:
Sub dizidenelemansil2()
Dim dizi As New Collection
 
dizi.Add "Ali"
dizi.Add "Ayşe"
dizi.Add "Deniz"
dizi.Add "Fatma"
dizi.Add "Sedat"
 
MsgBox dizi(1) & Chr(10) & dizi(2) & Chr(10) _
        & dizi(3) & Chr(10) & dizi(4) & Chr(10) _
        & dizi(5)
 
For Each eleman In dizi
c = c + 1
If eleman = "Deniz" Then
dizi.Remove c
End If
Next
 
MsgBox dizi(1) & Chr(10) & dizi(2) & Chr(10) _
        & dizi(3) & Chr(10) & dizi(4)
 
End Sub
4. UYGULAMA: DICTIONARY NESNESİ KULLANIMI

Kod:
Sub dizidenelemansil3()
Set dizi = CreateObject("Scripting.Dictionary")
 
dizi.Add "Ali", Nothing
dizi.Add "Ayşe", Nothing
dizi.Add "Deniz", Nothing
dizi.Add "Fatma", Nothing
dizi.Add "Sedat", Nothing
 
For Each eleman In dizi
birlestir = birlestir & isaret & eleman
isaret = Chr(10)
Next
 
MsgBox birlestir
 
If dizi.exists("Deniz") = True Then dizi.Remove ("Deniz")
 
For Each eleman In dizi
birlestir1 = birlestir1 & isaret1 & eleman
isaret1 = Chr(10)
Next
 
MsgBox birlestir1
 
End Sub
5. UYGULAMA: ARRAYLIST KULLANIMI

Not: Bu uygulama için bilgisayarınızda Microsoft.Net framework yüklü olmalıdır.

Kod:
Sub dizidenelemansil4()
 
Set dizi = CreateObject("System.Collections.ArrayList")
 
dizi.Add "Ali"
dizi.Add "Ayşe"
dizi.Add "Deniz"
dizi.Add "Fatma"
dizi.Add "Sedat"
 
For Each eleman In dizi
birlestir = birlestir & isaret & eleman
isaret = Chr(10)
Next
 
MsgBox birlestir
 
If dizi.contains("Deniz") = True Then dizi.Remove ("Deniz")
 
For Each eleman In dizi
birlestir1 = birlestir1 & isaret1 & eleman
isaret1 = Chr(10)
Next
 
MsgBox birlestir1
 
End Sub
 
Merhaba,

Dizi elemanını silmekten kastınız eleman sayısını azaltmaksa farklı kod gerekir. Yok belli bir elemanını sileyim diğer elemanların pozisyonu kaysın derseniz aşağıdaki kodları kullanabilirsiniz. Sadece belli elemanını sileyim (yani içini boşaltayım derseniz) cidies(4)="" şeklinde kullanabilirsiniz.
İnceleyiniz.

Kod:
 Sub FunCities()
 
    Dim i   As Integer
    Dim j   As Integer
    Dim cities(1 To 5) As String
 
    cities(1) = "A"
    cities(2) = "B"
    cities(3) = "C"
    cities(4) = "D"
    cities(5) = "E"
    MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
        & cities(3) & Chr(13) & cities(4) & Chr(13) _
        & cities(5)
'    Erase cities
[COLOR="Red"] MsgBox "ilk dizin değeri " & LBound(cities) & Chr(10) & "son dizin değeri  " & UBound(cities)[/COLOR]
    j = Application.InputBox("Silinecek Elemanı Belirtiniz", "Mesaj", 1, Type:=1)
    If j > 0 And j <= UBound(cities) Then
        If j = UBound(cities) Then
            cities(j) = ""
        Else
            For i = j To UBound(cities) - 1
                cities(i) = cities(i + 1)
                cities(i + 1) = ""
            Next i
        End If
    End If
 
    MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
        & cities(3) & Chr(13) & cities(4) & Chr(13) _
        & cities(5)
[COLOR="Red"] MsgBox "ilk dizin değeri " & LBound(cities) & Chr(10) & "son dizin değeri  " & UBound(cities)[/COLOR]
End Sub

Merhabalar levent hocam ilginize teşekkürler.Sizin kodlarda eklediğim msg box larda önce 1-5 sonra 1-4 göstermeli.
Ben mesela 5 elemanlı bir dizin oluşturup sonra bunun bir tanesini bir yere alıp , kendi dizininin içindende silip (dizin elemanı sayısını 4 e düşürerek ) olayın devamını sağlamayı düşünüyordum.
Aşağıdaki linkte 7 nolu mesajımda bunu bayağı uzun ve dolaylı bir yoldan yaptım.Ama her seferinde dizini yeniden oluşturmak gerekiyor.
http://www.excel.web.tr/f50/synyf-ba-kany-secimi-t121157.html#post661386


Not: Sizin diğer mesajı sonradan gördüm.Bayağı bir emek harcamışsınız, elinize sağlık.Bunu değerlendireceğim.
Bu arada tek boyutlu dizi kavramını ayrıntısıyla bir derleme olsa valla çok makbule geçer.
 
Son düzenleme:
Levent bey tekrar emeğinize sağlık.

3-4-5. dizin.add uygulamalarında msg box a dizin sayılarını yazdıramadım.
Bunun çözümü var mı?
 

Ekli dosyalar

ilk dizin indexi her zaman 1'dir, dolayısıyla son dizin içinde count komutu kullanılabilir.

Kod:
MsgBox "ilk dizin değeri 1 " & Chr(10) & "son dizin değeri  " & dizi.Count
 
Tekrar teşekkürler.
Sorunsuz çalıştı.
Açıklamalarınız güzel bir kaynak olacaktır.
 

Ekli dosyalar

Geri
Üst