• DİKKAT !

    Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak Dosya Yükleme tamamen ücretsizdir.

Çözüldü Statik dinamik diziler (array)

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Durum
Konu Çözümlendiği İçin Kapatılmıştır.

eqsell125

Yeni Üye
Katılım
31 May 2022
Mesajlar
7
Aldığı beğeni
0
Excel V
Office 2016 TR
Konu Sahibi
Merhaba,
Excel VBA i kendi kendime öğrenmiş biri olarak bazı bilgi eksiklerimi tamamlamaya çalışıyorum
Dizileri statik veya dinamik (variant) tanımlamanın ne gibi avantajı/dezavantajı var? Benim farkettiğim farklar şunlar. Dizi dinamik tanımlanırsa elemanların index numaralarıyla işlem yapamıyorum. Mesela Dim Ar() as Variant diye tanımladıktan sonra Ar(1)=10 diyemiyoruz. Ama excel sayfası üzerindeki bir aralığı göstererek Ar = range("a1:c30") verileri diziye kolayca kaydediyor.
Sayfaya geri yazdırmada da dinamik diziler kolaylık sağlıyor. range("a1:c30") = Ar dediğimizde kolayca ekrana yazıyor ama statik diziyi bu şekilde yazdıramıyoruz.

Büyük boyutlu dizilerle işlem yapmak zor oluyor. Örnek olarak milyon adet elemanı olan bir dizide sayısal sıralama yapmak epey vakit alıyordu. İnternette Quicksort diye bir sıralama algoritması buldum. Fakat quicksort dinamik dizilere göre kodlanmış. Ben diziyi statik olarak tanımlıyorum, Çünkü verileri algoritma içinde index numaralarına bağlı olarak oluşturuyorum. Bu algoritmaya uydurmak için biraz uğraşmam gerekiyor.
Sorum şu bu yazdıklarımda herhangi bir bilgi eksiği var mı? Statik bir diziyi ekrana kolayca yazdırabilmek için dinamik bir diziye aktarabilir miyim?
Yardımcı olacaklara şimdiden teşekkürler
 
redim preserve komutunu araştırın. Ayrıca mehmey canbulat tarafından yazılmış bir class var onunla herşeyi çok daha kolay yapabilirsiniz.
adresinden dinleyebilir ve class ı indirebilirsiniz
 
Statik ile Dinamik farkı adı üstünde yapısal farktır. Statik tanımlanan dizi boyutu daha sonra değiştirilemez. Dinamik tanımlanırsa boyut istediği anda değiştirilebilir. İndex numarasıyla işlem yapma konusunda dizinin statik ya da dinamik olması problem çıkarmaz. Siz tanımlama ile tanımlanan değişkenin içini doldurmayı azıcık karıştırıyorsunuz.
Dim Ar() as Variant diye tanımladıktan sonra Ar(1)=10 diyemiyoruz.
Çünkü dizi tanımlanmış ama boyutu belirtilmemiş.
Dim Ar() as Variant ifadesinden sonra
ReDim Ar(1) as Variant ifadesiyle dizinin bıyunu belirlerseniz dediğiniz işlemi yapabilirsiniz.
 
redim preserve komutunu araştırın. Ayrıca mehmey canbulat tarafından yazılmış bir class var onunla herşeyi çok daha kolay yapabilirsiniz.
adresinden dinleyebilir ve class ı indirebilirsiniz
Hocam Mehmet bey ile görüştüm. Class modülünün açıklamalı anlatım videosunu da bugün çekecek. İlgilenen arkadaşların takip etmesi faydalı olur.
 
kesinlikle faydalı olur ve uygulamada çok zaman kazandırır
 
Konu Sahibi
Statik ile Dinamik farkı adı üstünde yapısal farktır. Statik tanımlanan dizi boyutu daha sonra değiştirilemez. Dinamik tanımlanırsa boyut istediği anda değiştirilebilir. İndex numarasıyla işlem yapma konusunda dizinin statik ya da dinamik olması problem çıkarmaz. Siz tanımlama ile tanımlanan değişkenin içini doldurmayı azıcık karıştırıyorsunuz.

Çünkü dizi tanımlanmış ama boyutu belirtilmemiş.
Dim Ar() as Variant ifadesinden sonra
ReDim Ar(1) as Variant ifadesiyle dizinin bıyunu belirlerseniz dediğiniz işlemi yapabilirsiniz.
Redim yaptığımızda dizi statik hale dönüşmüyor değil mi? Tekrar boyutlandırabilir miyiz?
Redim Ar(10,100,20) gibi çok boyutlu bir dizi de oluşturabiliriz sanırım.
 
