[belajar-excel] Menangani ReadyState di Microsoft Internet Control

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

[belajar-excel] Menangani ReadyState di Microsoft Internet Control

zainul_ulum[at]yahoo[dot]com
Rekan Be-Excel,saya membuat coding sederhana di vba-excel untuk otomasi pengisian form di internet explorer dengan menggunakan object library/reference: microsoft interner control.
Salah satu kendalanya adalah untuk memastikan bahwa object/ internet element dalam form di internet explorer adalah siap (ready) untuk diisi dari data yang saya ambil dari spead sheet excel.
Berdasarkan online help yang saya baca, untuk mengecek bahwa object sudah terunduh sempurna adalah dengan  menggunakan nilai property readystate. Jika nilai readystate bernilai = 4 , maka object di internet explorer sudah ter-loaded dan siap untuk diisi sedangkan untuk menunggu readystate=4 dilakukan looping sampai didapat nilai property=4 (ready). 
Akan tetapi dalam implementasinya, terutama jika internet connectionnya jelek, saat menggunakan looping (do....loop atau while....wend) ternyata object belum siap atau belum ready. Untuk memaksa object menjadi ready, saya menambahkan tambahan waktu tunggu / waktu looping Application.Wait dengan tambahan nilai tunggu 1 detik ( sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")) , sampai object benar-benar siap.
Kelemahan dari penambahan application.wait tersebut adalah proses pengisian form akan lama karena tiap loop ditambahkan waktu. tunggu.
di bawah, contoh code yang telah saya buat dengan tambahan proses delay (application.wat). Mohon bantuan atau masukan dari teman-teman yang pengalaman di "web scrapping"
Wassalam,-zainul
'==========================================================================Private Function SetAttributeWithDelay(objBrowser As InternetExplorer, ByVal sDelay As String, _    ByVal sElemenID As String, ByVal sAttrKey As String, ByVal vValue As Variant) As Boolean        Dim oHTMLDoc As HTMLDocument    Dim oHTML_Element As Object    Dim i As Integer    Dim bol As Boolean    SetAttributeWithDelay = True    i = -1    Do        i = i + 1        sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")        Do ' Wait till the Browser is loaded            Application.Wait (Now + TimeValue(sDelay)) '--->NOTE: dicoba pakai ini berhasil tetapi proses lama        Loop Until objBrowser.readyState = 4 'READYSTATE_COMPLETE                'While objBrowser..readyState <> 4 Or objBrowser.Busy: DoEvents: Wend--->note: dicoba pakai ini tidak berhasil            Set oHTMLDoc = objBrowser.document            On Error Resume Next            Set oHTML_Element = oHTMLDoc.getElementById(sElemenID)            If Err.Number Then                Err.Clear                'Application.Wait (Now + TimeValue(sDelay))'---> note:dicoba pakai ini tidak berhasil                'oHTML_Element = oHTMLDoc.getElementById(sElemenID)            End If            If i = 10 Then                SetAttributeWithDelay = False                Exit Function            End If    Loop Until Not oHTML_Element Is Nothing    Call oHTML_Element.setAttribute(sAttrKey, vValue)End Function
Kid
Reply | Threaded
Open this post in threaded view
|

Re: [belajar-excel] Menangani ReadyState di Microsoft Internet Control

Kid
Administrator
hmmm...

kalau begini bisa gak ?
(dicoba dengan sebuah prosedur sederhana ya, apa saja nama prosedurnya)

dim oBrowser as object
set obrowser=createobject("Internetexplorer.Application")
with obrowser
      .visible=true
      .navigate "alamat webpage"
      do while .readystate<>4 or .busy
             'proses cek timeout bisa dilakukan disini
      loop
      msgbox "Browser sudah siap.",vbinformation
end with

Contoh kalau mau pakai timeout, lalu batalkan (tutup browser-nya sekalian)
dim oBrowser as object   ,dblTimer as double, dblTimeOut as double
dbltimeout=1    'misal timeout 1 detik (buat nyoba saja)
set obrowser=createobject("Internetexplorer.Application")
with obrowser
      .visible=true
      .navigate "alamat webpage"
      dbltimer=timer
      do while .readystate<>4 or .busy
             'proses cek timeout bisa dilakukan disini
             if timer-dbltimer>dbltimeout then
                   .quit
                   msgbox "Timeout",vbexclamation
                   exit sub
            endif
      loop
      msgbox "Browser sudah siap.",vbinformation
end with


Regards,
Kid





On Mon, Oct 8, 2018 at 11:59 AM Zainul Ulum [hidden email]
[belajar-excel] <[hidden email]> wrote:

>
>
> Rekan Be-Excel,
> saya membuat coding sederhana di vba-excel untuk otomasi pengisian form di
> internet explorer dengan menggunakan object library/reference: microsoft
> interner control.
>
> Salah satu kendalanya adalah untuk memastikan bahwa object/ internet
> element dalam form di internet explorer adalah siap (ready) untuk diisi
> dari data yang saya ambil dari spead sheet excel.
>
> Berdasarkan online help yang saya baca, untuk mengecek bahwa object sudah
> terunduh sempurna adalah dengan  menggunakan nilai property readystate.
> Jika nilai readystate bernilai = 4 , maka object di internet explorer sudah
> ter-loaded dan siap untuk diisi sedangkan untuk menunggu readystate=4
> dilakukan looping sampai didapat nilai property=4 (ready).
>
> Akan tetapi dalam implementasinya, terutama jika internet connectionnya
> jelek, saat menggunakan looping (do....loop atau while....wend) ternyata
> object belum siap atau belum ready. Untuk memaksa object menjadi ready,
> saya menambahkan tambahan waktu tunggu / waktu looping Application.Wait
> dengan tambahan nilai tunggu 1 detik ( sDelay = Format(TimeValue(sDelay)
> + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")) , sampai object
> benar-benar siap.
>
> Kelemahan dari penambahan application.wait tersebut adalah proses
> pengisian form akan lama karena tiap loop ditambahkan waktu. tunggu.
>
> di bawah, contoh code yang telah saya buat dengan tambahan proses delay
> (application.wat).
> Mohon bantuan atau masukan dari teman-teman yang pengalaman di "web
> scrapping"
>
> Wassalam,
> -zainul
>
> '==========================================================================
> Private Function SetAttributeWithDelay(objBrowser As InternetExplorer,
> ByVal sDelay As String, _
>     ByVal sElemenID As String, ByVal sAttrKey As String, ByVal vValue As
> Variant) As Boolean
>
>     Dim oHTMLDoc As HTMLDocument
>     Dim oHTML_Element As Object
>     Dim i As Integer
>     Dim bol As Boolean
>     SetAttributeWithDelay = True
>     i = -1
>     Do
>         i = i + 1
>         sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i,
> "00")), "hh:mm:ss")
>         Do ' Wait till the Browser is loaded
>             Application.Wait (Now + TimeValue(sDelay)) '--->NOTE: dicoba
> pakai ini berhasil tetapi proses lama
>         Loop Until objBrowser.readyState = 4 'READYSTATE_COMPLETE
>
>         'While objBrowser.readyState <> 4 Or objBrowser.Busy: DoEvents:
> Wend--->note: dicoba pakai ini tidak berhasil
>             Set oHTMLDoc = objBrowser.document
>             On Error Resume Next
>             Set oHTML_Element = oHTMLDoc.getElementById(sElemenID)
>             If Err.Number Then
>                 Err.Clear
>                 'Application.Wait (Now + TimeValue(sDelay))'--->
> note:dicoba pakai ini tidak berhasil
>                 'oHTML_Element = oHTMLDoc.getElementById(sElemenID)
>             End If
>             If i = 10 Then
>                 SetAttributeWithDelay = False
>                 Exit Function
>             End If
>     Loop Until Not oHTML_Element Is Nothing
>     Call oHTML_Element.setAttribute(sAttrKey, vValue)
> End Function
>
>
Reply | Threaded
Open this post in threaded view
|

