Hai LB,

Jadi, proses save as dipaksa untuk dilakukan oleh scripts pengarah format
file target (macro enabled).
Pada kondisi VBA boleh bekerja (security macro diset Enable), gambaran
umumnya adalah :
1. ketika user mengklik di menu File Excel melakukan Save As (CTRL A)
maupun Save (CTRL S), maka events Before Save akan bekerja.
2. karena target yang diharapkan adalah menghindari proses Save As, maka
pada events Before Save diperlukan blok pemeriksaan terhadap nilai variabel
input parameter events tersebut yang bernama SaveAsUI.
3. Jika SaveAsUI bernilai TRUE, maka user melakukan Save As dan proses
pengarahan untuk memaksa save berekstensi Macro Enabled dilakukan.
4. Jika bernilai FALSE, maka user melakukan Save dan tidak perlu melakukan
proses apapun.
5. Format file Excel yang bisa menyimpan script VBA (Macro) adalah .xls
(Excel 97-2003, dan pada xl2007 keatas termasuk ekstensi compatibility
file), .xlsm (Macro Enabled pada xl2007 keatas) dan .xlsb (Excel Binary
pada xl2007 keatas)
6. Jika user menggunakan xl2003, maka opsi pilihan ekstensi hanya .xls,
sedangkan untuk user yang menggunakan xl2007 keatas memiliki seluruh opsi
ekstensi (.xls,.xlsm,.xlsb)
7. Artinya, dibutuhkan blok pemeriksa versi Excel yang digunakan user
(properti Version milik object Application)
8. Dalam blok pemeriksa versi tersebut akan dilakukan kegiatan untuk
menampilkan dialog window Save As. Target utama kegiatan ini adalah
mendapatkan nama file (tipe data String) yang di-input-kan oleh user. Nama
file ini disimpan dalam sebuah variabel.
9. Dialog window Save As memiliki tombol Cancel (pembatalan proses Save As)
yang membuat hasil dari dialog (yang seharusnya adalah nama file) akan
bernilai 'False' (tipe data String)
10. Jadi, diperlukan proses pemeriksaan terhadap perlakuan user terhadap
dialog window. Jika variabel penampung nama file bernilai False, maka tidak
perlu memproses apapun. Jika bukan bernilai False, maka proses save as
dengan script harus dilakukan.
11. Proses save as dengan script akan memicu events Before Save lagi, oleh
sebab itu, properti status ijin bekerjanya seluruh events harus di-off-ken.
12. Proses save as dengan script membutuhkan kejelasan format file, apakah
user memilih opsi tipe .xls atau .xlsm atau .xlsb (tergantung jumlah opsi
yang ada berdasar versi Excel yang digunakan user)
13. Kalau begitu, maka perlu pemeriksaan terhadap tipe file yang dipilih
user. Penandanya adalah karakter terakhir nama file dalam variabel
penampung nama file, yaitu 's' untuk .xls, 'm' untuk .xlsm, dan 'b' untuk
.xlsb yang bisa tertulis dengan huruf kapital maupun huruf kecil.
14. Jadi, proses pemeriksaan tipe file berdasar karakter terakhir nama file
dilakukan pada kondisi penggunaan huruf kecil secara pasti memanfaatkan
fungsi VB bernama LCase.
15. Berdasar tipe file tersebut (s,m,b), maka bisa ditentukan kode format
filenya, yaitu .xls (s) berkode 56, .xlsm (m) berkode 52, dan .xlsb (b)
berkode 50.
16. Proses save as dengan script berdasar tipe ekstensi dilakukan dengan
methods SaveAs milik object workbook atau ThisWorkbook.
17. Selesai melakukan SaveAs, maka ijin bekerjanya events di-on-ken kembali.
18. Karena proses Save As bergantung pada nilai variabel SaveAsUI, maka
sebelum keluar blok pemeriksaan nilai variabel SaveAsUI dilakukan penegasan
kepada Excel VBA bahwa proses Save As yang diminta oleh user dibatalkan
karena sudah disediakan proses penggantinya.
19. Pembatalan tersebut adalah dengan memberi nilai variabel input
parameter event Before Save yang bernama Cancel dengan nilai TRUE.
20. Selesai.

Penyusunan script berdasar celotehan diatas :
1. perlu nama variabel penampung nama file yang di-input-ken oleh user.
Misal saja diberi nama sFileName yang bertipe string.
     dim sFileName as string

2. Proses cek pertama adalah terhadap variabel bernama SaveAsUI (yang sudah
disediakan oleh event BeforeSave -> lihat bagian deklarasi prosedur sub
milik events ini). Jadi akan ada blok kondisi jika SaveAsUI bernilai TRUE.
Bunyi bloknya begini :
     IF SaveAsUI then



     Endif

