Kiat untuk bermain golf di VBA

16

Mirip dengan ini , ini , dan pertanyaan ini ...

Apa tip umum yang Anda miliki untuk bermain golf VBA? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik VBA(misalnya "menghapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.

Meskipun saya telah bekerja dengan bahasa lain, saya terkuat di dalamnya VBA, dan saya tidak melihat banyak pegolf menggunakan VBAsitus ini.

Gaffi
sumber
Dikonversi ke Komunitas Wiki sesuai kebijakan.
dmckee
Maaf itu tidak otomatis di pihak saya!
Gaffi
Tidak ada masalah. Sebenarnya, mereka telah mengambil kekuatan untuk membuat pertanyaan CW dari pengguna (Anda masih bisa melakukan jawaban, saya pikir). Anda dapat menandai untuk mendapatkan perhatian moderator, tetapi sedikit aktivitas yang didapatkan CodeGolf hampir tidak perlu.
dmckee
2
VBA adalah bahasa yang relatif verbose dengan beberapa pintasan sintaksis. Jika Anda mencari skor terbaik, VBA mungkin bukan pilihan yang baik. Jika Anda ingin mengasah keterampilan Anda, lebih banyak kekuatan untuk Anda.
Tn. Llama
2
@ GigaWatt, mengasah keterampilan saya. Sebenarnya sejak bermain-main dengan tantangan yang berbeda, saya sudah mengambil beberapa trik baru untuk bekerja dengan VBA! Saya tidak berharap untuk memenangkan tantangan kode-golf nyata dengan VBA, tapi ini praktik yang baik. :-)
Gaffi

Jawaban:

8

Memanfaatkan ByRefdefault saat memanggil subs

Kadang-kadang mungkin untuk menggunakan Subpanggilan di tempat Functionuntuk menyimpan beberapa karakter tambahan ...

Ini ( 87 karakter)

Sub a()
b = 0
Do Until b = 5
b = c(b)
Loop
End Sub
Function c(d)
c = d + 1
End Function

dapat bekerja kembali ke ( 73 karakter):

Sub a()
b = 0
Do Until b = 5
c b
Loop
End Sub
Sub c(d)
d = d + 1
End Sub

Perhatikan ini TIDAK akan berulang selamanya, meskipun tampaknya Anda tidak pernah menetapkan ulang bnilai.

Di atas tidak menggunakan Functionpanggilan, tetapi malah mengeksploitasi ByReffungsionalitas ("Dengan Referensi") Subpanggilan. Apa artinya ini adalah argumen yang diteruskan adalah variabel yang sama seperti dalam fungsi pemanggilan (sebagai lawan dari ByValpass "By Value", yang merupakan salinan). Setiap modifikasi pada variabel yang diteruskan akan diterjemahkan kembali ke fungsi panggilan.

Secara default, mengambil semua argumen sebagai ByRef, jadi tidak perlu menggunakan karakter untuk mendefinisikan ini.

Contoh di atas mungkin tidak menerjemahkan dengan sempurna untuk Anda, tergantung pada nilai balik fungsi Anda. (Yaitu mengembalikan tipe data yang berbeda dari apa yang diteruskan), tetapi ini juga memungkinkan untuk kemungkinan mendapatkan nilai kembali sementara masih memodifikasi variabel asli Anda.

Sebagai contoh:

Sub a()
b = 0
Debug.Print c(b) ' This will print 0, and b will equal 1.'
End Sub
Function c(d)
c = d
d = d + 1
End Function
Gaffi
sumber
7

Tulis dan jalankan kode VBA di Jendela Segera

Jendela Segera mengevaluasi pernyataan VBA yang dapat dieksekusi yang valid. Cukup masukkan pernyataan di Jendela Segera seperti yang Anda lakukan pada editor kode. Dengan cepat mengeksekusi kode VBA dan dapat menyimpan banyak karakter tambahan karena:

  1. Menempatkan tanda tanya (?) Di awal pernyataan memberi tahu Jendela Segera untuk menampilkan hasil kode Anda.

masukkan deskripsi gambar di sini

  1. Anda tidak perlu menggunakan Sub dan End Sub dalam kode Anda.

masukkan deskripsi gambar di sini


Berikut adalah contoh kode VBA di Jendela Segera untuk menjawab posting PPCG dengan tag : Huruf A tanpa A

?Chr(88-23);

dijawab oleh Joffan .


Gambar kredit: Excel Campus

Anastasiya-Romanova 秀
sumber
1
Itu menggunakan lingkungan REPL? Itu berarti hanya potongan, bukan program atau fungsi
caird coinheringaahing
Saya pikir contoh lain untuk ditambahkan mungkin Anda juga dapat membuat variabel inline; misalnya a="value":?apertama-tama menetapkan nilai a, lalu mencetaknya.
Greedo
6

Pemeriksaan Bersyarat Sebelum Looping

Beberapa pemeriksaan bersyarat berlebihan jika digunakan bersama dengan loop. Sebagai contoh, Forloop tidak akan diproses jika kondisi awal berada di luar lingkup kondisi berlari.

Dengan kata lain, ini ( 49 karakter):

If B > 0 Then
For C = A To A + B
'...
Next
End If

Dapat diubah menjadi ini ( 24 karakter):

For C = A To A + B ' if B is 0 or less, then the code continues past Next, unabated.
'...
Next
Gaffi
sumber
Komentar di bawah salah. Jika B = 0 maka loop akan dimasukkan. pastebin.com/97MBB7hq
QHarr
5

Deklarasi Variabel

Dalam kebanyakan kasus di VBA, Anda dapat meninggalkan Option Explicit(sering dihilangkan secara default, tetap) dan melewatkan Dimbanyak variabel Anda.

Dengan demikian, ini ( 96 Chars):

Option Explicit

Sub Test()
Dim S As String
Dim S2 As String
S = "Test"
S2 = S
MsgBox S2
End Sub

Menjadi ini ( 46 karakter):

Sub Test()
S = "Test"
S2 = S
MsgBox S2
End Sub

Jika Anda perlu menggunakan objek tertentu (misalnya, array), Anda mungkin masih perlu Dimvariabel itu.

Gaffi
sumber
Tunggu sebentar, Anda menerima jawaban Anda sendiri untuk pertanyaan Anda. Tidak keren, kawan.
Taylor Scott
1
@TaylorScott Ini adalah posting wiki - tidak ada poin, dan dalam hal ini, tidak ada satu jawaban terbaik. :) Saya menerima jawaban ~ 5 tahun yang lalu untuk menghindari bendera di daftar pertanyaan saya.
Gaffi
1
@TaylorScott juga jika Anda menerima jawaban Anda sendiri, Anda tidak mendapatkan +15 atau +2 (untuk menerima)
caird coinheringaahing
5

