|
IESetDataにエクセルA1からB5の範囲指定したセルの文字列を設定したいのですが、うまくいきません。 下記のコードでやるとXLGETDATA(Excel, "A1:C3")で配列いれていると理解はしているのですが、IESetData(IE,C3[1,2]でやるとA2のセルの文字列しか入力されません。教えて頂けないでしょうか?
|
No.2735 2016/08/09(Tue) 20:55:39
|
☆ Re: IESetDataにエクセルのデータのA1からB5の範囲指定した分を入れる方法 / シスイ |
|
|
PATH = "エクセルファイル.xlsx" Excel = XLOPEN(PATH)
C3 = XLGETDATA(Excel, "A1:C3")
Public IE IE = CreateOLEObj("InternetExplorer.Application") IE.Visible = True setOleEvent() IE.Navigate("URL") BusyWait() IESetData(IE,True,"import[source]","form-field") // RADIO IESetData(IE,C3[1,2],"import[form_field]") // TEXTAREA IESetData(IE,True,"submit") // SUBMIT インポート BusyWait() // OleEvent(IE); IE.Quit() // OleEventクリア & IE終了
//------ DEF_DLL SendMessageA(Hwnd, Long, Long, Dword): bool: user32 CONST WM_ACTIVATE = $06 Public Pub_url, Pub_docc, Pub_BeforNav_cnt, Pub_DocComp_cnt, Pub_inp_flg Procedure BusyWait() Sleep(0.3) tm = GetTime() repeat ifb GetTime() - tm > 90 // TimeOut Pub_docc = ""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0 IE.Navigate(Pub_url) tm = GetTime() endif Sleep(0.2) ifb Pub_inp_flg Pub_inp_flg = False continue endif if IE.busy then continue if Pub_url = "" then break // No read if (Pos("*"+Pub_url+"*",Pub_docc)) or (Pos("*"+IE.LocationURL+"*",Pub_docc)) or (Pub_BeforNav_cnt<=Pub_DocComp_cnt) then else continue errflg = False if IE.document.title = "503 Unavailable" then errflg = True if IE.document.title = "Service Unavailable" then errflg = True if IE.document.title = "503 Service Temporarily Unavailable" then errflg = True ifb errflg Sleep(90) // 503: Wait&Retry tm = 0 continue endif Sleep(0.3) until ! Pub_inp_flg Pub_url=""; Pub_docc=""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0 SendMessageA(IE.Hwnd, WM_ACTIVATE, 0, 0) Fend Procedure setOleEvent() OleEvent(IE, "DWebBrowserEvents2", "BeforeNavigate2", "fucBeforNav") OleEvent(IE, "DWebBrowserEvents2", "DocumentComplete", "fucDocComp") OleEvent(IE, "DWebBrowserEvents2", "OnQuit", "fucQuit") Pub_url=""; Pub_docc=""; Pub_BeforNav_cnt=0; Pub_DocComp_cnt=0; Pub_inp_flg=False Fend Procedure fucBeforNav() ifb (Pos("javascript:",""+EVENT_PRM[1])=0) and ("about:blank"<>""+EVENT_PRM[1]) if Pub_url="" then Pub_url = ""+EVENT_PRM[1] Pub_BeforNav_cnt = Pub_BeforNav_cnt + 1 endif Pub_inp_flg = True Fend Procedure fucDocComp() ifb (Pos("javascript:",""+EVENT_PRM[1])=0) and ("about:blank"<>""+EVENT_PRM[1]) Pub_docc = Pub_docc + "*"+EVENT_PRM[1]+"*" Pub_DocComp_cnt = Pub_DocComp_cnt + 1 endif Pub_inp_flg = True Fend Procedure fucQuit() ExitExit Fend
|
No.2736 2016/08/09(Tue) 22:44:11
|
|
☆ Re: IESetDataにエクセルのデータのA1からB5の範囲指定した分を入れる方法 / stuncloud |
|
|
> C3[1,2] 二次元配列でこんな書き方ができるようになってたんですね、恥ずかしながら全然知りませんでした…
で、質問についてなんですがそもそも ・A1:B5の値を取得してそれを入力したい ・A1:C3の値を取得してそれを入力したい ・A1:C3を取得してその中のA1:B5の部分のみ入力したい (無理) ・A1:C5を取得してその中のA1:B5の部分のみ入力したい のいずれなのかが全くわからないです
ただまぁコードを見る限りA1:C3を取得してそれを入力したいようなのでそういう前提で進めていきます
先ずXLGETDATAで範囲指定すると二次元SafeArrayが返ってきます この配列の添字は各次元とも1からで、一次元目が取得したRangeの行になっています なので
> IESetData(IE,C3[1,2]でやるとA2のセルの文字列しか入力されません は当然です
> C3[1,2] だと1行目の二つ目の要素、つまりこの場合はA2になります
すべての値を入力したいのであれば配列の各要素から値を取り出さなくてはいけません で、取り出したものを適当に加工して入力することになります どういうふうに入力したいかについては全く記述がないのでいくつかサンプルをあげておきます joinを使うと配列の値をまとめるのがとても楽です
// カンマ区切りで入力 range = xlgetdata(excel, "A1:C3") text = join(range, ", ") IESetData(IE,text,"import[form_field]")
-入力値--------------------------- A1, B1, C1, A2, B2, C2, A3, B3, C3 ---------------------------------- ※実際にはセルの値が入りますが説明のため座標を値として書いています
// カンマ区切りでさらに行ごとに改行する range = xlgetdata(excel, "A1:C3") dummy = SafeArray(1, length(range))
for i = 1 to length(range) dummy[i] = join(range[i], ", ") next text = join(dummy, "<#CR>") IESetData(IE,text,"import[form_field]")
-入力値--- A1, B1, C1 A2, B2, C2 A3, B3, C3 ----------
|
No.2738 2016/08/10(Wed) 10:32:57
|
|
☆ Re: IESetDataにエクセルのデータのA1からB5の範囲指定した分を入れる方法 / シスイ |
|
|
stuncloud様、私のしたい事を完璧に答えて頂きありがとうございます。配列を使いこなせればかなりできる事の可能性が拡がりそうです。ありがとうございました。
|
No.2744 2016/08/11(Thu) 22:30:54
|
|