Re: [belajar-excel] Menangani ReadyState di Microsoft Internet Control

zainul_ulum[at]yahoo[dot]com
Mas Kid,Terimakasih masukannya akan saya coba dan hasilnya akan share di milis.
tanya lagi:-- apakah memang ada beberapa element html di browser yang tidak dikenali oleh internet explorer? saya coba oHTML_Element = oHTMLDoc..getElementById(sElemenID), object ketemu, tetapi tidak bisa diset atau diganti atribute atau propertinya.
Thanks,-zainu

    On Sunday, 14 October 2018, 12:53:32 AM GMT+7, 'Mr. Kid' mr.nmkid@gmail..com [belajar-excel] <[hidden email]> wrote:  
 
    

hmmm...
kalau begini bisa gak ?
(dicoba dengan sebuah prosedur sederhana ya, apa saja nama prosedurnya)

dim oBrowser as objectset obrowser=createobject("Internetexplorer.Application")with obrowser      .visible=true      .navigate "alamat webpage"      do while .readystate<>4 or .busy             'proses cek timeout bisa dilakukan disini
      loop      msgbox "Browser sudah siap.",vbinformation
end with

Contoh kalau mau pakai timeout, lalu batalkan (tutup browser-nya sekalian)
dim oBrowser as object   ,dblTimer as double, dblTimeOut as double
dbltimeout=1    'misal timeout 1 detik (buat nyoba saja)
set obrowser=createobject("Internetexplorer.Application")with obrowser      .visible=true      .navigate "alamat webpage"      dbltimer=timer
      do while .readystate<>4 or .busy             'proses cek timeout bisa dilakukan disini             if timer-dbltimer>dbltimeout then                   .quit                   msgbox "Timeout",vbexclamation                   exit sub
            endif
      loop      msgbox "Browser sudah siap.",vbinformation
end with


Regards,Kid




On Mon, Oct 8, 2018 at 11:59 AM Zainul Ulum [hidden email] [belajar-excel] <[hidden email]> wrote:

    

