VBA Dinamik Dizi Yardım
-
iyi geceler arkadaşlar.excel vba da uğraşıp duruyordum ve dizilerle ilgili bişey yaparken dinamik çok boyutlu dizi tanımlayamadım. normal tek boyutlu dizi gibi redimle boyutunu değiştiremedim.diziyi 2 boyutlu tanımladığımda redim işe yaramadı.zaten boyut tanımlandı gibi birşey uyarısı verdi. bu işi nasıl çözebiliriz veya dinamik çok boyutlu dizi yerine neyi kullanabiliriz ?
-
Dizi değişkenini hiç bir boyut belirtmeden tanımla.
Dim arr() As Variant gibi
Sonrasında istediğin gibi değiştirebilirsin.
Örnek olarak :
Dim arr() ReDim arr(1, 3, 3) MsgBox UBound(arr, 1) ReDim arr(3, 5, 1) MsgBox UBound(arr, 2) ReDim arr(5, 2, 0) MsgBox UBound(arr, 3)
buzukatak tarafından 19/Eki/13 02:16 tarihinde düzenlenmiştir -
buzukatak bunu yazdı
Dizi değişkenini hiç bir boyut belirtmeden tanımla.
Dim arr() As Variant gibi
Sonrasında istediğin gibi değiştirebilirsin.
Örnek olarak :
Dim arr() ReDim arr(1, 3, 3) MsgBox UBound(arr, 1) ReDim arr(3, 5, 1) MsgBox UBound(arr, 2) ReDim arr(5, 2, 0) MsgBox UBound(arr, 3)
teşekkürler ama bunu preserve ile kullanamıyorum hata veriyor. dizi tek boyutluyken girilmiş değerlerin kaybolmaması gerekiyor.
-
acikistihbarat bunu yazdıbuzukatak bunu yazdı
Dizi değişkenini hiç bir boyut belirtmeden tanımla.
Dim arr() As Variant gibi
Sonrasında istediğin gibi değiştirebilirsin.
Örnek olarak :
Dim arr() ReDim arr(1, 3, 3) MsgBox UBound(arr, 1) ReDim arr(3, 5, 1) MsgBox UBound(arr, 2) ReDim arr(5, 2, 0) MsgBox UBound(arr, 3)
teşekkürler ama bunu preserve ile kullanamıyorum hata veriyor. dizi tek boyutluyken girilmiş değerlerin kaybolmaması gerekiyor.
Preserve ile ancak son boyutun uzunluğunu değiştirebilirsin ki bu yeni bir boyut ekleyememene / silememene sebep olur, bundan ötesine izin yok. Bu sana uymuyorsa ihtiyacını giderecek başka bir şeyler düşünmen gerekli.
Dim arr() ReDim arr(0, 0) arr(0, 0) = "00" ReDim Preserve arr(0, 1) arr(0, 1) = "01" MsgBox arr(0, 0) MsgBox arr(0, 1)
buzukatak tarafından 19/Eki/13 03:42 tarihinde düzenlenmiştir -
istediğin şey için preserve kullanamazsın hocam ama şöyle bi çözümü deneyebilirsin.
nested olarak iç içe tanımlayabilirsin. şurada bir örnek var. mesela 3x2 lik bir dizi
Public Function nested() Dim outer outer = Array(Array(1, 2), Array(3, 4)) ReDim Preserve outer(1 To 3) outer(3) = Array(5, 6) nested = outer End Function
sana diziyi dönderiyor... bu fonksiyonu kullanabilirsin.
bir de şöyle bi çözüm var döngülü
tempArray = myArray ReDim myArray(1 To (UBound(myArray()) * 2), 1 To m) For i = 1 To n For j = 1 To m myArray(i, j) = tempArray(i, j) Next j Next i
burada bir kaç farklı çözüm daha mevcut ve yukarıda verdiklerimin açıklamaları
-
Bu gibi durumlarda ya çok boyutlu diziyi doğrusal olarak ele alacaksınız ya da koleksiyonları kullanacaksınız.
http://stackoverflow.com/questions/678938/linear-simulation-of-multidimensional-array/678968#678968
-
performans sorun degilse tek string olarak ele al.
Mesela 3 tane int i saklamak icin dongulerle
"1,2,3;3,6,90;70,60,80;3,60,90,55;"
kullanmak istddiginde split ile kullanabilirsin. Ama cok hafiza yer ve islemciyi de daha fazla kullanir. -
cevaplar için teşekkürler.uğraştığım şey çok ta önemli değildi. diziyi sabit boyuta ayarladım şimdilik sıkıntı yok tekrar teşekkürler.
-
Düz mantık yeni bi dizi oluştur burdakileri ona aktar bu diziyi sil :)