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 VBA
situs ini.
Jawaban:
Memanfaatkan
ByRef
default saat memanggil subsKadang-kadang mungkin untuk menggunakan
Sub
panggilan di tempatFunction
untuk menyimpan beberapa karakter tambahan ...Ini ( 87 karakter)
dapat bekerja kembali ke ( 73 karakter):
Perhatikan ini TIDAK akan berulang selamanya, meskipun tampaknya Anda tidak pernah menetapkan ulang
b
nilai.Di atas tidak menggunakan
Function
panggilan, tetapi malah mengeksploitasiByRef
fungsionalitas ("Dengan Referensi")Sub
panggilan. Apa artinya ini adalah argumen yang diteruskan adalah variabel yang sama seperti dalam fungsi pemanggilan (sebagai lawan dariByVal
pass "By Value", yang merupakan salinan). Setiap modifikasi pada variabel yang diteruskan akan diterjemahkan kembali ke fungsi panggilan.Secara default, vba 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:
sumber
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:
Berikut adalah contoh kode VBA di Jendela Segera untuk menjawab posting PPCG dengan kode tag -golf : Huruf A tanpa A
dijawab oleh Joffan .
Gambar kredit: Excel Campus
sumber
a="value":?a
pertama-tama menetapkan nilaia
, lalu mencetaknya.Pemeriksaan Bersyarat Sebelum Looping
Beberapa pemeriksaan bersyarat berlebihan jika digunakan bersama dengan loop. Sebagai contoh,
For
loop tidak akan diproses jika kondisi awal berada di luar lingkup kondisi berlari.Dengan kata lain, ini ( 49 karakter):
Dapat diubah menjadi ini ( 24 karakter):
sumber
Deklarasi Variabel
Dalam kebanyakan kasus di VBA, Anda dapat meninggalkan
Option Explicit
(sering dihilangkan secara default, tetap) dan melewatkanDim
banyak variabel Anda.Dengan demikian, ini ( 96 Chars):
Menjadi ini ( 46 karakter):
Jika Anda perlu menggunakan objek tertentu (misalnya, array), Anda mungkin masih perlu
Dim
variabel itu.sumber
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 , the
Application.Evaluate()
metode ini mengambil argumen tunggal, yang merupakanName
, 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 normalApa yang masuk
Singkatnya, dengan contoh
[B7]
mengembalikan referensi ke sel itu?[B7].Address
pengembalian"B$7$"
[A1:B5]
mengembalikan referensi rentang keA1:B5
(Range)[A1:B5 A3:D7]
mengembalikan referensi rentang keA3:B5
(Intersect)[A1:B5,C1:D5]
mengembalikan referensi rentang keA1:D5
(secara teknisA1:B5,C1:D5
) (Union)[myRange]
merujuk ke A1: G5[Table1]
(mungkin kurang berguna untuk codegolf)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 setaraIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
- menggabungkan semua string dalam rentang yang panjangnya lebih besar dari 2 dengan spasi!
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
'
untuk buku kerja dengan spasi di namanya, dan kurangnya ekstensi untuk buku kerja bernama default (BOOK+n
)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):
Boolean
)String
)Double
)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:
Range
) (lihat bagian di atas)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 kembaliText
. NamunEvaluate
juga dapat mengembalikan arrayVariant
tipe. Ini bisa sajaHardcoded:
[{1,2;3,4}]
- Output array 2D:,
adalah pemisah kolom,;
memisahkan baris. Dapat menghasilkan array 1DRumus Array:
[ROW(A1:A5)]
- Output array 2D{1,2,3,4,5}
, yaitu (2,1) adalah item kedua (namun beberapa fungsi menampilkan array 1D)[LEN(A1:A5)]
hanya menampilkan Panjang teks dalam sel ke-1 rentangSplit([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 berartiRAND()
untuk membuat rumus lembar kerja Anda mudah berubah.Evaluate()
vs.[]
Ada beberapa perbedaan antara
Evaluate()
dan yang[]
harus diperhatikanEvaluate("SUM(B1,1,"&v &",2)")
akan meringkas[B1]
,1
,2
dan variabelv
Array
Saat mengembalikan Array, hanya Evaluate yang dapat digunakan dengan indeks array, jadi
setara dengan
sumber
i=[ROW(A1:A5)]:v=i(2,1):?v
Kombinasikan
Next
PernyataanDapat dipadatkan menjadi
dimana iterator untuk
For
loopi
,j
dank
- dalam urutan itu.Misalnya di bawah ini (69 Bytes)
Dapat dipadatkan hingga 65 Bytes
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.
sumber
Mengurangi
If
PernyataanSaat menetapkan variabel menggunakan pemeriksaan bersyarat
If ... Then ... Else
, Anda dapat mengurangi jumlah kode yang digunakan dengan menghapusnyaEnd If
dengan meletakkan seluruh pemeriksaan pada satu baris.Misalnya, ini ( 37 karakter):
Dapat direduksi menjadi ini ( 30 karakter)
Jika Anda memiliki lebih dari satu syarat bersarang, Anda dapat meminimalkannya dengan cara ini:
Catatan
:
memungkinkan Anda untuk menambahkan lebih dari satu baris / perintah dalam suatuIf
blokDalam kasus-kasus sederhana seperti ini, Anda biasanya dapat menghapus
Else
dengan mengatur variabel sebelumIf
cek ( 25 karakter):Lebih baik lagi, hal di atas dapat dikurangi lebih jauh dengan menggunakan
IIf()
fungsi ini ( 20 karakter):sumber
Kurangi
Range("A1")
dan Sukai PanggilanRange("A1").Value
(17 Bytes) dan yang lebih sederhanaRange("A1")
(11 Bytes) dapat dikurangi menjadi[A1]
(4 Bytes)sumber
[]
untuk menggantikanEvaluate()
dalam VBA jauh lebih fleksibel daripada sekadar panggilan jarak jauh. Misalnya Anda dapat menggunakannya untuk menggantikanWorksheetFunction.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)]
Evaluate("str")
atau singkatan[str]
sangat kuat di VBA, saya baru tahu, dan saya rasa ini akan berguna untuk bermain golf juga!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)
Versi yang dikurangi: (146 byte)
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:
+-=/*^
dll.To
danStep
dalam sebuahFor
pernyataan:For x=-3To 3Step 0.05
To
,&
,Then
, dll) jika itu didahului oleh literal seperti angka,)
,?
,%
, dll&
saat menggabungkan string:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
sumber
?
vs yangPrint
saya lihat dapat diterima, tetapi menempatkan pada deklarasi ketik seperti&
segera setelah variabel misalnyaDebug.?a&"z"
memberiDebug.Print a&; "z"
. The;
karakter ditambahkan adalah penting untuk kode untuk menjalankan - yang ini masih diperbolehkan?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)
(atau sembarang non-angka lainnya) dan&
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
atau, Atau, untuk 1 byte lebih banyak, tetapi jauh lebih mudah untuk dikerjakan
2) Warnai rentang yang dibutuhkan
Setiap
Range
objek dapat diwarnai oleh panggilancatatan: 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 panggilanCells(r,c)
atauRange(cellAddress)
panggilan. Selanjutnya, seperti yang disebutkan pada wiki ini, ini dapat dikombinasikan dengan nilai warna negatif untuk mengurangi ukuran referensi warnaReferensi Cepat
Referensi Rentang
Sel
A1
dapat dirujuk dengan salah satu cara berikutdan Range
A1:D4
dapat dirujuk dengan salah satu cara berikutReferensi Warna
sumber
Sederhanakan fungsi bawaan
Ketika sering menggunakan fungsi tertentu, tetapkan kembali ke fungsi yang ditentukan pengguna.
Kode berikut ( 127 karakter) dapat dikurangi dari:
ke ( 124 karakter):
Menggabungkan ini dengan trik ByRef , Anda dapat menyimpan lebih banyak karakter (hingga 114 ):
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 sedikitFormat()
panggilan.sumber
a = f(w)
dapat direduksi menjadif w
STDIN dan STDOUT
Memasukkan ke
Sub
rutin danFunction
melalui variabel inputDapat dikurangi menjadi
The
Public
danByRef
panggilan default untuk VBA dan dengan demikian implisit, dan mungkin (hampir) selalu turun.Tipe literal
$
memaksab
untuk 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,
Variant
dan membiarkan semua kesalahan berbasis tipe tidak ditangani. Misalnya.Sub E(F)
di manaF
diharapkan menjadi tipeBoolean[]
(yang akan diteruskan ke rutin sepertiE Array(True, False, False)
)Memasukkan ke
Sub
rutinitas 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
yang secara implisit menempatkan
.value
dari sel[A1]
(yang juga dapat dirujuk sebagaicells(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 nilain
. perhatikan, ini membutuhkan tambahan 2 byte ke kode Anda untukn=
di bagian argumen kompilasi bersyarat dari VBAProject Properties Pane.Kode Contoh
Keluaran Melalui Nilai Fungsi
Tidak banyak yang bisa dikatakan di sini, bentuk umum yang dikutip di bawah ini adalah sekompak mungkin.
CATATAN: pada sebagian besar kasus, lebih byte mengubah metode menjadi subrutin dan output ke jendela VBE langsung (lihat Di Bawah)
Outputing Dari
Sub
rutinitas danFunction
melalui VBE Immediates WindowKeluaran 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.secara fungsional identik dengan
sebagai
?
autoformats untukPrint
.Mengeluarkan dari
Sub
rutinitas dan fungsi VBE Immediate Window melalui Metode LainPada 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 )
sumber
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
untuk
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
sumber
lang-vb
eh? - Aneh bahwa format itu lebih baik daripadalang-vba
untuk jawaban vba.lang-vba
akan memberikan penyorotan, itu sebenarnya hanya penyorotan default. Rupanya VBA belum benar-benar diterapkan di Prettify.js, jadi kami harus tetap menggunakan highlight VBBerganda
If .. Then
CekSeperti dalam bahasa lain, banyak
If
pemeriksaan biasanya dapat digabungkan menjadi satu baris, memungkinkan untuk penggunaanAnd
/Or
(yaitu&&
/||
dalam C dan lainnya), yang dalam VBA menggantikan aThen
danEnd If
.Misalnya, dengan bersarang kondisi ( 93 karakter):
bisa menjadi ( 69 karakter):
Ini juga berfungsi dengan persyaratan non-bersarang.
Pertimbangkan ( 84 karakter):
Ini bisa menjadi ( 51 karakter):
sumber
d=iif(a=b or c=b,0,d)
Akhir
For
LoopSaat menggunakan
For
loop, aNext
baris tidak perlu nama variabel (meskipun mungkin lebih baik digunakan dalam pengkodean normal).Karena itu,
dapat disingkat menjadi:
(Penghematan tergantung pada nama variabel Anda, meskipun jika Anda bermain golf, itu mungkin hanya 1 karakter + 1 ruang.)
sumber
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.
Sebagai gantinya, Anda dapat menggunakan satu baris, rangkaian fungsi yang relatif minimal untuk menyelesaikan pekerjaan:
Ini akan menetapkan string Anda
s
keVariant
arraya
. Berhati-hatilah, karena item terakhir dalam array adalah string kosong (""
), yang perlu ditangani dengan tepat.Begini cara kerjanya:
StrConv
Fungsi mengonversi aString
ke 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
Split
akan mengonversi yang dihasilkanString
menjadi array, menggunakan karakter nolChr(0)
sebagai pembatas.Penting untuk dicatat bahwa
Chr(0)
tidak sama dengan string kosong""
, dan menggunakanSplit
pada""
tidak akan mengembalikan array yang Anda harapkan. Hal yang sama juga berlaku untukvbNullString
(tetapi jika Anda bermain golf, lalu mengapa Anda menggunakan konstanta verbose seperti itu di tempat pertama?).sumber
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):
dapat dikodekan sebagai ( 79 karakter):
Di atas bahkan bukan skenario terbaik. Jika menggunakan sesuatu dengan
Application
, sepertiExcel.Application
dari dalam Access, peningkatan akan jauh lebih signifikan.* Bergantung pada situasinya,
With
mungkin atau mungkin tidak lebih efisien daripada ini ( 64 karakter):sumber
Loop Tak Terbatas
Pertimbangkan untuk mengganti
atau
dengan byte byte kuno tetapi lebih rendah
Jika Anda harus keluar
Sub
atauFunction
sebelum waktunya, maka alih-alihExit ...
mempertimbangkan
End
Perhatikan bahwa
End
menghentikan semua eksekusi kode dan menghapus semua variabel global, jadi gunakan dengan bijaksumber
For
danEnd
) untuk mencerminkan bahwa kasus100
ini tidak akan pernah bertemu dan menambahkan byte yang tidak perluGunakan
Spc(n)
lebihSpace(n)
,[Rept(" ",n)]
atauString(n," ")
Saat mencoba memasukkan beberapa ruang panjang
n
, gunakanlebih
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 tertentuSpace(n)
masih merupakan cara terbaik untuk pergi.sumber
Kurangi
Debug.Print
danPrint
telepon(12 Bytes; perhatikan ruang trailing) dapat dikurangi menjadi
(7 Bytes; perhatikan kurangnya ruang gerak).
Demikian pula,
(6 Bytes) dapat dikurangi menjadi
(1 Byte).
Lebih jauh, ketika beroperasi dalam konteks fungsi jendela langsung VBE anonim,
Debug
pernyataan tersebut dapat dihapus seluruhnya, dan alih-alih mencetak ke jendela langsung VBE via?
dapat diasumsikan sebagai STDIN / STDOUTKarakter spesial
Saat mencetak string Anda juga dapat menggunakan karakter khusus sebagai pengganti
&
. Ini memungkinkan untuk format alternatif dalam apa yang dicetak atau penghapusan spasiUntuk bergabung dengan string variabel, alih-alih
Anda bisa menggunakan titik koma
;
Titik koma ini adalah perilaku default untuk string berturut-turut, selama tidak ada ambiguitas Jadi ini valid:
Tapi tidak
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)Akhirnya, Anda bisa menggunakan deklarasi tipe untuk bergabung dengan string, bukan; masing-masing memiliki sedikit efek pada pemformatan. Untuk semua di bawah
a = 3.14159
ini adalah baris pertamasumber
Gunakan pembantu
Sub
untukPrint
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 memanggilp ""
karena parameter diperlukan.sumber
p""
atau jika tidak dapat ditaklukkanp"
,. Namun, dalam sebagian besar kasus di mana ini mungkin berlaku, lebih masuk akal untuk menggunakan variabel string dan hanya mencetak variabel string di akhir.Gunakan
Array()
sebagai gantiChoose()
Select
atauIf...Then
Saat menetapkan variabel berdasarkan nilai variabel lain, masuk akal untuk menuliskan langkah-langkahnya dengan
If...Then
cek, seperti: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 Case
pernyataan membantu mengurangi ukuran cek dengan membungkus semuanya dalam satu blok, seperti: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.Opsi untuk memilih (
a
dalam 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 tanpaSet
kata kunci) dan bahkan bisa berupa ekspresi atau fungsi.Opsi tambahan adalah menggunakan
Array
fungsi untuk mendapatkan efek yang sama sambil menyimpan karakter lain:sumber
IIf()
lainChoose()
: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))
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
dan setara dengan
untuk mengurangi ini semua yang perlu kita lakukan adalah menemukan nilai heksadesimal negatif yang berakhir di
FFFFFF
dan karena nilai Hex negatif harus dalam formatFFFFXXXXXX
(sepertiX
heksadesimal yang valid) menghitung mundur dariFFFFFFFFFF
(-1
) keFFFF000001
(-16777215
)Mengetahui hal ini kita bisa menggeneralisasi formula itu
Dengan menggunakan ini, beberapa konversi yang bermanfaat adalah
sumber
rgbWhite
=2^24-1
walaupun mungkin dapat dikurangi lebih lanjut jika Anda melewatkan -1 untuk mendapatkan sekitar sana&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 telitiHapus terminal
"
saat mencetak ke Jendela SegeraDiberikan fungsi di bawah ini, yang akan digunakan di jendela debug
Terminal
"
dapat dijatuhkan untuk -1 Byte, meninggalkan string tidak tertutup dan program harus melakukan hal yang sama, tanpa kesalahanYang lebih mengejutkan dari ini adalah bahwa hal ini dapat dilakukan dalam subrutin yang terdefinisi penuh.
Subrutin di atas berjalan seperti yang diharapkan dan autoformats untuk
sumber
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 karenanyadapat dikondensasi menjadi
dan selanjutnya ke
sumber
Lembar Alamat Dengan Nama
Alih-alih Mengatasi
WorkSheet
objek dengan meneleponSeseorang dapat menggunakan
Atau Lebih disukai seseorang dapat mengakses objek secara langsung dan menggunakan
sumber
Eksponensial dan
LongLong
s dalam VBA 64-BitBentuk umum dari eksponensial,
Dapat direpresentasikan dalam VBA sebagai
Tapi Hanya di 32-Bit Instalasi Office , di 64-Bit menginstal Office, cara terpendek yang dapat Anda wakili tanpa kesalahan ini adalah
Ini karena dalam versi 64-Bit VBA
^
berfungsi baik sebagai karakter eksponensial literal maupunLongLong
tipe deklarasi . Ini berarti bahwa beberapa sintaks yang agak aneh tetapi valid dapat muncul sepertiyang menetapkan variabel
a
untuk menyimpan nilai maksimum aLonglong
sumber
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
Dan nilai
long
atauinteger
dapat dikonversi menjadi dua karakter denganJadi untuk sebuah
byte
array, algoritma kompresi akan terlihat seperti iniMemperhatikan bahwa
Select Case
bagian diimplementasikan karena karakter yang mungkin tidak disimpan sebagai literal dalam string.Dari string yang dihasilkan, yang akan terlihat seperti
Data kemudian dapat diekstraksi menggunakan fungsi
Asc
danMid
, misalnyasumber
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.HorizantalAlignment
properti.Ini berarti, misalnya bahwa pengaturan sel agar teksnya terpusat
dapat dipersingkat menjadi
dengan mengganti nilai konstan yang tidak tepat
3
untuk nilai yang tepat-4108
. Perhatikan bahwa jika Anda mengambil nilairng.HorizantalAlignment
properti, itu akan mengembalikan nilai yang tepat. Dalam hal ini, itu akan terjadi-4108
.sumber
Di Excel, Buat Array Numerik dengan Memaksa Ranges
Ketika satu set tunggal numerik konstan dari panjang campuran,S diperlukan, akan lebih efisien untuk menggunakan
[{...}]
notasi untuk mendeklarasikan rentang dan kemudian memaksanya menjadi array numerik daripada menggunakanSplit(String)
notasi atau sejenisnya.Menggunakan metode ini, perubahanΔjumlah byte= - 5 byte harus diakui untuk semua S .
Contoh
Contohnya,
dapat ditulis sebagai
Lebih lanjut perlu dicatat bahwa sementara metode ini tidak memungkinkan untuk pengindeksan langsung, itu memungkinkan untuk iterasi di atas for loop secara langsung, yaitu
sumber