Rekan Be-Excel,saya membuat coding sederhana di vba-excel untuk otomasi pengisian form di internet explorer dengan menggunakan object library/reference: microsoft interner control.
Salah satu kendalanya adalah untuk memastikan bahwa object/ internet element dalam form di internet explorer adalah siap (ready) untuk diisi dari data yang saya ambil dari spead sheet excel.
Berdasarkan online help yang saya baca, untuk mengecek bahwa object sudah terunduh sempurna adalah dengan  menggunakan nilai property readystate. Jika nilai readystate bernilai = 4 , maka object di internet explorer sudah ter-loaded dan siap untuk diisi sedangkan untuk menunggu readystate=4 dilakukan looping sampai didapat nilai property=4 (ready). 
Akan tetapi dalam implementasinya, terutama jika internet connectionnya jelek, saat menggunakan looping (do.....loop atau while....wend) ternyata object belum siap atau belum ready. Untuk memaksa object menjadi ready, saya menambahkan tambahan waktu tunggu / waktu looping Application.Wait dengan tambahan nilai tunggu 1 detik ( sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")) , sampai object benar-benar siap.
Kelemahan dari penambahan application.wait tersebut adalah proses pengisian form akan lama karena tiap loop ditambahkan waktu. tunggu.
di bawah, contoh code yang telah saya buat dengan tambahan proses delay (application.wat). Mohon bantuan atau masukan dari teman-teman yang pengalaman di "web scrapping"
Wassalam,-zainul
'==========================================================================Private Function SetAttributeWithDelay(objBrowser As InternetExplorer, ByVal sDelay As String, _    ByVal sElemenID As String, ByVal sAttrKey As String, ByVal vValue As Variant) As Boolean        Dim oHTMLDoc As HTMLDocument    Dim oHTML_Element As Object    Dim i As Integer    Dim bol As Boolean    SetAttributeWithDelay = True    i = -1    Do        i = i + 1        sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")        Do ' Wait till the Browser is loaded            Application.Wait (Now + TimeValue(sDelay)) '--->NOTE: dicoba pakai ini berhasil tetapi proses lama        Loop Until objBrowser.readyState = 4 'READYSTATE_COMPLETE                'While objBrowser..readyState <> 4 Or objBrowser.Busy: DoEvents: Wend--->note: dicoba pakai ini tidak berhasil            Set oHTMLDoc = objBrowser.document            On Error Resume Next            Set oHTML_Element = oHTMLDoc.getElementById(sElemenID)            If Err.Number Then                Err.Clear                'Application.Wait (Now + TimeValue(sDelay))'---> note:dicoba pakai ini tidak berhasil                'oHTML_Element = oHTMLDoc.getElementById(sElemenID)            End If            If i = 10 Then                SetAttributeWithDelay = False                Exit Function            End If    Loop Until Not oHTML_Element Is Nothing    Call oHTML_Element.setAttribute(sAttrKey, vValue)End Function  
  #yiv4949035968 #yiv4949035968 -- #yiv4949035968ygrp-mkp {border:1px solid #d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv4949035968 #yiv4949035968ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv4949035968 #yiv4949035968ygrp-mkp #yiv4949035968hd {color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 0;}#yiv4949035968 #yiv4949035968ygrp-mkp #yiv4949035968ads {margin-bottom:10px;}#yiv4949035968 #yiv4949035968ygrp-mkp .yiv4949035968ad {padding:0 0;}#yiv4949035968 #yiv4949035968ygrp-mkp .yiv4949035968ad p {margin:0;}#yiv4949035968 #yiv4949035968ygrp-mkp .yiv4949035968ad a {color:#0000ff;text-decoration:none;}#yiv4949035968 #yiv4949035968ygrp-sponsor #yiv4949035968ygrp-lc {font-family:Arial;}#yiv4949035968 #yiv4949035968ygrp-sponsor #yiv4949035968ygrp-lc #yiv4949035968hd {margin:10px 0px;font-weight:700;font-size:78%;line-height:122%;}#yiv4949035968 #yiv4949035968ygrp-sponsor #yiv4949035968ygrp-lc .yiv4949035968ad {margin-bottom:10px;padding:0 0;}#yiv4949035968 #yiv4949035968actions {font-family:Verdana;font-size:11px;padding:10px 0;}#yiv4949035968 #yiv4949035968activity {background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv4949035968 #yiv4949035968activity span {font-weight:700;}#yiv4949035968 #yiv4949035968activity span:first-child {text-transform:uppercase;}#yiv4949035968 #yiv4949035968activity span a {color:#5085b6;text-decoration:none;}#yiv4949035968 #yiv4949035968activity span span {color:#ff7900;}#yiv4949035968 #yiv4949035968activity span .yiv4949035968underline {text-decoration:underline;}#yiv4949035968 .yiv4949035968attach {clear:both;display:table;font-family:Arial;font-size:12px;padding:10px 0;width:400px;}#yiv4949035968 .yiv4949035968attach div a {text-decoration:none;}#yiv4949035968 .yiv4949035968attach img {border:none;padding-right:5px;}#yiv4949035968 .yiv4949035968attach label {display:block;margin-bottom:5px;}#yiv4949035968 .yiv4949035968attach label a {text-decoration:none;}#yiv4949035968 blockquote {margin:0 0 0 4px;}#yiv4949035968 .yiv4949035968bold {font-family:Arial;font-size:13px;font-weight:700;}#yiv4949035968 .yiv4949035968bold a {text-decoration:none;}#yiv4949035968 dd.yiv4949035968last p a {font-family:Verdana;font-weight:700;}#yiv4949035968 dd.yiv4949035968last p span {margin-right:10px;font-family:Verdana;font-weight:700;}#yiv4949035968 dd.yiv4949035968last p span.yiv4949035968yshortcuts {margin-right:0;}#yiv4949035968 div.yiv4949035968attach-table div div a {text-decoration:none;}#yiv4949035968 div.yiv4949035968attach-table {width:400px;}#yiv4949035968 div.yiv4949035968file-title a, #yiv4949035968 div.yiv4949035968file-title a:active, #yiv4949035968 div.yiv4949035968file-title a:hover, #yiv4949035968 div.yiv4949035968file-title a:visited {text-decoration:none;}#yiv4949035968 div.yiv4949035968photo-title a, #yiv4949035968 div.yiv4949035968photo-title a:active, #yiv4949035968 div.yiv4949035968photo-title a:hover, #yiv4949035968 div.yiv4949035968photo-title a:visited {text-decoration:none;}#yiv4949035968 div#yiv4949035968ygrp-mlmsg #yiv4949035968ygrp-msg p a span.yiv4949035968yshortcuts {font-family:Verdana;font-size:10px;font-weight:normal;}#yiv4949035968 .yiv4949035968green {color:#628c2a;}#yiv4949035968 .yiv4949035968MsoNormal {margin:0 0 0 0;}#yiv4949035968 o {font-size:0;}#yiv4949035968 #yiv4949035968photos div {float:left;width:72px;}#yiv4949035968 #yiv4949035968photos div div {border:1px solid #666666;min-height:62px;overflow:hidden;width:62px;}#yiv4949035968 #yiv4949035968photos div label {color:#666666;font-size:10px;overflow:hidden;text-align:center;white-space:nowrap;width:64px;}#yiv4949035968 #yiv4949035968reco-category {font-size:77%;}#yiv4949035968 #yiv4949035968reco-desc {font-size:77%;}#yiv4949035968 .yiv4949035968replbq {margin:4px;}#yiv4949035968 #yiv4949035968ygrp-actbar div a:first-child {margin-right:2px;padding-right:5px;}#yiv4949035968 #yiv4949035968ygrp-mlmsg {font-size:13px;font-family:Arial, helvetica, clean, sans-serif;}#yiv4949035968 #yiv4949035968ygrp-mlmsg table {font-size:inherit;font:100%;}#yiv4949035968 #yiv4949035968ygrp-mlmsg select, #yiv4949035968 input, #yiv4949035968 textarea {font:99% Arial, Helvetica, clean, sans-serif;}#yiv4949035968 #yiv4949035968ygrp-mlmsg pre, #yiv4949035968 code {font:115% monospace;}#yiv4949035968 #yiv4949035968ygrp-mlmsg * {line-height:1.22em;}#yiv4949035968 #yiv4949035968ygrp-mlmsg #yiv4949035968logo {padding-bottom:10px;}#yiv4949035968 #yiv4949035968ygrp-msg p a {font-family:Verdana;}#yiv4949035968 #yiv4949035968ygrp-msg p#yiv4949035968attach-count span {color:#1E66AE;font-weight:700;}#yiv4949035968 #yiv4949035968ygrp-reco #yiv4949035968reco-head {color:#ff7900;font-weight:700;}#yiv4949035968 #yiv4949035968ygrp-reco {margin-bottom:20px;padding:0px;}#yiv4949035968 #yiv4949035968ygrp-sponsor #yiv4949035968ov li a {font-size:130%;text-decoration:none;}#yiv4949035968 #yiv4949035968ygrp-sponsor #yiv4949035968ov li {font-size:77%;list-style-type:square;padding:6px 0;}#yiv4949035968 #yiv4949035968ygrp-sponsor #yiv4949035968ov ul {margin:0;padding:0 0 0 8px;}#yiv4949035968 #yiv4949035968ygrp-text {font-family:Georgia;}#yiv4949035968 #yiv4949035968ygrp-text p {margin:0 0 1em 0;}#yiv4949035968 #yiv4949035968ygrp-text tt {font-size:120%;}#yiv4949035968 #yiv4949035968ygrp-vital ul li:last-child {border-right:none !important;}#yiv4949035968  
Kid
Reply | Threaded
Open this post in threaded view
|

Re: [belajar-excel] Menangani ReadyState di Microsoft Internet Control

Kid
Administrator
mas Zainul,

Mungkin nama properti (attribut) nya yang berbeda.
Contohnya, object Label memiliki properti Caption (bersifat read/write)
tapi tidak memiliki properti Text atau Value (keduanya juga bersifat
read/write)
Sedangkan object TextBox memiliki properti Text atau Value tapi tidak
memiliki properti Caption (ketiganya bersifat read/write).
Object Range juga tidak memiliki properti Caption, tapi memiliki properti
Value (bersifat read/write) dan Text (bersifat read only).

Sifat read/write -> programmer bisa melakukan get (ambil nilai alias read)
dan set (tulis nilai alias write).
Sifat read only -> programmer hanya bisa ambil nilai (alias read) saja.
Term read/write tersebut di atas adalah untuk design dasar si object
(bawaan dari sononya)
Jadi berbeda hal dengan konteks sebuah textbox yang bisa di-input oleh
user, tapi juga bisa di-lock agar user tidak bisa mengubah nilai.
Maksudnya, jangan sampai dikiranya bahwa properti Text milik textbox bisa
bersifat read/write maupun read only. Properti Text milik Textbox itu sifat
bawaannya hanyalah Read/Write, walau diset bagi user tidak bisa mengubah
isinya.

Regards,
Kid









On Mon, Oct 15, 2018 at 5:27 AM Zainul Ulum [hidden email]
[belajar-excel] <[hidden email]> wrote:

>
>
> Mas Kid,
> Terimakasih masukannya akan saya coba dan hasilnya akan share di milis.
>
> tanya lagi:
> -- apakah memang ada beberapa element html di browser yang tidak dikenali
> oleh internet explorer? saya coba oHTML_Element =
> oHTMLDoc.getElementById(sElemenID), object ketemu, tetapi tidak bisa diset
> atau diganti atribute atau propertinya.
>
> Thanks,
> -zainu
>
>
> On Sunday, 14 October 2018, 12:53:32 AM GMT+7, 'Mr. Kid'
> [hidden email] [belajar-excel] <[hidden email]> wrote:
>
>
>
>
> hmmm...
>
> kalau begini bisa gak ?
> (dicoba dengan sebuah prosedur sederhana ya, apa saja nama prosedurnya)
>
> dim oBrowser as object
> set obrowser=createobject("Internetexplorer.Application")
> with obrowser
>       .visible=true
>       .navigate "alamat webpage"
>       do while .readystate<>4 or .busy
>              'proses cek timeout bisa dilakukan disini
>       loop
>       msgbox "Browser sudah siap.",vbinformation
> end with
>
> Contoh kalau mau pakai timeout, lalu batalkan (tutup browser-nya sekalian)
> dim oBrowser as object   ,dblTimer as double, dblTimeOut as double
> dbltimeout=1    'misal timeout 1 detik (buat nyoba saja)
> set obrowser=createobject("Internetexplorer.Application")
> with obrowser
>       .visible=true
>       .navigate "alamat webpage"
>       dbltimer=timer
>       do while .readystate<>4 or .busy
>              'proses cek timeout bisa dilakukan disini
>              if timer-dbltimer>dbltimeout then
>                    .quit
>                    msgbox "Timeout",vbexclamation
>                    exit sub
>             endif
>       loop
>       msgbox "Browser sudah siap.",vbinformation
> end with
>
>
> Regards,
> Kid
>
>
>
>
>
> On Mon, Oct 8, 2018 at 11:59 AM Zainul Ulum [hidden email]
> [belajar-excel] <[hidden email]> wrote:
>
>
>
> Rekan Be-Excel,
> saya membuat coding sederhana di vba-excel untuk otomasi pengisian form di
> internet explorer dengan menggunakan object library/reference: microsoft
> interner control.
>
> Salah satu kendalanya adalah untuk memastikan bahwa object/ internet
> element dalam form di internet explorer adalah siap (ready) untuk diisi
> dari data yang saya ambil dari spead sheet excel.
>
> Berdasarkan online help yang saya baca, untuk mengecek bahwa object sudah
> terunduh sempurna adalah dengan  menggunakan nilai property readystate.
> Jika nilai readystate bernilai = 4 , maka object di internet explorer sudah
> ter-loaded dan siap untuk diisi sedangkan untuk menunggu readystate=4
> dilakukan looping sampai didapat nilai property=4 (ready).
>
> Akan tetapi dalam implementasinya, terutama jika internet connectionnya
> jelek, saat menggunakan looping (do.....loop atau while....wend) ternyata
> object belum siap atau belum ready. Untuk memaksa object menjadi ready,
> saya menambahkan tambahan waktu tunggu / waktu looping Application.Wait
> dengan tambahan nilai tunggu 1 detik ( sDelay = Format(TimeValue(sDelay)
> + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")) , sampai object
> benar-benar siap.
>
> Kelemahan dari penambahan application.wait tersebut adalah proses
> pengisian form akan lama karena tiap loop ditambahkan waktu. tunggu.
>
> di bawah, contoh code yang telah saya buat dengan tambahan proses delay
> (application.wat).
> Mohon bantuan atau masukan dari teman-teman yang pengalaman di "web
> scrapping"
>
> Wassalam,
> -zainul
>
> '==========================================================================
> Private Function SetAttributeWithDelay(objBrowser As InternetExplorer,
> ByVal sDelay As String, _
>     ByVal sElemenID As String, ByVal sAttrKey As String, ByVal vValue As
> Variant) As Boolean
>
>     Dim oHTMLDoc As HTMLDocument
>     Dim oHTML_Element As Object
>     Dim i As Integer
>     Dim bol As Boolean
>     SetAttributeWithDelay = True
>     i = -1
>     Do
>         i = i + 1
>         sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i,
> "00")), "hh:mm:ss")
>         Do ' Wait till the Browser is loaded
>             Application.Wait (Now + TimeValue(sDelay)) '--->NOTE: dicoba
> pakai ini berhasil tetapi proses lama
>         Loop Until objBrowser.readyState = 4 'READYSTATE_COMPLETE
>
>         'While objBrowser.readyState <> 4 Or objBrowser.Busy: DoEvents:
> Wend--->note: dicoba pakai ini tidak berhasil
>             Set oHTMLDoc = objBrowser.document
>             On Error Resume Next
>             Set oHTML_Element = oHTMLDoc.getElementById(sElemenID)
>             If Err.Number Then
>                 Err.Clear
>                 'Application.Wait (Now + TimeValue(sDelay))'--->
> note:dicoba pakai ini tidak berhasil
>                 'oHTML_Element = oHTMLDoc.getElementById(sElemenID)
>             End If
>             If i = 10 Then
>                 SetAttributeWithDelay = False
>                 Exit Function
>             End If
>     Loop Until Not oHTML_Element Is Nothing
>     Call oHTML_Element.setAttribute(sAttrKey, vValue)
> End Function
>
>
>
Reply | Threaded
Open this post in threaded view
|