Evaluate() Dan []

Seperti yang telah ditunjukkan sebelumnya, panggilan jarak jauh dengan kode keras dapat dikurangi menggunakan tanda kurung siku [A1] notasi . Namun ia memiliki banyak kegunaan lebih dari itu.

Menurut dokumentasi MSDN , theApplication.Evaluate() metode ini mengambil argumen tunggal, yang merupakan Name, sebagaimana didefinisikan oleh konvensi penamaan Microsoft Excel.

NB [string]adalah singkatan untukEvaluate("string") (perhatikan ""tanda bicara yang menunjukkan tipe data string), meskipun ada beberapa perbedaan penting yang dibahas pada bagian akhir.

Jadi apa artinya semua itu dalam hal penggunaan?

Pada dasarnya, [some cell formula here] mewakili sel dalam lembar kerja excel, dan Anda dapat memasukkan cukup banyak apa pun ke dalamnya dan mendapatkan apa pun dari itu yang Anda bisa dengan sel normal

Apa yang masuk

Singkatnya, dengan contoh

  • Referensi gaya A1. Semua referensi dianggap sebagai referensi absolut.
    • [B7] mengembalikan referensi ke sel itu
    • Karena referensi bersifat absolut, ?[B7].Addresspengembalian"B$7$"
  • Kisaran Anda dapat menggunakan operator jangkauan, persimpangan, dan gabungan (masing-masing titik, spasi, dan koma) dengan referensi.
    • [A1:B5]mengembalikan referensi rentang ke A1:B5(Range)
    • [A1:B5 A3:D7] mengembalikan referensi rentang ke A3:B5 (Intersect)
    • [A1:B5,C1:D5]mengembalikan referensi rentang ke A1:D5(secara teknis A1:B5,C1:D5) (Union)
  • Nama yang ditentukan
    • Ditentukan pengguna seperti [myRange] merujuk ke A1: G5
    • Otomatis, seperti nama tabel [Table1] (mungkin kurang berguna untuk codegolf)
    • Ada lagi yang bisa Anda temukan di menu [Formulas]>[Name Manager]
  • Formula
    • Sangat bermanfaat ; rumus apa pun yang bisa masuk dalam sel bisa masuk Evaluate()atau[]
    • [SUM(1,A1:B5,myRange)]mengembalikan jumlah nilai aritmatika dalam rentang myRange di sini merujuk pada nama buku kerja bukan variabel VBA
    • [IF(A1=1,"true","false")] (1 byte lebih pendek dari vba setara Iif([A1]=1,"true","false") )
    • Rumus array [CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]- menggabungkan semua string dalam rentang yang panjangnya lebih besar dari 2 dengan spasi
  • Referensi eksternal
    • Anda bisa menggunakan !operator untuk merujuk ke sel atau ke nama yang ditentukan di buku kerja lain
    • [[BOOK1]Sheet1!A1]mengembalikan referensi rentang ke A1 di BOOK1 atau ['[MY WORKBOOK.XLSM]Sheet1!'A1]untuk yang sama diMY WORKBOOK
    • Perhatikan 'untuk buku kerja dengan spasi di namanya, dan kurangnya ekstensi untuk buku kerja bernama default ( BOOK+n)
  • Bagan Objek (Lihat artikel MSDN)

NB Saya mengajukan pertanyaan pada SO untuk info ini, jadi lihatlah di sana untuk penjelasan yang lebih baik

Apa yang keluar

Mirip dengan apa yang masuk, apa yang keluar termasuk apa pun yang bisa dikembalikan oleh sel lembar kerja. Ini adalah tipe data Excel standar (dan VBA-nya yang setara):

  • Logis ( Boolean)
  • Teks ( String)
  • Numerik ( Double)
  • Kesalahan ( Variant/Error) (ini adalah kesalahan yang tidak melanggar, mis. Mereka tidak menghentikan eksekusi kode, ?[1/0]mengeksekusi dengan baik)

Tetapi ada beberapa hal yang dapat dikembalikan dimana sel tidak dapat:

  • Referensi rentang ( Range) (lihat bagian di atas)
  • Array ( Variant())

Array

Seperti yang telah ditunjukkan, []dapat digunakan untuk mengevaluasi rumus array yang mengembalikan salah satu tipe data Excel standar; misalnya [CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]yang kembali Text. Namun Evaluatejuga dapat mengembalikan array Varianttipe. Ini bisa saja

Hardcoded:

[{1,2;3,4}]- Output array 2D: ,adalah pemisah kolom, ;memisahkan baris. Dapat menghasilkan array 1D

Rumus Array:

[ROW(A1:A5)]- Output array 2D{1,2,3,4,5} , yaitu (2,1) adalah item kedua (namun beberapa fungsi menampilkan array 1D)

  • Untuk alasan apa pun, beberapa fungsi tidak mengembalikan array secara default

[LEN(A1:A5)] hanya menampilkan Panjang teks dalam sel ke-1 rentang

  • Namun ini dapat dipaksa untuk memberikan array

Split([CONCAT(" "&LEN(A1:A5))]) memberikan array 1D 0 hingga 5, di mana item pertama kosong

[INDEX(LEN(A1:A5),)]adalah solusi lain, pada dasarnya Anda harus menggunakan fungsi penanganan array untuk mendapatkan perilaku pengembalian array yang diinginkan, mirip dengan menambahkan berarti RAND()untuk membuat rumus lembar kerja Anda mudah berubah.

  • Saya mengajukan pertanyaan pada SO untuk mencoba mendapatkan info yang lebih baik tentang ini, silakan edit / komentar dengan opsi yang lebih baik jika Anda menemukannya

Evaluate() vs. []

Ada beberapa perbedaan antara Evaluate()dan yang []harus diperhatikan

  1. String vs hardcoded
    • Mungkin perbedaan yang paling penting, Mengevaluasi mengambil input string di mana [] membutuhkan input hardcoded
    • Ini berarti kode Anda dapat membangun string dengan variabel misalnya Evaluate("SUM(B1,1,"&v &",2)")akan meringkas [B1], 1, 2dan variabelv
  2. Array

    Saat mengembalikan Array, hanya Evaluate yang dapat digunakan dengan indeks array, jadi

    v=Evaluate("ROW(A1:A5)")(1,1) ''#29 bytes

    setara dengan

    i=[ROW(A1:A5)]:v=i(1,1) ''#23 bytes