3. mulai bekerja didalam blok kondisi terhadap SaveAsUI

4. kerja 1 : memeriksa versi Excel yang digunakan oleh User, memanfaatkan
properti Version milik object Application. Nilai version selalu ditulis :
         VER.0 dimana VER bisa berisi kurang dari 12  (xl2003 kebawah) atau
lebih dari sama dengan 12 (xl2007 keatas)
    bunyi blok pemeriksaan versi berbunyi :
          IF CLng( application.version ) < 12 Then      'kalo versinya
sebelum xl2007 (clng untuk konversi menjadi numerik bilangan bulat)


          else    'kalo versinya xl2007 keatas


          endif

   5. kerja 1.1 : mengisi dalam blok IF Clng() bagian bernilai TRUE
(sebelum ELSE), yaitu mengaktifkan dialog window Save As untuk mendapatkan
nama file yang diinginkan user, dengan opsi tipe ekstensi file hanya .xls
saja (untuk versi sebelum xl2007) dengan bunyi : (ingat, nama file disimpan
dalam sFileName)
        sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel 97-2003(*.xls),*.xls" _
                                     )

   6. kerja 1.2 : mengisi dalam blok IF Clng() bagian bernilai FALSE
(setelah ELSE), yaitu mengaktifkan dialog window Save As untuk mendapatkan
nama file yang diinginkan user, dengan opsi tipe ekstensi file yang bisa
menyimpan script VBA untuk versi xl2007 keatas, yaitu .xls,.xlsm,.xlsb
dengan bunyi : (ingat, nama file disimpan dalam sFileName)
        sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel Macro
Enabled(*.xlsm),*.xlsm,Excel Binary(*.xlsb),*.xlsb,Excel
97-2003(*.xls),*.xls" _
                                        ,*1*
                                     )

   7. jadi, didapatkan bunyi blok IF kerja 1 secara lengkap :
          IF CLng( application.version ) < 12 Then      'kalo versinya
sebelum xl2007 (clng untuk konversi menjadi numerik bilangan bulat)
               sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel 97-2003(*.xls),*.xls" _
                                     )
          else    'kalo versinya xl2007 keatas
              sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel Macro
Enabled(*.xlsm),*.xlsm,Excel Binary(*.xlsb),*.xlsb,Excel
97-2003(*.xls),*.xls" _
                                        ,*1*
                                     )
          endif

8. kerja 2 : selesai menampilkan dialog window Save As dan user juga sudah
melakukan sesuatu, maka perlu cek apa yang dilakukan User. Cek terhadap isi
variabel sFileName. Proses Save As dengan script bekerja ketika nilai dalam
sFileName bukan teks 'False'. Bunyi blok pemeriksaannya adalah :
       IF sFileName <> "False" then



       Endif

   9. kerja 2.1 : meng-off-ken ijin kerja events
           application.enableevents=false

  10. kerja 2.2 : memeriksa tipe file pilihan user (berdasar karakter
terakhir nama file) -> ada 3 kondisi, yaitu 's','m','b'
            select case LCase$(  Right$( sfilename , 1 ) )
            case "s"     'tipe xls, format file berkode 56

            case "m"    'tipe xlsm, format file berkode 52

           case "b"       'tipe xlsb, format file berkode 50

           end select      'tanpa kondisi lainnya, karena ndak perlu

       11. kerja 2.2.1 : save as dengan script untuk case "s"
                  thisworkbook.saveas sfilename, 56

        12. kerrja 2.2.2 : save as dengan script untuk case "m"
                  thisworkbook.saveas sfilename, 52

        13. kerrja 2.2.3 : save as dengan script untuk case "b"
                  thisworkbook.saveas sfilename, 50

   14. blok kondisi format file (berdasar karakter terakhir nama file) akan
menjadi :
            select case LCase$(  Right$( sfilename , 1 ) )
            case "s"     'tipe xls, format file berkode 56
                  thisworkbook.saveas sfilename, 56

            case "m"    'tipe xlsm, format file berkode 52
                  thisworkbook.saveas sfilename, 52

           case "b"       'tipe xlsb, format file berkode 50
                  thisworkbook.saveas sfilename, 50

           end select      'tanpa kondisi lainnya, karena ndak perlu

    15. kerja 2.3 : mengaktifkan (meng-on-ken) ijin kerja events oleh Excel
VBA
            application.enableevents=true

    16. blok kondisi berdasar nama file bukan False (user tidak menekan
Cancel tapi menulis nama file dan menekan Save) akan menjadi :
          IF sFileName <> "False" then

              application.enableevents=false

              select case LCase$(  Right$( sfilename , 1 ) )
              case "s"     'tipe xls, format file berkode 56
                   thisworkbook.saveas sfilename, 56

              case "m"    'tipe xlsm, format file berkode 52
                   thisworkbook.saveas sfilename, 52

              case "b"       'tipe xlsb, format file berkode 50
                   thisworkbook.saveas sfilename, 50

              end select      'tanpa kondisi lainnya, karena ndak perlu

               application.enableevents=true

          Endif