Re: [belajar-excel] Menangani ReadyState di Microsoft Internet Control

zainul_ulum[at]yahoo[dot]com
Mas Kid,OK deh....saya explore lebih lanjut.
Sekarang sempat terpikir merubah coding saya ke java atau phyton dengan menggunakan object librarinya "selenium".
Saya juga telah buat vba web scrapping di excel dengan reference object library ke  selenium basic tetapi belum bisa optimal. Dari beberapa forum yang saya baca, selenium bisa optimal jika menggunakan phyton atau java/javascript.
Karena saya masih suka macro/vba-excel niat migrasi tsb belum terlaksana..
#dikirim_pakai_mail.yahoo.com_tanpa_pulsa#
-zainul
    On Tuesday, 16 October 2018, 8:18:24 AM GMT+7, 'Mr. Kid' mr.nmkid@gmail..com [belajar-excel] <[hidden email]> wrote:  
 
    

mas Zainul,
Mungkin nama properti (attribut) nya yang berbeda.Contohnya, object Label memiliki properti Caption (bersifat read/write) tapi tidak memiliki properti Text atau Value (keduanya juga bersifat read/write)
Sedangkan object TextBox memiliki properti Text atau Value tapi tidak memiliki properti Caption (ketiganya bersifat read/write).
Object Range juga tidak memiliki properti Caption, tapi memiliki properti Value (bersifat read/write) dan Text (bersifat read only).