redim ile dizi boyutu belirlenebilir ve çok boyutlu dizi tanımlaması yapılabilir. Dinamik bir dizide yeniden boyutlandırma sıkıcı bir işlem haline gelebilir. Ancak dizinin ne kadar elemanlı olacağı öngörülemediği zamanlarda dinamik dizi kullanmak daha mantıklı olmakta
 
Dediğiniz gibi redim ifadesi ile diziyi boyutlandırabilirsiniz. Daha sonra ihtiyaç olursa tekrar boyutlandırabilirsiniz. Çok boyutlu dizileri de aynı şekilde boyutlandırabilirsiniz. Ancak;
dizi tanımlama
dim ar() as variant
...
İLK BOYUTLANDIRMA
redim ar(1 to 5, 1 to 2)

YENİDEN BOYUTLANDIRMA
redim preserve ar(1 to 5, 1 to 5)

Preserve ifadesi diziyi boyutlandırırken içindeki veriyi de korur.
Preserve kulllanmazsanı gene boyutlandırılı ama içindeki veri gider.

Çok boyutlu dizilerde YENİDEN BOYUTLANDIRMA işlemini yaparken PRESERVE ifadesi kullanılırsa sadece dizinin SON BOYUTUNU değiştirebilirsiniz..
Mesela
dim ar() as variant TANIMLAMA
redim ar(1 to 5, 1 to 2) İLK BOYUT
redim preserve ar(1 to 8, 1 to 2) YENİDEN BOYUT BU SATIR HATA VERİR
redim preserve ar(1 to 5, 1 to 15) YENİDEN BOYUT BU SATIR HATA VERMEZ çünkü sadece son boyutu değiştirdik.

Tek boyutlu dizilerde PRESERVE ifadesinden kaynaklı üstte bahsettiğim hata oluşmaz.
 
Son düzenleme:
Yaptığınız ilk atamada herhangi bir sınır tanımlamazsanız Redim ile yaptığınız tanımlama ile zaten dinamik hale gelmiş oluyor. Çünkü alacağı değere göre boyutu değişebilir. Hatta kodun geri kalan kısımlarında "redim preserve" ile boyutunu daha fazla artırabilme imkanınızda mevcut.
 
Dinamik diziyi statik diziden ayıran temel ölçüt
Redim Preserve komutuyla diziye yeni elemanlar ekleyebilmemizdir.
Statik diziyi sayfaya yazdıramıyoruz diye bir şey yok.
Aşağıda örnekledim.
Ar(1)=10 ile Ar = range("a1:c30").Value aynı statüde değil.
Ümit hocam net anlatmış.

Columns("A:C").ClearContents
stb = Array("St1", "St2", "St3")

Range("A1").Resize(1, UBound(stb) + 1).Value = (stb) 'satır yatay
Cells(2, 1).Resize(1, UBound(stb) + 1).Value = (stb) 'satır yatay
Range("A3").Resize(UBound(stb) + 1, 1).Value = Application.Transpose(stb) 'sütun dikey


MsgBox (stb(1) & vbCrLf & " dizinin 2. elemanını görüntüyorsunuz")
 
Konu Sahibi
Cevap veren herkese teşekkürler. Tanımlama konusunu şu an daha net. Benim bu konudaki problemim diziyi ekrana yazdırma ile ilgili ortaya çıktı. Dinamik diziyi aşağıdaki gibi tanımlayınca ekrana kolayca yazdırabiliyorum;

Dim Ar As Variant
ReDim Ar(50)
'Dizi elemanlarını oluştur
Ar = Range("d5:d10")
'Diziyi ekrana yazdır
Range("h5:h50") = Ar

Ama aşağıdaki dizi içerisinde işlem yapınca ekrana yazdırma hata veriyor

Dim Ar As Variant
ReDim Ar(50)
'Dizi elemanlarını oluştur
For i = 1 To 20
Ar(i) = Cells( i, 1) + 10
Next i

'Diziyi ekrana yazdır
Range("h5:h50") = Ar

Bu şekilde veya (Ar() şeklinde) Ar dizisini ekrana yazmıyor. For döngüsüyle yazdırmak istediğimde uzun sürüyor
 
Öncelikle dim ar(10) ile dim ar(1 to 10) ifadesi farklıdır.
dim ar(10) soncu şudur 0 ile 10 arasında 11 elemanlı bir dizi.
dim ar(1 to 10) soncu şudur 1 ile 10 arasında 10 elemanlı bir dizi.
diziyi hücredien direk okutarak doldurursanız index 1 den başlar
mesela
dim ar as variant
ar = range("a1:a2")
bu ifade diziyi 1 to 2 şeklinde boyutlandırır ve içeriğini doldurur.
ayrıca okunan hücre sayısı 1 den fazla olursa dizi otomatik olarak 2 boyutlu oluşturulur.
2 boyutlu diziler hücreye yazdırılırken 2 boyutlu olarak düşünülmeli ve hücre adresi dizi boyutuna göre genişletilmelidir.
Mesela
dim ar() as variant
ar = range("a1:a5").value'bu ifadeyle dizimiz 1 x 5 şeklinde boyutlandırılır. Yani 2 boyutlu olur.
Yani
redim ar(1 to 5, 1 to 1) şekline dönüşür.