17. kerja 3 : menegaskan kepada Excel VBA untuk membatalkan aksi Save As
oleh user karena proses save as sudah digantikan oleh kegiatan kerja 1 dan
kerja 2 dengan menetapkan nilai variabel Cancel adalah TRUE
         Cancel=true

18. kerja dalam blok kondisi SaveAsUI sudah selesai, dan bentuknya adalah :
     IF SaveAsUI then
          'kerja 1
          IF CLng( application.version ) < 12 Then      'kalo versinya
sebelum xl2007 (clng untuk konversi menjadi numerik bilangan bulat)
               sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel 97-2003(*.xls),*.xls" _
                                     )
          else    'kalo versinya xl2007 keatas
              sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel Macro
Enabled(*.xlsm),*.xlsm,Excel Binary(*.xlsb),*.xlsb,Excel
97-2003(*.xls),*.xls" _
                                        ,*1*
                                     )
          endif

          'kerja 2
          IF sFileName <> "False" then

              application.enableevents=false

              select case LCase$(  Right$( sfilename , 1 ) )
              case "s"     'tipe xls, format file berkode 56
                   thisworkbook.saveas sfilename, 56

              case "m"    'tipe xlsm, format file berkode 52
                   thisworkbook.saveas sfilename, 52

              case "b"       'tipe xlsb, format file berkode 50
                   thisworkbook.saveas sfilename, 50

              end select      'tanpa kondisi lainnya, karena ndak perlu

               application.enableevents=true

          Endif

          'kerja 3
          Cancel=true

     Endif

19. jadi, isi events before save akan menjadi :
     dim sFileName as string
     IF SaveAsUI then
          'kerja 1
          IF CLng( application.version ) < 12 Then      'kalo versinya
sebelum xl2007 (clng untuk konversi menjadi numerik bilangan bulat)
               sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel 97-2003(*.xls),*.xls" _
                                     )
          else    'kalo versinya xl2007 keatas
              sFileName = application.getsaveasfilename( _
                                                    thisworkbook.name _
                                           , "Excel Macro
Enabled(*.xlsm),*.xlsm,Excel Binary(*.xlsb),*.xlsb,Excel
97-2003(*.xls),*.xls" _
                                        ,*1*
                                     )
          endif

          'kerja 2
          IF sFileName <> "False" then

              application.enableevents=false

              select case LCase$(  Right$( sfilename , 1 ) )
              case "s"     'tipe xls, format file berkode 56
                   thisworkbook.saveas sfilename, 56

              case "m"    'tipe xlsm, format file berkode 52
                   thisworkbook.saveas sfilename, 52

              case "b"       'tipe xlsb, format file berkode 50
                   thisworkbook.saveas sfilename, 50

              end select      'tanpa kondisi lainnya, karena ndak perlu

               application.enableevents=true

          Endif

          'kerja 3
          Cancel=true

     Endif

20. selesai (mestinya disini ada end sub, tetapi, karena ndak ada baris
deklarasi prosedur sub yang ditulis, maka baris end sub juga tidak boleh
ada).


Selamat mencoba,

Wassalam,
Kid.





2013/12/14 Lazuardi Biru <[email protected]>

>
>
> kalo boleh scriptnya di share mr.kid dan apa yang harus saya lakukan
> dengan script tersebut kasih petunjuk sekalian...
>
> Suwun
> :-D
>
>
> salam
>
>
>   LB
>
>
>   Pada Sabtu, 14 Desember 2013 18:16, Mr. Kid <[email protected]>
> menulis:
>
>  Hai LB,
>
> Terus terang saya ndak tahu cara menghilangkan item tipe file tersebut
> dari menu save as.
> Biasanya, dengan VBA bisa dipaksa agar user menyimpan ke tipe file
> tertentu walaupun di menu save as si user memilih tipe apa saja.
> Pemaksaan tersebut diletakkan di events workbook before save. Disana
> diberi script untuk melakukan save as ke file type tertentu saja.
>
> Wassalam,
> Kid.
>
>
>
>
> 2013/12/14 Lazuardi Biru <[email protected]>
>
>
>  salam be excel
>
> dear master bagaimana membuat sebuah workbook ketika mau di save As yang
> muncul hanya pilihan  Excel Macro-Enebled Workbook ( yang kompetible dengan
> macro saya menggunakan ofice 2007
> tapi kemungkinan yang memakai workbook tsb bisa ofice 2003,2007,2010
>
> terimakasih.
>
>
> Salam
>
>
>  LB
>
>
>
>
>    
>

Kirim email ke