Sifat read/write -> programmer bisa melakukan get (ambil nilai alias read) dan set (tulis nilai alias write).Sifat read only -> programmer hanya bisa ambil nilai (alias read) saja.Term read/write tersebut di atas adalah untuk design dasar si object (bawaan dari sononya)
Jadi berbeda hal dengan konteks sebuah textbox yang bisa di-input oleh user, tapi juga bisa di-lock agar user tidak bisa mengubah nilai.
Maksudnya, jangan sampai dikiranya bahwa properti Text milik textbox bisa bersifat read/write maupun read only. Properti Text milik Textbox itu sifat bawaannya hanyalah Read/Write, walau diset bagi user tidak bisa mengubah isinya.

Regards,Kid








On Mon, Oct 15, 2018 at 5:27 AM Zainul Ulum [hidden email] [belajar-excel] <[hidden email]> wrote:

    

Mas Kid,Terimakasih masukannya akan saya coba dan hasilnya akan share di milis.
tanya lagi:-- apakah memang ada beberapa element html di browser yang tidak dikenali oleh internet explorer? saya coba oHTML_Element = oHTMLDoc..getElementById(sElemenID), object ketemu, tetapi tidak bisa diset atau diganti atribute atau propertinya.
Thanks,-zainu

    On Sunday, 14 October 2018, 12:53:32 AM GMT+7, 'Mr. Kid' mr.nmkid@gmail..com [belajar-excel] <[hidden email]> wrote:  
 
    

hmmm...
kalau begini bisa gak ?
(dicoba dengan sebuah prosedur sederhana ya, apa saja nama prosedurnya)

dim oBrowser as objectset obrowser=createobject("Internetexplorer.Application")with obrowser      .visible=true      .navigate "alamat webpage"      do while .readystate<>4 or .busy             'proses cek timeout bisa dilakukan disini
      loop      msgbox "Browser sudah siap.",vbinformation
end with

Contoh kalau mau pakai timeout, lalu batalkan (tutup browser-nya sekalian)
dim oBrowser as object   ,dblTimer as double, dblTimeOut as double
dbltimeout=1    'misal timeout 1 detik (buat nyoba saja)
set obrowser=createobject("Internetexplorer.Application")with obrowser      .visible=true      .navigate "alamat webpage"      dbltimer=timer
      do while .readystate<>4 or .busy             'proses cek timeout bisa dilakukan disini             if timer-dbltimer>dbltimeout then                   .quit                   msgbox "Timeout",vbexclamation                   exit sub
            endif
      loop      msgbox "Browser sudah siap.",vbinformation
end with


Regards,Kid