şimdi tekrar hücreye yazalım.
range("a1").resize(5) = ar
 
Son düzenleme:
Konu Sahibi
Dinamik diziyi statik diziden ayıran temel ölçüt
Redim Preserve komutuyla diziye yeni elemanlar ekleyebilmemizdir.
Statik diziyi sayfaya yazdıramıyoruz diye bir şey yok.
Aşağıda örnekledim.
Ar(1)=10 ile Ar = range("a1:c30").Value aynı statüde değil.
Ümit hocam net anlatmış.

Columns("A:C").ClearContents
stb = Array("St1", "St2", "St3")

Range("A1").Resize(1, UBound(stb) + 1).Value = (stb) 'satır yatay
Cells(2, 1).Resize(1, UBound(stb) + 1).Value = (stb) 'satır yatay
Range("A3").Resize(UBound(stb) + 1, 1).Value = Application.Transpose(stb) 'sütun dikey


MsgBox (stb(1) & vbCrLf & " dizinin 2. elemanını görüntüyorsunuz")
Range("A1").Resize(1, UBound(stb) + 1).Value = (stb)
Bu şekilde kodlayınca A1den başlayarak dizinin boyutu kadar dizinin sadece ilk elemanını yazıyor. Ben mi yanlış yapıyorum?
 
Konu Sahibi
Öncelikle dim ar(10) ile dim ar(1 to 10) ifadesi farklıdır.
dim ar(10) soncu şudur 0 ile 10 arasında 11 elemanlı bir dizi.
dim ar(1 to 10) soncu şudur 1 ile 10 arasında 10 elemanlı bir dizi.
diziyi hücredien direk okutarak doldurursanız index 1 den başlar
mesela
dim ar as variant
ar = range("a1:a2")
bu ifade diziyi 1 to 2 şeklinde boyutlandırır ve içeriğini doldurur.
ayrıca okunan hücre sayısı 1 den fazla olursa dizi otomatik olarak 2 boyutlu oluşturulur.
Tanımlama konusu net şu anda teşekkürler
 
Range("A1").Resize(1, UBound(stb) + 1).Value = (stb)
Bu şekilde kodlayınca A1den başlayarak dizinin boyutu kadar dizinin sadece ilk elemanını yazıyor. Ben mi yanlış yapıyorum?
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
Şu şekilde düzeltin olayı görün
 
Konu Sahibi
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
Şu şekilde düzeltin olayı görün
Tamam şimdi istediğim gibi oldu.
Yani mesele dizinin boyutu ile yazdırılacak yerin boyutunu aynı seçmek
Peki diziyi olduğu gibi mi yazıyor? Mesela ben sadece dizinin 2. kolonunu yazdırmak istesem?
 
çok boyutlu dizilerde dediğiniz geçerli Resize(UBound(Ar), 1) burdaki 1 sütun sayısı zaten mesela 4 boyutlu dizinin 1-2-3 boyutlu olarak yazdırabilirsiniz. Ama 4 boyutlu bir dizide 3. sütunu yazdıracaksanız. For next döngü kullanmalısınız.
 
Cevap veren herkese teşekkürler. Tanımlama konusunu şu an daha net. Benim bu konudaki problemim diziyi ekrana yazdırma ile ilgili ortaya çıktı. Dinamik diziyi aşağıdaki gibi tanımlayınca ekrana kolayca yazdırabiliyorum;

Dim Ar As Variant
ReDim Ar(50)
'Dizi elemanlarını oluştur
Ar = Range("d5:d10")
'Diziyi ekrana yazdır
Range("h5:h50") = Ar

Ama aşağıdaki dizi içerisinde işlem yapınca ekrana yazdırma hata veriyor

Dim Ar As Variant
ReDim Ar(50)
'Dizi elemanlarını oluştur
For i = 1 To 20
Ar(i) = Cells( i, 1) + 10
Next i

'Diziyi ekrana yazdır
Range("h5:h50") = Ar

Bu şekilde veya (Ar() şeklinde) Ar dizisini ekrana yazmıyor. For döngüsüyle yazdırmak istediğimde uzun sürüyor
Kodun global kısmına option base 1 olması gerek yanlış yazmadıysam ekleyip deneyin hata verecek mi?
 
Durum
Konu Çözümlendiği İçin Kapatılmıştır.
Geri
Üst