Greedo
sumber
Maaf untuk postingan raksasa, jika ada yang merasa mereka dapat membuat area lebih ringkas / jika Anda memiliki tips untuk ditambahkan, jangan ragu. Juga, meskipun saya meneliti beberapa hal ini, sebagian yang adil ditemukan melalui percobaan di VBA, jadi jika Anda menemukan kesalahan merasa ada sesuatu yang hilang, jangan ragu untuk berkomentar / mengedit yang sesuai!
Greedo
1
Sebenarnya bagian terakhir pada array sedikit tidak aktif - dapat digunakan di jendela langsungi=[ROW(A1:A5)]:v=i(2,1):?v
Taylor Scott
@TaylorScott Jadi Anda bisa, saya benar-benar tidak menyadari bahwa Anda dapat mengatur / menahan nilai-nilai dalam variabel yang belum ditentukan, tapi saya kira itu karena saya masih harus memahami jendela 1-liners Immediate. Telah diperbarui sesuai
Greedo
Apakah ini cocok dengan Match? Saya mencoba, tetapi selalu mengembalikan kesalahan. Saya melewati array bukan rentang, meskipun.
seadoggie01
5

Kombinasikan NextPernyataan

Next:Next:Next

Dapat dipadatkan menjadi

Next k,j,i

dimana iterator untuk Forloop i, jdan k- dalam urutan itu.

Misalnya di bawah ini (69 Bytes)

For i=0To[A1]
For j=0To[B1]
For k=0To[C1]
Debug.?i;j;k
Next
Next
Next

Dapat dipadatkan hingga 65 Bytes

For i=0To[A1]
For j=0To[B1]
For k=0To[C1]
Debug.?i;j;k
Next k,j,i

Dan sejauh bagaimana hal ini memengaruhi pemformatan dan lekukan, saya pikir pendekatan terbaik untuk menangani ini dibiarkan menyelaraskan pernyataan berikutnya dengan yang paling luar untuk pernyataan. Misalnya.

For i=0To[A1]
    For j=0To[B1]
        For k=0To[C1]
            Debug.?i;j;k
Next k,j,i
Taylor Scott
sumber
4

Mengurangi IfPernyataan

Saat menetapkan variabel menggunakan pemeriksaan bersyarat If ... Then ... Else, Anda dapat mengurangi jumlah kode yang digunakan dengan menghapusnya End Ifdengan meletakkan seluruh pemeriksaan pada satu baris.

Misalnya, ini ( 37 karakter):

If a < b Then
c = b
Else
c = a
End If

Dapat direduksi menjadi ini ( 30 karakter)

If a < b Then c = b Else c = a

Jika Anda memiliki lebih dari satu syarat bersarang, Anda dapat meminimalkannya dengan cara ini:

If a Then If b Then If c Then Z:If d Then Y:If e Then X Else W Else V:If f Then U 'Look ma! No "End If"!

Catatan :memungkinkan Anda untuk menambahkan lebih dari satu baris / perintah dalam suatu Ifblok

Dalam kasus-kasus sederhana seperti ini, Anda biasanya dapat menghapus Elsedengan mengatur variabel sebelum Ifcek ( 25 karakter):

c = a
If a < b Then c = b

Lebih baik lagi, hal di atas dapat dikurangi lebih jauh dengan menggunakan IIf()fungsi ini ( 20 karakter):

c = IIf(a < b, b, a)
Gaffi
sumber
3

Kurangi Range("A1")dan Sukai Panggilan

Range("A1").Value(17 Bytes) dan yang lebih sederhana Range("A1")(11 Bytes) dapat dikurangi menjadi [A1](4 Bytes)

Taylor Scott
sumber
2
Atau secara umum, penggunaan []untuk menggantikan Evaluate()dalam VBA jauh lebih fleksibel daripada sekadar panggilan jarak jauh. Misalnya Anda dapat menggunakannya untuk menggantikan WorksheetFunction.FuncName(args)dengan adil [FuncName(args)], seperti ?[SUMPRODUCT({1,3,5},{2,7,-1})]atau yang sangat berguna [MIN(1,2,3)]/[MAX(1,2,3)]
Greedo
Greedo, itu adalah fungsi yang sangat penting yang saya tidak tahu Anda harus menambahkan ini sebagai jawabannya sendiri.
Taylor Scott
1
Tentu saja, saya akan menulis sesuatu segera. Ya Evaluate("str")atau singkatan [str]sangat kuat di VBA, saya baru tahu, dan saya rasa ini akan berguna untuk bermain golf juga!
Greedo
Sangat berguna, cukup sehingga saya akan kembali melalui jawaban saya untuk melihat apakah saya bisa memberikan bytecount saya karena itu
Taylor Scott
3

Hapus Spasi

VBA akan memformat otomatis untuk menambahkan banyak spasi yang sebenarnya tidak perlu. Ada jawaban pada meta yang masuk akal bagi saya mengapa kita dapat diskon byte ditambahkan oleh pemformatan otomatis. Penting untuk selalu memverifikasi bahwa Anda belum menghapus terlalu banyak. Sebagai contoh, inilah jawaban saya yang berkurang hampir 22% hanya dengan menghilangkan spasi:

Versi asli: (188 byte)

Sub g(n)
For i = 0 To 1
For x = -3 To 3 Step 0.05
y = n ^ x * Cos(Atn(1) * 4 * x)
If y < m Then m = y
If i = 1 Then Cells(500 * (1 - y / m) + 1, (x + 3) * 100 + 1) = "#"
Next
Next
End Sub

Versi yang dikurangi: (146 byte)

Sub g(n)
For i=0To 1
For x=-3To 3Step 0.05
y=n^x*Cos(Atn(1)*4*x)
If y<m Then m=y
If i=1Then Cells(500*(1-y/m)+1,(x+3)*100+1)="#"
Next
Next
End Sub