On Mon, Oct 8, 2018 at 11:59 AM Zainul Ulum [hidden email] [belajar-excel] <[hidden email]> wrote:

    

Rekan Be-Excel,saya membuat coding sederhana di vba-excel untuk otomasi pengisian form di internet explorer dengan menggunakan object library/reference: microsoft interner control.
Salah satu kendalanya adalah untuk memastikan bahwa object/ internet element dalam form di internet explorer adalah siap (ready) untuk diisi dari data yang saya ambil dari spead sheet excel.
Berdasarkan online help yang saya baca, untuk mengecek bahwa object sudah terunduh sempurna adalah dengan  menggunakan nilai property readystate. Jika nilai readystate bernilai = 4 , maka object di internet explorer sudah ter-loaded dan siap untuk diisi sedangkan untuk menunggu readystate=4 dilakukan looping sampai didapat nilai property=4 (ready). 
Akan tetapi dalam implementasinya, terutama jika internet connectionnya jelek, saat menggunakan looping (do.....loop atau while.....wend) ternyata object belum siap atau belum ready. Untuk memaksa object menjadi ready, saya menambahkan tambahan waktu tunggu / waktu looping Application.Wait dengan tambahan nilai tunggu 1 detik ( sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")) , sampai object benar-benar siap.
Kelemahan dari penambahan application.wait tersebut adalah proses pengisian form akan lama karena tiap loop ditambahkan waktu. tunggu.
di bawah, contoh code yang telah saya buat dengan tambahan proses delay (application.wat). Mohon bantuan atau masukan dari teman-teman yang pengalaman di "web scrapping"
Wassalam,-zainul
'==========================================================================Private Function SetAttributeWithDelay(objBrowser As InternetExplorer, ByVal sDelay As String, _    ByVal sElemenID As String, ByVal sAttrKey As String, ByVal vValue As Variant) As Boolean        Dim oHTMLDoc As HTMLDocument    Dim oHTML_Element As Object    Dim i As Integer    Dim bol As Boolean    SetAttributeWithDelay = True    i = -1    Do        i = i + 1        sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")        Do ' Wait till the Browser is loaded            Application.Wait (Now + TimeValue(sDelay)) '--->NOTE: dicoba pakai ini berhasil tetapi proses lama        Loop Until objBrowser.readyState = 4 'READYSTATE_COMPLETE                'While objBrowser..readyState <> 4 Or objBrowser.Busy: DoEvents: Wend--->note: dicoba pakai ini tidak berhasil            Set oHTMLDoc = objBrowser.document            On Error Resume Next            Set oHTML_Element = oHTMLDoc.getElementById(sElemenID)            If Err..Number Then                Err..Clear                'Application.Wait (Now + TimeValue(sDelay))'---> note:dicoba pakai ini tidak berhasil                'oHTML_Element = oHTMLDoc.getElementById(sElemenID)            End If            If i = 10 Then                SetAttributeWithDelay = False                Exit Function            End If    Loop Until Not oHTML_Element Is Nothing    Call oHTML_Element.setAttribute(sAttrKey, vValue)End Function  
   

   
  #yiv6863716026 #yiv6863716026 -- #yiv6863716026ygrp-mkp {border:1px solid #d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv6863716026 #yiv6863716026ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv6863716026 #yiv6863716026ygrp-mkp #yiv6863716026hd {color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 0;}#yiv6863716026 #yiv6863716026ygrp-mkp #yiv6863716026ads {margin-bottom:10px;}#yiv6863716026 #yiv6863716026ygrp-mkp .yiv6863716026ad {padding:0 0;}#yiv6863716026 #yiv6863716026ygrp-mkp .yiv6863716026ad p {margin:0;}#yiv6863716026 #yiv6863716026ygrp-mkp .yiv6863716026ad a {color:#0000ff;text-decoration:none;}#yiv6863716026 #yiv6863716026ygrp-sponsor #yiv6863716026ygrp-lc {font-family:Arial;}#yiv6863716026 #yiv6863716026ygrp-sponsor #yiv6863716026ygrp-lc #yiv6863716026hd {margin:10px 0px;font-weight:700;font-size:78%;line-height:122%;}#yiv6863716026 #yiv6863716026ygrp-sponsor #yiv6863716026ygrp-lc .yiv6863716026ad {margin-bottom:10px;padding:0 0;}#yiv6863716026 #yiv6863716026actions {font-family:Verdana;font-size:11px;padding:10px 0;}#yiv6863716026 #yiv6863716026activity {background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv6863716026 #yiv6863716026activity span {font-weight:700;}#yiv6863716026 #yiv6863716026activity span:first-child {text-transform:uppercase;}#yiv6863716026 #yiv6863716026activity span a {color:#5085b6;text-decoration:none;}#yiv6863716026 #yiv6863716026activity span span {color:#ff7900;}#yiv6863716026 #yiv6863716026activity span .yiv6863716026underline {text-decoration:underline;}#yiv6863716026 .yiv6863716026attach {clear:both;display:table;font-family:Arial;font-size:12px;padding:10px 0;width:400px;}#yiv6863716026 .yiv6863716026attach div a {text-decoration:none;}#yiv6863716026 .yiv6863716026attach img {border:none;padding-right:5px;}#yiv6863716026 .yiv6863716026attach label {display:block;margin-bottom:5px;}#yiv6863716026 .yiv6863716026attach label a {text-decoration:none;}#yiv6863716026 blockquote {margin:0 0 0 4px;}#yiv6863716026 .yiv6863716026bold {font-family:Arial;font-size:13px;font-weight:700;}#yiv6863716026 .yiv6863716026bold a {text-decoration:none;}#yiv6863716026 dd.yiv6863716026last p a {font-family:Verdana;font-weight:700;}#yiv6863716026 dd.yiv6863716026last p span {margin-right:10px;font-family:Verdana;font-weight:700;}#yiv6863716026 dd.yiv6863716026last p span.yiv6863716026yshortcuts {margin-right:0;}#yiv6863716026 div.yiv6863716026attach-table div div a {text-decoration:none;}#yiv6863716026 div.yiv6863716026attach-table {width:400px;}#yiv6863716026 div.yiv6863716026file-title a, #yiv6863716026 div.yiv6863716026file-title a:active, #yiv6863716026 div.yiv6863716026file-title a:hover, #yiv6863716026 div.yiv6863716026file-title a:visited {text-decoration:none;}#yiv6863716026 div.yiv6863716026photo-title a, #yiv6863716026 div.yiv6863716026photo-title a:active, #yiv6863716026 div.yiv6863716026photo-title a:hover, #yiv6863716026 div.yiv6863716026photo-title a:visited {text-decoration:none;}#yiv6863716026 div#yiv6863716026ygrp-mlmsg #yiv6863716026ygrp-msg p a span.yiv6863716026yshortcuts {font-family:Verdana;font-size:10px;font-weight:normal;}#yiv6863716026 .yiv6863716026green {color:#628c2a;}#yiv6863716026 .yiv6863716026MsoNormal {margin:0 0 0 0;}#yiv6863716026 o {font-size:0;}#yiv6863716026 #yiv6863716026photos div {float:left;width:72px;}#yiv6863716026 #yiv6863716026photos div div {border:1px solid #666666;min-height:62px;overflow:hidden;width:62px;}#yiv6863716026 #yiv6863716026photos div label {color:#666666;font-size:10px;overflow:hidden;text-align:center;white-space:nowrap;width:64px;}#yiv6863716026 #yiv6863716026reco-category {font-size:77%;}#yiv6863716026 #yiv6863716026reco-desc {font-size:77%;}#yiv6863716026 .yiv6863716026replbq {margin:4px;}#yiv6863716026 #yiv6863716026ygrp-actbar div a:first-child {margin-right:2px;padding-right:5px;}#yiv6863716026 #yiv6863716026ygrp-mlmsg {font-size:13px;font-family:Arial, helvetica, clean, sans-serif;}#yiv6863716026 #yiv6863716026ygrp-mlmsg table {font-size:inherit;font:100%;}#yiv6863716026 #yiv6863716026ygrp-mlmsg select, #yiv6863716026 input, #yiv6863716026 textarea {font:99% Arial, Helvetica, clean, sans-serif;}#yiv6863716026 #yiv6863716026ygrp-mlmsg pre, #yiv6863716026 code {font:115% monospace;}#yiv6863716026 #yiv6863716026ygrp-mlmsg * {line-height:1.22em;}#yiv6863716026 #yiv6863716026ygrp-mlmsg #yiv6863716026logo {padding-bottom:10px;}#yiv6863716026 #yiv6863716026ygrp-msg p a {font-family:Verdana;}#yiv6863716026 #yiv6863716026ygrp-msg p#yiv6863716026attach-count span {color:#1E66AE;font-weight:700;}#yiv6863716026 #yiv6863716026ygrp-reco #yiv6863716026reco-head {color:#ff7900;font-weight:700;}#yiv6863716026 #yiv6863716026ygrp-reco {margin-bottom:20px;padding:0px;}#yiv6863716026 #yiv6863716026ygrp-sponsor #yiv6863716026ov li a {font-size:130%;text-decoration:none;}#yiv6863716026 #yiv6863716026ygrp-sponsor #yiv6863716026ov li {font-size:77%;list-style-type:square;padding:6px 0;}#yiv6863716026 #yiv6863716026ygrp-sponsor #yiv6863716026ov ul {margin:0;padding:0 0 0 8px;}#yiv6863716026 #yiv6863716026ygrp-text {font-family:Georgia;}#yiv6863716026 #yiv6863716026ygrp-text p {margin:0 0 1em 0;}#yiv6863716026 #yiv6863716026ygrp-text tt {font-size:120%;}#yiv6863716026 #yiv6863716026ygrp-vital ul li:last-child {border-right:none !important;}#yiv6863716026  
Kid
Reply | Threaded
Open this post in threaded view
|

Re: [belajar-excel] Menangani ReadyState di Microsoft Internet Control

Kid
Administrator
Ya python filenya yg njalanin vba saja.
Run pakai shell command kan

Sent from my smart enough phone

> On Oct 17, 2018, at 13:20, Zainul Ulum [hidden email] [belajar-excel] <[hidden email]> wrote:
>
> Mas Kid,
> OK deh....saya explore lebih lanjut.
>
> Sekarang sempat terpikir merubah coding saya ke java atau phyton dengan menggunakan object librarinya "selenium".
>
> Saya juga telah buat vba web scrapping di excel dengan reference object library ke  selenium basic tetapi belum bisa optimal. Dari beberapa forum yang saya baca, selenium bisa optimal jika menggunakan phyton atau java/javascript.
>
> Karena saya masih suka macro/vba-excel niat migrasi tsb belum terlaksana...
>
> #dikirim_pakai_mail.yahoo.com_tanpa_pulsa#
>
> -zainul
>
> On Tuesday, 16 October 2018, 8:18:24 AM GMT+7, 'Mr. Kid' [hidden email] [belajar-excel] <[hidden email]> wrote:
>
>
>  
> mas Zainul,
>
> Mungkin nama properti (attribut) nya yang berbeda.
> Contohnya, object Label memiliki properti Caption (bersifat read/write) tapi tidak memiliki properti Text atau Value (keduanya juga bersifat read/write)
> Sedangkan object TextBox memiliki properti Text atau Value tapi tidak memiliki properti Caption (ketiganya bersifat read/write).
> Object Range juga tidak memiliki properti Caption, tapi memiliki properti Value (bersifat read/write) dan Text (bersifat read only).
>
> Sifat read/write -> programmer bisa melakukan get (ambil nilai alias read) dan set (tulis nilai alias write).
> Sifat read only -> programmer hanya bisa ambil nilai (alias read) saja.
> Term read/write tersebut di atas adalah untuk design dasar si object (bawaan dari sononya)
> Jadi berbeda hal dengan konteks sebuah textbox yang bisa di-input oleh user, tapi juga bisa di-lock agar user tidak bisa mengubah nilai.
> Maksudnya, jangan sampai dikiranya bahwa properti Text milik textbox bisa bersifat read/write maupun read only. Properti Text milik Textbox itu sifat bawaannya hanyalah Read/Write, walau diset bagi user tidak bisa mengubah isinya.
>
> Regards,
> Kid
>
>
>
>
>
>
>
>
>
> On Mon, Oct 15, 2018 at 5:27 AM Zainul Ulum [hidden email] [belajar-excel] <[hidden email]> wrote:
>  
> Mas Kid,
> Terimakasih masukannya akan saya coba dan hasilnya akan share di milis.
>
> tanya lagi:
> -- apakah memang ada beberapa element html di browser yang tidak dikenali oleh internet explorer? saya coba oHTML_Element = oHTMLDoc.getElementById(sElemenID), object ketemu, tetapi tidak bisa diset atau diganti atribute atau propertinya.
>
> Thanks,
> -zainu
>
>
> On Sunday, 14 October 2018, 12:53:32 AM GMT+7, 'Mr. Kid' [hidden email] [belajar-excel] <[hidden email]> wrote:
>
>
>  
> hmmm...
>
> kalau begini bisa gak ?
> (dicoba dengan sebuah prosedur sederhana ya, apa saja nama prosedurnya)
>
> dim oBrowser as object
> set obrowser=createobject("Internetexplorer.Application")
> with obrowser
>       .visible=true
>       .navigate "alamat webpage"
>       do while .readystate<>4 or .busy
>              'proses cek timeout bisa dilakukan disini
>       loop
>       msgbox "Browser sudah siap.",vbinformation
> end with
>
> Contoh kalau mau pakai timeout, lalu batalkan (tutup browser-nya sekalian)
> dim oBrowser as object   ,dblTimer as double, dblTimeOut as double
> dbltimeout=1    'misal timeout 1 detik (buat nyoba saja)
> set obrowser=createobject("Internetexplorer.Application")
> with obrowser
>       .visible=true
>       .navigate "alamat webpage"
>       dbltimer=timer
>       do while .readystate<>4 or .busy
>              'proses cek timeout bisa dilakukan disini
>              if timer-dbltimer>dbltimeout then
>                    .quit
>                    msgbox "Timeout",vbexclamation
>                    exit sub
>             endif
>       loop
>       msgbox "Browser sudah siap.",vbinformation
> end with
>
>
> Regards,
> Kid
>
>
>
>
>
> On Mon, Oct 8, 2018 at 11:59 AM Zainul Ulum [hidden email] [belajar-excel] <[hidden email]> wrote:
>  
> Rekan Be-Excel,
> saya membuat coding sederhana di vba-excel untuk otomasi pengisian form di internet explorer dengan menggunakan object library/reference: microsoft interner control.
>
> Salah satu kendalanya adalah untuk memastikan bahwa object/ internet element dalam form di internet explorer adalah siap (ready) untuk diisi dari data yang saya ambil dari spead sheet excel.
>
> Berdasarkan online help yang saya baca, untuk mengecek bahwa object sudah terunduh sempurna adalah dengan  menggunakan nilai property readystate. Jika nilai readystate bernilai = 4 , maka object di internet explorer sudah ter-loaded dan siap untuk diisi sedangkan untuk menunggu readystate=4 dilakukan looping sampai didapat nilai property=4 (ready).
>
> Akan tetapi dalam implementasinya, terutama jika internet connectionnya jelek, saat menggunakan looping (do.....loop atau while.....wend) ternyata object belum siap atau belum ready. Untuk memaksa object menjadi ready, saya menambahkan tambahan waktu tunggu / waktu looping Application.Wait dengan tambahan nilai tunggu 1 detik ( sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")) , sampai object benar-benar siap.
>
> Kelemahan dari penambahan application.wait tersebut adalah proses pengisian form akan lama karena tiap loop ditambahkan waktu. tunggu.
>
> di bawah, contoh code yang telah saya buat dengan tambahan proses delay (application.wat).
> Mohon bantuan atau masukan dari teman-teman yang pengalaman di "web scrapping"
>
> Wassalam,
> -zainul
>
> '==========================================================================
> Private Function SetAttributeWithDelay(objBrowser As InternetExplorer, ByVal sDelay As String, _
>     ByVal sElemenID As String, ByVal sAttrKey As String, ByVal vValue As Variant) As Boolean
>    
>     Dim oHTMLDoc As HTMLDocument
>     Dim oHTML_Element As Object
>     Dim i As Integer
>     Dim bol As Boolean
>     SetAttributeWithDelay = True
>     i = -1
>     Do
>         i = i + 1
>         sDelay = Format(TimeValue(sDelay) + TimeValue("00:00:" & Format(i, "00")), "hh:mm:ss")
>         Do ' Wait till the Browser is loaded
>             Application.Wait (Now + TimeValue(sDelay)) '--->NOTE: dicoba pakai ini berhasil tetapi proses lama
>         Loop Until objBrowser.readyState = 4 'READYSTATE_COMPLETE
>        
>         'While objBrowser.readyState <> 4 Or objBrowser.Busy: DoEvents: Wend--->note: dicoba pakai ini tidak berhasil
>             Set oHTMLDoc = objBrowser.document
>             On Error Resume Next
>             Set oHTML_Element = oHTMLDoc.getElementById(sElemenID)
>             If Err..Number Then
>                 Err.Clear
>                 'Application.Wait (Now + TimeValue(sDelay))'---> note:dicoba pakai ini tidak berhasil
>                 'oHTML_Element = oHTMLDoc.getElementById(sElemenID)
>             End If
>             If i = 10 Then
>                 SetAttributeWithDelay = False
>                 Exit Function
>             End If
>     Loop Until Not oHTML_Element Is Nothing
>     Call oHTML_Element.setAttribute(sAttrKey, vValue)
> End Function
>
Reply | Threaded
Open this post in threaded view
|

[belajar-excel] Open hyperlink pdf tanpa warning message [1 Attachment]

Fajar Fatahillah
In reply to this post by zainul_ulum[at]yahoo[dot]com
Dear rekan2..Saya mau minta solusi dong..Jadi ada ribuan hyperlink ke server utk open pdf.. tp setiap di klik selalu muncul warning gitu.. dan baru bisa di open kalo di formula bar nya di enter.. ada solusi cepet gak ya?




20181017_181010.jpg (9M) Download Attachment