Jika Anda menyalin / menempel versi yang diperkecil ke dalam VBA, itu akan secara otomatis meluas ke yang asli. Anda dapat bermain-main dengan tempat yang valid untuk menghapus spasi. Yang saya temukan sejauh ini semua tampaknya mengikuti pola di mana VBA diharapkan akan muncul perintah tertentu karena, tanpa itu, itu bukan kode yang valid. Berikut adalah beberapa yang saya temukan sejauh ini:

  • Sebelum dan sesudah operasi matematika: +-=/*^dll.
  • Sebelum Todan Stepdalam sebuah Forpernyataan:For x=-3To 3Step 0.05
  • Sebenarnya, sebelum kata reserved ( To, &, Then, dll) jika itu didahului oleh literal seperti angka, ), ?, %, dll
  • Setelah &saat menggabungkan string:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
  • Setelah panggilan fungsi: If s=StrReverse(s)Then
  • Dalam panggilan fungsi: Replace(Space(28)," ",0)
Toast insinyur
sumber
Apa aturan tentang penambahan karakter non-spasi melalui pemformatan otomatis. Sesuatu seperti ?vs yang Printsaya lihat dapat diterima, tetapi menempatkan pada deklarasi ketik seperti& segera setelah variabel misalnya Debug.?a&"z"memberi Debug.Print a&; "z". The ;karakter ditambahkan adalah penting untuk kode untuk menjalankan - yang ini masih diperbolehkan?
Greedo
2
@ Gredo saya melihatnya jalan dijawab oleh meta itu: Jika Anda bisa menyalin / menempelkannya ke editor dan kode akan berjalan, tidak apa-apa. Yaitu, jika VBA secara otomatis menambahkan karakter kembali ketika Anda menempelkan kode, maka itu OK.
Engineer Toast
1
@ EngineerToast Anda benar-benar dapat menjatuhkan satu byte lagi dari contoh Anda: If i=1 Then dapat menjadiIf i=1Then karena, sebagai aturan umum kata reserved yang mengikuti literal, bahwa angka, ), ?, %, .. dll, tidak perlu dipisahkan oleh ruang
Taylor Scott
1
@ EngineerToast, Anda juga dapat menjatuhkan byte dari titik peluru ketiga karena Anda dapat menjatuhkan spasi di antara ) (atau sembarang non-angka lainnya) dan&
Taylor Scott
3

Mempersiapkan Seni Pixel

Pixel art sejauh ini adalah salah satu area terkuat Excel, karena tidak perlu membuat kanvas, karena sudah ada untuk Anda - yang perlu Anda lakukan hanyalah membuat beberapa penyesuaian kecil

1) Buat sel menjadi sel

Cells.RowHeight=48

atau, Atau, untuk 1 byte lebih banyak, tetapi jauh lebih mudah untuk dikerjakan

Cells.ColumnWidth=2

2) Warnai rentang yang dibutuhkan

Setiap Rangeobjek dapat diwarnai oleh panggilan

`MyRangeObj`.Interior.Color=`ColorValue`

catatan: ini dapat dan harus dikombinasikan dengan trik lain yang dicatat pada wiki ini, seperti referensi rentang dengan penggunaan []notasi (misalnya [A1:R5,D6]) atas penggunaan panggilan Cells(r,c)atau Range(cellAddress)panggilan. Selanjutnya, seperti yang disebutkan pada wiki ini, ini dapat dikombinasikan dengan nilai warna negatif untuk mengurangi ukuran referensi warna

Referensi Cepat

Referensi Rentang

Sel A1 dapat dirujuk dengan salah satu cara berikut

Range("A1")
Cells(1,1)
[A1]

dan Range A1:D4 dapat dirujuk dengan salah satu cara berikut

Range("A1:D4")
Range("A1").Resize(4,4)
Cells(1,1).Resize(4,4)
[A1].Resize(4,4,)
[A1:D4]

Referensi Warna

Black  0
White  -1
Red    255
Aqua   -256
Taylor Scott
sumber
3

Sederhanakan fungsi bawaan

Ketika sering menggunakan fungsi tertentu, tetapkan kembali ke fungsi yang ditentukan pengguna.

Kode berikut ( 127 karakter) dapat dikurangi dari:

Sub q()
w = 0
x = 1
y = 2
z = 3
a = Format(w, "0.0%")
b = Format(x, "0.0%")
c = Format(y, "0.0%")
d = Format(z, "0.0%")
End Sub

ke ( 124 karakter):

Sub q()
w = 0
x = 1
y = 2
z = 3
a = f(w)
b = f(x)
c = f(y)
d = f(z)
End Sub
Function f(g)
f = Format(g, "0.0%")
End Function

Menggabungkan ini dengan trik ByRef , Anda dapat menyimpan lebih banyak karakter (hingga 114 ):

Sub q()
w = 0
x = 1
y = 2
z = 3
a = f(w)
b = f(x)
c = f(y)
d = f(z)
End Sub
Sub f(g)
g = Format(g, "0.0%")
End Sub

Lakukan ini dengan bijaksana, karena VBA membutuhkan banyak karakter untuk mendefinisikan a Function. Blok kode kedua benar-benar akan lebih besar dari yang pertama dengan setiap nomor yang lebih sedikit Format()panggilan.

Gaffi
sumber
2
dalam yang terakhir, Anda tidak perlu panggilan tugas, yang artinya a = f(w)dapat direduksi menjadif w
Taylor Scott
3

STDIN dan STDOUT

Memasukkan ke Subrutin dan Functionmelalui variabel input

Public Sub A(ByRef B as String)

Dapat dikurangi menjadi

Sub a(b$) 

The Publicdan ByRefpanggilan default untuk VBA dan dengan demikian implisit, dan mungkin (hampir) selalu turun.

Tipe literal $memaksa buntuk menjadi tipeString .

Jenis literal lainnya

  • ! Tunggal
  • @ Mata uang
  • # Dua kali lipat
  • % Bilangan bulat
  • $ Tali
  • & Panjang
  • ^ LongLong (Hanya 64 Bit)

Selain itu, secara umum diterima bahwa Anda dapat meninggalkan variabel input sebagai tipe default, Variantdan membiarkan semua kesalahan berbasis tipe tidak ditangani. Misalnya. Sub E(F)di mana Fdiharapkan menjadi tipe Boolean[](yang akan diteruskan ke rutin seperti E Array(True, False, False))

Memasukkan ke Subrutinitas dan Fungsi Jendela Segera viaCells

VBA tidak memiliki konsol yang berfungsi penuh dan karenanya tidak memiliki STDIN resmi , dan karenanya memungkinkan untuk beberapa permainan dengan masukan yang lewat.

Dalam excel, umumnya diterima untuk mengambil input dari sel atau rentang sel, yang dapat dilakukan seperti

s=[A1]

yang secara implisit menempatkan .valuedari sel [A1](yang juga dapat dirujuk sebagai cells(1,1)ataurange("A1")

Contoh Masalah: Menampilkan input dalam kotak pesan

Melalui Subroutine Sub A:msgbox[A1]:End Sub

Melalui Fungsi Jendela Segera msgbox[A1]

Memasukkan Melalui Argumen Kompilasi Bersyarat

Dukungan Proyek VBA mengambil argumen dari baris perintah atau melalui Properti Proyek VBAP (lihat melalui penjelajah proyek -> [Proyek VBA Anda] - (Klik Kanan) -> Properti Proyek VBAP -> Argumen Kompilasi Bersyarat)

Ini sangat berguna untuk Tantangan Kode Kesalahan

Diberikan Argumen Kompilasi Bersyarat n=[some_value] ini memungkinkan untuk mengeksekusi kode yang akan menghasilkan kode kesalahan, berdasarkan dari nilai n. perhatikan, ini membutuhkan tambahan 2 byte ke kode Anda untuk n=di bagian argumen kompilasi bersyarat dari VBAProject Properties Pane.

Kode Contoh

...
#If n=3 then
return ''  Produces error code '3', Return without GoSub
#ElseIf n=20 then
resume ''  Produces error code '20', Resume without Error
#EndIf
...

Keluaran Melalui Nilai Fungsi

Tidak banyak yang bisa dikatakan di sini, bentuk umum yang dikutip di bawah ini adalah sekompak mungkin.

Public Function A(b)
    ...
    A=C
End Function

CATATAN: pada sebagian besar kasus, lebih byte mengubah metode menjadi subrutin dan output ke jendela VBE langsung (lihat Di Bawah)

Outputing Dari Subrutinitas dan Functionmelalui VBE Immediates Window

Keluaran ke VBE segera jendela (AKA the VBE Debug Window) adalah metode keluaran umum untuk VBA untuk tantangan berbasis teks, namun, penting untuk diingat bahwa Debug.Print "Text"panggilan mungkin secara substansial golf.

Debug.Print "Text"

secara fungsional identik dengan

Debug.?"Text"

sebagai ?autoformats untuk Print.

Mengeluarkan dari Subrutinitas dan fungsi VBE Immediate Window melalui Metode Lain

Pada kesempatan langka , ketika situasinya tepat, Anda dapat mengambil input dari beberapa input yang lebih sepele yang tersedia untuk VBA seperti adjuster ukuran font, pemilih font, dan zoom. (Misalnya. Meniru Pemilih Ukuran Huruf Kata )

Taylor Scott
sumber
2

Catatan Cepat tentang Pemformatan

Karena StackExchange menggunakan Markdown dan Prettify.js , dimungkinkan untuk menambahkan tanda bahasa pada jawaban koding Anda, yang umumnya membuat mereka terlihat lebih profesional. Walaupun saya tidak dapat menjamin bahwa ini akan membuat Anda lebih baik dalam bermain golf di VBA, saya dapat menjamin bahwa itu akan membuat Anda terlihat seperti Anda.

Menambahkan salah satu dari bendera di bawah ini akan berubah

Public Sub a(ByRef b As Integer) ' this is a comment

untuk

Public Sub a(ByRef b As Integer) ' this is a comment

Tag Bahasa VBA

<!-- language: lang-vb -->

<!-- language-all: lang-vb -->

Catatan: yang terakhir mengubah semua segmen kode dalam jawaban Anda, sedangkan yang sebelumnya hanya mengubah segmen kode yang berikut

Taylor Scott
sumber
lang-vbeh? - Aneh bahwa format itu lebih baik daripada lang-vbauntuk jawaban vba.
Greedo
1
@ Greedo, itu karena sementara lang-vbaakan memberikan penyorotan, itu sebenarnya hanya penyorotan default. Rupanya VBA belum benar-benar diterapkan di Prettify.js, jadi kami harus tetap menggunakan highlight VB
Taylor Scott
2

Berganda If .. ThenCek

Seperti dalam bahasa lain, banyak Ifpemeriksaan biasanya dapat digabungkan menjadi satu baris, memungkinkan untuk penggunaan And/ Or(yaitu &&/ ||dalam C dan lainnya), yang dalam VBA menggantikan a ThendanEnd If .

Misalnya, dengan bersarang kondisi ( 93 karakter):

'There are MUCH easier ways to do this check (i.e. a = d).
'This is just for the sake of example.
If a = b Then
    If b = c Then
        If c = d Then
            MsgBox "a is equal to d"
        End If
    End If
End If

bisa menjadi ( 69 karakter):

If a = b And b = c And c = d Then
    MsgBox "a is equal to d"
End If

Ini juga berfungsi dengan persyaratan non-bersarang.

Pertimbangkan ( 84 karakter):

If a = b Then            
    d = 0
End If

If c = b Then            
    d = 0
End If

Ini bisa menjadi ( 51 karakter):

If a = b Or c = b Then            
    d = 0
End If
Gaffi
sumber
1
di pernyataan If - then bagian "End - if" adalah opsional, asalkan Anda menulis kode dalam satu baris.
Stupid_Intern
@newguy Benar. Lihat juga jawaban lain ini: codegolf.stackexchange.com/a/5788/3862
Gaffi
Pernyataan di atas dapat diringkas lebih lanjut ked=iif(a=b or c=b,0,d)
Taylor Scott
2

Akhir For Loop

Saat menggunakan Forloop, aNext baris tidak perlu nama variabel (meskipun mungkin lebih baik digunakan dalam pengkodean normal).

Karena itu,

For Variable = 1 to 100
    'Do stuff
Next Variable

dapat disingkat menjadi:

For Variable = 1 to 100
    'Do stuff
Next

(Penghematan tergantung pada nama variabel Anda, meskipun jika Anda bermain golf, itu mungkin hanya 1 karakter + 1 ruang.)

Gaffi
sumber
1
2 karakter, jangan lupa menghitung spasi!
11684
Kebetulan saya hampir tidak pernah mengidentifikasi variabel, bahkan dalam kode normal!
dnep
2

Pisahkan string ke dalam array karakter

Kadang-kadang berguna untuk memecah string menjadi karakter individu, tetapi dapat mengambil sedikit kode untuk melakukan ini secara manual di VBA.

ReDim a(1 To Len(s))
' ReDim because Dim can't accept non-Const values (Len(s))
For i = 1 To Len(s)
    a(i) = Mid(s, i, 1)
Next

Sebagai gantinya, Anda dapat menggunakan satu baris, rangkaian fungsi yang relatif minimal untuk menyelesaikan pekerjaan:

a = Split(StrConv(s, 64), Chr(0))

Ini akan menetapkan string Anda ske Variantarray a. Berhati-hatilah, karena item terakhir dalam array adalah string kosong ( ""), yang perlu ditangani dengan tepat.

Begini cara kerjanya: StrConvFungsi mengonversi a Stringke format lain yang Anda tentukan. Dalam hal ini, 64 =vbUnicode , jadi itu dikonversi ke format unicode. Ketika berhadapan dengan string ASCII sederhana, hasilnya adalah karakter nol (bukan string kosong,"" ) yang dimasukkan setelah setiap karakter.

Berikut ini Splitakan mengonversi yang dihasilkanString menjadi array, menggunakan karakter nolChr(0) sebagai pembatas.

Penting untuk dicatat bahwa Chr(0)tidak sama dengan string kosong "", dan menggunakan Splitpada ""tidak akan mengembalikan array yang Anda harapkan. Hal yang sama juga berlaku untuk vbNullString(tetapi jika Anda bermain golf, lalu mengapa Anda menggunakan konstanta verbose seperti itu di tempat pertama?).

Gaffi
sumber
Anda harus menyebutkan bahwa array yang dihasilkan memiliki string kosong tambahan di akhir.
Howard
@ Howard Ya, saya harus. Itu ada di kepalaku saat aku mengetik ini, pasti telah menyelinap di pikiranku.
Gaffi
2

Menggunakan With(Terkadang! Lihat catatan kaki)

Menggunakan With pernyataan itu dapat mengurangi ukuran kode Anda secara signifikan jika Anda menggunakan beberapa objek berulang kali.

yaitu ini ( 80 karakter):

x = foo.bar.object.a.value
y = foo.bar.object.b.value
z = foo.bar.object.c.value

dapat dikodekan sebagai ( 79 karakter):

With foo.bar.object
    x = .a.value
    y = .b.value
    z = .c.value
End With

Di atas bahkan bukan skenario terbaik. Jika menggunakan sesuatu dengan Application, seperti Excel.Applicationdari dalam Access, peningkatan akan jauh lebih signifikan.


* Bergantung pada situasinya, Withmungkin atau mungkin tidak lebih efisien daripada ini ( 64 karakter):

Set i = foo.bar.object
x = i.a.value
y = i.b.value
z = i.c.value
Gaffi
sumber
2

Loop Tak Terbatas

Pertimbangkan untuk mengganti

Do While a<b
'...
Loop

atau

Do Until a=b
'...
Loop

dengan byte byte kuno tetapi lebih rendah

While a<b
'...
Wend

Jika Anda harus keluar Subatau Functionsebelum waktunya, maka alih-alihExit ...

For i=1To 1000
    If i=50 Then Exit Sub
Next

mempertimbangkan End

For i=1To 1E3
    If i=50 Then End
Next

Perhatikan bahwa Endmenghentikan semua eksekusi kode dan menghapus semua variabel global, jadi gunakan dengan bijak

Greedo
sumber
Anda harus mempertimbangkan menulis ulang bagian terakhir ( Fordan End) untuk mencerminkan bahwa kasus 100ini tidak akan pernah bertemu dan menambahkan byte yang tidak perlu
Taylor Scott
Selain itu, meskipun hal ini sangat terbaca, Anda dapat mempertimbangkan untuk menghapus spasi untuk menunjukkan manfaat yang mungkin dari metode ini dengan lebih baik (selalu baik untuk menyalahgunakan autoformatting dalam VBA untuk codegolfing)
Taylor Scott
2

Gunakan Spc(n)lebih Space(n), [Rept(" ",n)]atauString(n," ")

Saat mencoba memasukkan beberapa ruang panjang n, gunakan

Spc(n)              ''  6  bytes

lebih

B1=n:[Rept(" ",B1)] ''  19 bytes
String(n," ")       ''  13 bytes
Space(n)            ''  8  bytes

Catatan: Saya tidak yakin mengapa, tetapi tampaknya Anda tidak dapat menetapkan output Spc(n)ke variabel, dan itu harus lebih dicetak langsung - jadi dalam kasus-kasus tertentu Space(n)masih merupakan cara terbaik untuk pergi.

Taylor Scott
sumber
2

Kurangi Debug.Printdan Printtelepon

Debug.Print [some value] 

(12 Bytes; perhatikan ruang trailing) dapat dikurangi menjadi

Debug.?[some value]

(7 Bytes; perhatikan kurangnya ruang gerak).

Demikian pula,

Print 

(6 Bytes) dapat dikurangi menjadi

?

(1 Byte).

Lebih jauh, ketika beroperasi dalam konteks fungsi jendela langsung VBE anonim, Debugpernyataan tersebut dapat dihapus seluruhnya, dan alih-alih mencetak ke jendela langsung VBE via ?dapat diasumsikan sebagai STDIN / STDOUT

Karakter spesial

Saat mencetak string Anda juga dapat menggunakan karakter khusus sebagai pengganti &. Ini memungkinkan untuk format alternatif dalam apa yang dicetak atau penghapusan spasi

Untuk bergabung dengan string variabel, alih-alih

Debug.Print s1 &s2

Anda bisa menggunakan titik koma ;

Debug.?s1;s2

Titik koma ini adalah perilaku default untuk string berturut-turut, selama tidak ada ambiguitas Jadi ini valid:

Debug.?s1"a"
Debug.?"a"s1

Tapi tidak

Debug.?s1s2 'as this could be interpreted as a variable named "s1s2", not 2 variables
            'use Debug.?s1 s2 instead (or s1;s2)
Debug.?"a""b" 'this prints a"b, so insert a space or ; for ab

Perhatikan bahwa a; pada akhir baris menekan baris baru, karena baris baru secara default ditambahkan setelah setiap cetak. Menghitung byte yang dikembalikan oleh kode VBA sedang dalam perdebatan

Untuk bergabung dengan tab, gunakan koma ,(sebenarnya 14 spasi, tetapi menurut)

Debug.?s1,s2 'returns "s1              s2"

Akhirnya, Anda bisa menggunakan deklarasi tipe untuk bergabung dengan string, bukan; masing-masing memiliki sedikit efek pada pemformatan. Untuk semua di bawah a = 3.14159ini adalah baris pertama

Debug.?a&"is pi" -> " 3 is pi" 'dims a as long, adds leading and trailing space to a
Debug.?a!"is pi" -> " 3.14159 is pi" 'dims a as single, adds leading and trailing space
Debug.?a$"is pi" -> "3.14159is pi" 'dims a as string, no spaces added
Taylor Scott
sumber
2

Gunakan pembantu SubuntukPrint

Jika kode membutuhkan lebih dari enam Debug.? pernyataan, Anda dapat mengurangi byte dengan mengganti semua Debug.? baris dengan panggilan ke Sub seperti yang di bawah ini. Untuk mencetak garis kosong, Anda harus memanggil p ""karena parameter diperlukan.

Sub p(m)
Debug.?m
End Sub
Ben
sumber
1
Untuk mencetak baris baru dengan itu Anda hanya perlu p""atau jika tidak dapat ditaklukkan p",. Namun, dalam sebagian besar kasus di mana ini mungkin berlaku, lebih masuk akal untuk menggunakan variabel string dan hanya mencetak variabel string di akhir.
Taylor Scott
1

Gunakan Array() Choose()sebagai ganti SelectatauIf...Then

Saat menetapkan variabel berdasarkan nilai variabel lain, masuk akal untuk menuliskan langkah-langkahnya dengan If...Thencek, seperti:

If a = 1 Then
b = "a"
ElseIf a = 2 Then
b = "c"
'...
End If

Namun, ini bisa memakan banyak ruang kode jika ada lebih dari satu atau dua variabel untuk diperiksa (masih ada cara yang lebih baik untuk melakukan hal itu).

Sebaliknya, Select Casepernyataan membantu mengurangi ukuran cek dengan membungkus semuanya dalam satu blok, seperti:

Select Case a
Case 1:
b = "a"
Case 2:
b = "c"
'...
End Select

Ini dapat menyebabkan kode yang jauh lebih kecil, tetapi untuk kasus yang sangat sederhana seperti ini, ada metode yang bahkan lebih efisien: Choose()Fungsi ini akan memilih nilai dari daftar, berdasarkan nilai yang diteruskan ke sana.

b = Choose(a,"a","c",...)

Opsi untuk memilih ( adalam hal ini) adalah nilai integer yang diteruskan sebagai argumen pertama. Semua argumen selanjutnya adalah nilai yang harus dipilih (1-diindeks, seperti kebanyakan VBA). Nilai bisa berupa tipe data apa pun asalkan cocok dengan variabel yang ditetapkan (yaitu objek tidak berfungsi tanpa Setkata kunci) dan bahkan bisa berupa ekspresi atau fungsi.

b = Choose(a, 5 + 4, String(7,"?"))

Opsi tambahan adalah menggunakan Arrayfungsi untuk mendapatkan efek yang sama sambil menyimpan karakter lain:

b = Array(5 + 4, String(7,"?"))(a)
Gaffi
sumber
Penggunaan yang menarik dan mungkin sangat bermanfaat untuk bermain golf adalah menggunakan ini bersama dengan yang IIf()lain Choose():A1=IIf(a=Choose(b,c,d,e),Choose(Choose(f,g,h,i),j,k,l),Choose(IIf(m=n,Choose(p,q,r,s),IIf(t=u,v,w)),x,y,z))
Gaffi
1

Nilai RGB Bergeser-Bit

Karena cara Excel menangani warna, (unsigned, 6-heksadesimal integer) Anda dapat menggunakan bilangan bulat bertanda negatif, yang excel hanya akan menggunakan 6 byte yang tepat untuk menetapkan nilai warna

Ini agak membingungkan sehingga beberapa contoh disediakan di bawah ini

Katakanlah Anda ingin menggunakan warna putih, yang disimpan sebagai

rgbWhite

dan setara dengan

&HFFFFFF ''#value: 16777215

untuk mengurangi ini semua yang perlu kita lakukan adalah menemukan nilai heksadesimal negatif yang berakhir di FFFFFFdan karena nilai Hex negatif harus dalam format FFFFXXXXXX(seperti Xheksadesimal yang valid) menghitung mundur dari FFFFFFFFFF( -1) ke FFFF000001(-16777215 )

Mengetahui hal ini kita bisa menggeneralisasi formula itu

Let Negative_Color_Value = -rgbWhite + Positive_Color_Value - 1
                         = -16777215 + Positive_Color_Value - 1
                         = -16777216 + Positive_Color_Value

Dengan menggunakan ini, beberapa konversi yang bermanfaat adalah

rgbWhite = &HFFFFFF = -1 
rgbAqua  = &HFFFF00 = -256
16747627 = &HFF8C6B = -29589
Taylor Scott
sumber
Senang mengetahui apa yang terjadi di sana, saya baru saja menemukannya secara tidak sengaja dalam pertanyaan itu - tetapi penjelasan yang jelas ini menunjukkan cara kerjanya. Hal lain yang perlu diingat adalah bahwa warna-warna kunci tertentu dapat dikurangi dengan operator matematika; rgbWhite= 2^24-1walaupun mungkin dapat dikurangi lebih lanjut jika Anda melewatkan -1 untuk mendapatkan sekitar sana
Greedo
1
Sebenarnya, berikut adalah daftar warna dengan representasi matematikanya, yang lebih pendek daripada versi desimal positif atau negatif: &000080: 2^7, &000100: 2^8, &000200: 2^9, &000400: 2^10, &000800: 2^11, &001000: 2^12, &002000: 2^13, &004000: 2^14, &008000: 2^15, &010000: 2^16, &01FFFF: 2^17-1, &020000: 2^17, &03FFFF: 2^18-1, &040000: 2^18, &07FFFF: 2^19-1, &080000: 2^19, &0FFFFF: 2^20-1, &100000: 2^20, &1FFFFF: 2^21-1, &3FFFFF: 2^22-1, &400000: 2^22, &7FFFFF: 2^23-1 nb belum tentu lengkap, tapi saya pikir saya melakukan pekerjaan yang cukup teliti
Greedo
1

Hapus terminal "saat mencetak ke Jendela Segera

Diberikan fungsi di bawah ini, yang akan digunakan di jendela debug

h="Hello":?h", World!"

Terminal "dapat dijatuhkan untuk -1 Byte, meninggalkan string tidak tertutup dan program harus melakukan hal yang sama, tanpa kesalahan

h="Hello":?h", World!

Yang lebih mengejutkan dari ini adalah bahwa hal ini dapat dilakukan dalam subrutin yang terdefinisi penuh.

Sub a
h="Hello":Debug.?h", World!
End Sub

Subrutin di atas berjalan seperti yang diharapkan dan autoformats untuk

Sub a()
h = "Hello": Debug.Print h; ", World!"
End Sub
Taylor Scott
sumber
1

Gunakan Variabel Truthy dan Falsey dalam kondisi

Kadang-kadang disebut konversi tipe implisit - langsung menggunakan tipe angka dalam a If, [IF(...)]atauIIf(...) pernyataan, dengan menggunakan sifat true and falsey nomor itu benar-benar dapat menghemat beberapa byte.

Dalam VBA, variabel tipe nomor apa pun yang bukan nol dianggap benar (dan dengan demikian nol 0, adalah satu-satunya nilai falsey) dan karenanya

If B <> 0 Then 
    Let C = B
Else 
    Let C = D
End If 

dapat dikondensasi menjadi

If B Then C=B Else C=D

dan selanjutnya ke

C=IIf(B,B,D)
Taylor Scott
sumber
1

Lembar Alamat Dengan Nama

Alih-alih Mengatasi WorkSheetobjek dengan menelepon

Application.ActiveSheet
''  Or 
ActiveSheet   

Seseorang dapat menggunakan

Sheets(n)  ''  Where `n` is an integer
''  Or 
[Sheet1]

Atau Lebih disukai seseorang dapat mengakses objek secara langsung dan menggunakan

Sheet1
Taylor Scott
sumber
1

Eksponensial dan LongLong s dalam VBA 64-Bit

Bentuk umum dari eksponensial,

A to the power of B

Dapat direpresentasikan dalam VBA sebagai

A^B 

Tapi Hanya di 32-Bit Instalasi Office , di 64-Bit menginstal Office, cara terpendek yang dapat Anda wakili tanpa kesalahan ini adalah

A ^B

Ini karena dalam versi 64-Bit VBA ^berfungsi baik sebagai karakter eksponensial literal maupun LongLongtipe deklarasi . Ini berarti bahwa beberapa sintaks yang agak aneh tetapi valid dapat muncul seperti

a^=2^^63^-1^

yang menetapkan variabel auntuk menyimpan nilai maksimum aLonglong

Taylor Scott
sumber
1

Compress Byte Arrays sebagai String

Untuk tantangan yang membutuhkan solusi untuk menyimpan data konstan, mungkin akan berguna untuk mengompresi data tersebut sebagai string tunggal dan untuk kemudian beralih melintasi string untuk mengambil data.

Dalam VBA, nilai byte apa pun dapat langsung dikonversi ke karakter dengan

Chr(byteVal)

Dan nilai longatau integerdapat dikonversi menjadi dua karakter dengan

Chr(longVal / 256) & Chr(longVal Mod 256)

Jadi untuk sebuah bytearray, algoritma kompresi akan terlihat seperti ini

For Each Var In bytes
    Select Case Var
        Case Is = Asc(vbNullChar)
            outstr$ = outstr$ & """+chr(0)+"""
        Case Is = Asc(vbTab)
            outstr$ = outstr$ & """+vbTab+"""
        Case Is = Asc("""")
            outstr$ = outstr$ & """"""
        Case Is = Asc(vbLf)
            outstr$ = outstr$ & """+vbLf+"""
        Case Is = Asc(vbCr)
            outstr$ = outstr$ & """+vbCr+"""
        Case Else
            outstr$ = outstr$ & Chr$(Var)
    End Select
Next
Debug.Print "t="""; outstr$

Memperhatikan bahwa Select Casebagian diimplementasikan karena karakter yang mungkin tidak disimpan sebagai literal dalam string.

Dari string yang dihasilkan, yang akan terlihat seperti

t="5¼-™):ó™ˆ"+vbTab+"»‘v¶<®Xn³"+Chr(0)+"~ίšÐ‘š;$ÔÝ•óŽ¡¡EˆõW'«¡*{ú{Óx.OÒ/R)°@¯ˆ”'®ïQ*<¹çu¶àªp~ÅP>‹:<­«a°;!¾y­›/,”Ì#¥œ5*B)·7    

Data kemudian dapat diekstraksi menggunakan fungsi Ascdan Mid, misalnya

i=Asc(Mid(t,n+1))
Taylor Scott
sumber
1

Gunakan Konstanta yang Tidak Benar

VBA memungkinkan, dalam beberapa kasus, untuk penggunaan konstanta tidak terdaftar atau tidak tepat dalam ekspresi yang membutuhkan nilai konstan. Ini sering merupakan nilai warisan, dan panjangnya lebih pendek dari nilai yang tepat.

Sebagai contoh, nilai-nilai di bawah ini dapat digunakan ketika membiarkan suatu nilai dipegang oleh rng.HorizantalAlignmentproperti.

Tidak benarLayakKonstan UmumxlHAlign  Konstan11xlGeneralxlHAlignGeneral2-4131xleftxlHAlignLeft3-4108xlenterxlHAlignCenter4-4152xTepatxlHAlignRight55xlFillxlHAlignFill6-4130xlJustifyxlHAlignJustify77xlCenterAcrossSelectionxlHAlignCenterAcrossSelection8-4117xlDistribusixlHAlignDistribusi

Ini berarti, misalnya bahwa pengaturan sel agar teksnya terpusat

rng.HorizantalAlignment=-4108

dapat dipersingkat menjadi

rng.HorizantalAlignment=3

dengan mengganti nilai konstan yang tidak tepat 3untuk nilai yang tepat -4108. Perhatikan bahwa jika Anda mengambil nilai rng.HorizantalAlignmentproperti, itu akan mengembalikan nilai yang tepat. Dalam hal ini, itu akan terjadi -4108.

Taylor Scott
sumber
1

Di Excel, Buat Array Numerik dengan Memaksa Ranges

Ketika satu set tunggal numerik konstan dari panjang campuran, Sdiperlukan, akan lebih efisien untuk menggunakan [{...}]notasi untuk mendeklarasikan rentang dan kemudian memaksanya menjadi array numerik daripada menggunakan Split(String)notasi atau sejenisnya.

Menggunakan metode ini, perubahan Δjumlah byte=-5 byte harus diakui untuk semua S.

Contoh

Contohnya,

x=Split("1 2 34 567 8910")

dapat ditulis sebagai

x=[{1,2,34,567,8910}]

Lebih lanjut perlu dicatat bahwa sementara metode ini tidak memungkinkan untuk pengindeksan langsung, itu memungkinkan untuk iterasi di atas for loop secara langsung, yaitu

For Each s In[{1,3,5,7,9,2,4,6,8}]
Taylor Scott
sumber