Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2016)
IEのボタンクリックについて
投稿日時: 20/10/11 20:41:49
投稿者: waju

初めまして。
  
ボタンのクリックの反応がないため色々ネットの情報で試したのですがうまくいかないためどうかご教授宜しくお願い致します。
  
やりたいことはPosレジのサイトから必要なデータをcsv出力をするという作業です。
  
いくつかボタンクリックの問題は自力で解決してきました。
  
今問題のところはボタンのID,Nameがない場合Classからやってみたり、aタグからやってみたり、それでも変わらないので
  
イベント発火が起きてないのかと思い、JSのonclickの処理をしてみたのですがボタンクリック後に次に進まないんです。
  
JSのボタン付近のコードは
 


<div class="dt-buttons">

<a tabindex="0" class="dt-button buttons-excel buttons-html5" aria-controls="data_grid" href="#">

<span>Excel</span></a>

<a tabindex="0" class="dt-button buttons-csv buttons-html5" aria-controls="data_grid" href="#">

<span>CSV</span></a>
<a tabindex="0" class="dt-button buttons-collection buttons-colvis" aria-controls="data_grid" href="#">

<span>項目選択</span></a></div>


 
です。
  
現在進めているVBAのコードは
  

Sub PosLab_Login()
    
    Dim ie As InternetExplorer
    
    Set ie = New InternetExplorer
    
    ie.Visible = True
    ' PosLabを表示
    ie.Navigate "https://poslab01.postas.asia"
    
    Call WaitIE(ie)
    
    Dim htmlDoc As HTMLDocument 'HTMLドキュメントを準備
    Set htmlDoc = ie.document 'ieで読み込まれているHTMLドキュメントをセット
    
    htmlDoc.getElementById("company_code").Value = ""  '企業コード入力
    htmlDoc.getElementById("user_id").Value = ""  '担当者コード入力
    htmlDoc.getElementById("password").Value = ""  'パスワード入力
    htmlDoc.getElementById("login").Click 'ログイン
    
    Call WaitIE(ie)
    
    ie.Navigate "https://poslab01.postas.asia/tenpo_bunseki/c_tenpo_bunseki/tenpo_bunseki_for_base_html"
    
    Call WaitIE(ie)
      
    Dim evt As Object
    
    Set evt = htmlDoc.createEvent("HTMLEvents")
    
    evt.initEvent "change", True, False
    
    With htmlDoc.getElementById("search_company_code_1_1")
       
       .Value = "d00176"
       
       .dispatchEvent evt
       
    End With
    
    Dim Obj As HTMLSelectElement
    
    Set Obj = htmlDoc.getElementById("search_year_1_1")
    
    Obj.Value = Worksheets("Sheet1").Range("B2")
    
    Set Obj = htmlDoc.getElementById("search_month_1_1")
    
    Obj.Value = Worksheets("Sheet1").Range("D2")
    
    htmlDoc.getElementById("search_regiclose").Click '検索
    
    Call WaitIE(ie)
        
    Dim ClassButton As Object
    
    For Each ClassButton In htmlDoc.getElementsByTagName("a")
    
       If ClassButton.innerText = "項目選択" Then
       
          ClassButton.Click
          
          Exit For
       
       End If
    
    Next
        
End Sub
    
Sub WaitIE(ie As InternetExplorer)
    
    Do While ie.Busy = True Or ie.readyState < 4
       DoEvents
    Loop
    
End Sub


 
です。Dim ClassButton As Objectからの部分でつまづいております。
  
JS,VBA共に知識が浅すぎるのでどうぞよろしくお願い致します。

回答
投稿日時: 20/10/12 09:43:09
投稿者: 月

提示されたHTMLしか見てませんが、押したいのがCSVと書かれたボタン?なら
 

If ClassButton.innerText = "項目選択" Then

"CSV" ではないでしょうか。

回答
投稿日時: 20/10/12 09:48:00
投稿者: 月

Trim も必要かもしれません。"CSV" でヒットしなかったら、
 

Debug.Print ClassButton.innerText
Debug.Print Trim(ClassButton.innerText)

などとして確認してみてください。
※最近VBA書いてないので間違いがあったらすみません。

投稿日時: 20/10/12 10:50:07
投稿者: waju

月さんありがとうございます!
 
csv出力の前に項目選択で表の表示項目の調整がしたくて
 
先に項目選択のボタンを押して
 
イベントで出てくるボタン群で調整して最後にcsvボタンで出力って流れなんです。
 
昨日も色々調べていたんですが、
 
jqueryのイベント処理があるんですかね?
 
HTMLのコードのEventのところ押したら
 
jqueryが出てくるのですが
 
そのコードも見て頂けますでしょうか?

投稿日時: 20/10/12 10:56:40
投稿者: waju

以下がそのコードです。
 


.on( 'click.dtb', function (e) {
				e.preventDefault();

				if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
					action( e, dt, button, config );
				}

				button.blur();
			} )


 
どうぞよろしくお願い致します。

回答
投稿日時: 20/10/12 13:59:16
投稿者: 月

そのコードだけではちょっとわからないですね。
単純に待ち時間を入れれば動くようでしたら、SleepかApplication.Waitで待ち時間を入れてみてはどうでしょうか。
 
【VBA入門】Sleep関数(API)やWaitメソッドで処理を止める方法
https://www.sejuku.net/blog/37388
 

Do While ie.Busy = True Or ie.readyState < 4

IEの自動化をあまりしたことがないのでわからないのですが、JavaScriptで非同期の処理を行った時はBusyとかreadyStateは変化するんですかね。もししないなら別の方法で待つ必要があると思います。

回答
投稿日時: 20/10/13 13:09:19
投稿者: しろびあ

的外れだったらすみません。
 
JSで動いていると仮定して,
どこかに対応した
 
onClick="ほげほげ('てすてす'); return false
 
という感じな所がないでしょうか?
 
もしあれば
 
ie.navigate "JavaScript:ほげほげ('てすてす')"
 
こんな感じで動かないですかね?

投稿日時: 20/10/13 14:34:30
投稿者: waju

月さん、シロビアさんありがとうございます。
 
HTMLコードの表示の仕方や読み方も四苦八苦しており、
 
ページの要素チェックでコード表示させた後、
 
DomExplorerにコードが書かれているのですがそこに書いてあるコードを参照するのでしょうか?
 
それともデバッガーと書いてあるタブのコードから参照するのでしょうか?
 
デバッガーと書いてある方のコードは
 


buttons: [{
						extend: 'excelHtml5',
						text: 'Excel',
						exportOptions: {
							modifier: {
								page: 'current'
							},
							columns: ':visible'
						},
						customizeData: function( obj ) {
                            var dataRow = $("#data_grid tbody tr");
                            var minusIdx = 0;
                            for (var k = 0; k < dataRow.length; k++) {
                                if($(dataRow[k]).css('display') == 'none'){                                    var rowIndex = dataRow[k].rowIndex - 1 - minusIdx;                                    obj.body.splice(rowIndex,1);
                                    minusIdx++;
                                }
                            }
						},
						filename: $("#search_company_code_1_1").val()
						+ '_' + $("#search_store_code_1_1").val()
						 + '_' + $("#search_year_1_1").val() + '_' + $("#search_month_1_1").val(),
						sheetName: $("#search_company_code_1_1").val()
						+ '_' + $("#search_store_code_1_1").val()
						 + '_' + $("#search_year_1_1").val() + '_' + $("#search_month_1_1").val(),
						customize: function( xlsx ) {
							var createCellPos = function( n ){
								var ordA = 'A'.charCodeAt(0);
								var ordZ = 'Z'.charCodeAt(0);
								var len = ordZ - ordA + 1;
								var s = "";
							
								while( n >= 0 ) {
									s = String.fromCharCode(n % len + ordA) + s;
									n = Math.floor(n / len) - 1;
								}
							
								return s;
							};
							var sheet = xlsx.xl.worksheets['sheet1.xml'];
								//width autofit
							var coltags = sheet.getElementsByTagName("col");
							for(var i=0; i<coltags.length; i++){
								coltags[i].setAttribute('bestFit', true);
								if (i == 0) {
									// Tval[i].setAttribute('width', 20);
								}
							}
							
							var col_width_map = {
								'営業日': 15,
                                'レジ番号': 9.71,
								'組数(組)': 9.71,
								'客数': 5.86,
								'男性': 5.86,
								'女性': 5.86,
								'客単価': 8.29,
								'総売上点数(点)': 18,
																'技術売上(税抜)': 18,
                                '消費税(技術)': 15.14,
                                '技術売上': 10.86,
								'店販売上(税抜)': 18,
								'店販売上': 10.86,
								'店販売上': 10.86,
								'店販売上': 10.86,
								'消費税(店販)': 15.14,
								'消費税(店販)': 15.14,
								'消費税(店販)': 15.14,
																'売上': 9.14,
																'消費税': 8.29,
																'レジオープン日時': 20.14,
								'レジオープン担当者': 22.57,
								'レジクローズ日時': 20.14,
								'レジクローズ担当者': 22.57,
								'値割引件数': 13.57,
								'値割引': 8.29,
								'純売上': 9.14,
								'現金件数': 10.86,
								'現金': 9.14,
								'クレジット件数': 19,
								'クレジット': 13.57,
								'ポイント件数': 16.29,
								'ポイント': 10.86,
								'電子マネー件数': 19,
								'電子マネー': 13.57,
								'商品券(釣無し)件数': 23.43,
								'商品券(釣無し)': 18,
								'商品券(釣有り)件数': 23.43,
								'商品券(釣有り)': 18,
								'掛売件数': 10.86,
								'掛売': 7.57,
								'小口現金': 10.86,
								'取消(赤伝票)件数': 20.71,
								'取消(赤伝票)': 15.14,
								'訂正(黒伝票)件数': 20.71,
								'訂正(黒伝票)': 15.14,
								'レジオープン時現金': 24.57,
								'入金件数': 10.86,
								'入金': 7.57,
								'出金件数': 10.86,
								'出金': 7.57,
								'[入力] 現金': 13,
								'[入力] クレジット': 21.14,
								'[入力] ポイント': 18.43,
								'[入力] 電子マネー': 21.14,
								'[入力] 商品券(釣無し)': 25.43,
								'[入力] 商品券(釣有り)': 25.43,
								'[入力] 掛売': 13,
								'差異合計': 10.86,
								'差異理由': 50,
								'銀行振込': 10.86,
								'貸金庫預け': 13.57,
								'警備会社預け': 16.29,
                                'チケット件数': 10.86,
                                'チケット': 10.86,
                                '[入力] チケット': 10.86,
								'前受金': 8.29,
								'雑益': 7.57,
								'雑損': 7.57
							};
							
							var createCellNum = function(str) {
								str = str.toUpperCase();
								var n = 0;
								for (var i = 0; i < str.length; i++) {
									n = (n * 26) + (str.charCodeAt(i) - 'A'.charCodeAt(0) + 1);
								}
								return n;
							};
							
							$('row c', sheet).each(function() {
								var addr = $(this).attr('r');
								var row = addr.replace(/[^0-9]/g, '');
								var col = addr.substr(0, addr.length - row.length);
								if (row == '1') {
									// colvisを使うと1行目がバグるので要素を消す
									$(this).remove();
								}
								if (row == '2') {
									// カラム名を見てwidthを設定する
									var width = col_width_map[$('is t', this).text()];
									if (width) {
										var colnum = createCellNum(col) - 1;
										coltags[colnum].setAttribute('width', width);
									}
								}
							});
						}
					}, {
						extend: 'csvHtml5',
						text: 'CSV',
						bom: true,
						exportOptions: {
							modifier: {
								page: 'current'
							},
							columns: ':visible'
						},
						customize: function( csv ) {
							var split_csv = csv.split("\n");
                            var dataRow = $("#data_grid tbody tr");
                            var minusIdx = 0;
                            for (var k = 0; k < dataRow.length; k++) {
                                if($(dataRow[k]).css('display') == 'none'){                                    var rowIndex = dataRow[k].rowIndex - minusIdx;                                    split_csv.splice(rowIndex,1);
                                    minusIdx++;
                                }
                            }
							csv = split_csv.join("\n");
							return csv;
						},
						filename: $("#search_company_code_1_1").val()
						+ '_' + $("#search_store_code_1_1").val()
						 + '_' + $("#search_year_1_1").val() + '_' + $("#search_month_1_1").val()
					}, {
						extend: 'colvis',
						text: '項目選択'
					}
		        ]
		});

		$('#data_grid tbody').on( 'click', 'tr', function () {
           if( $(this).parent().parent().attr('id') !== undefined){
               if ( $(this).hasClass('selected') ) {
                   $(this).removeClass('selected');
               }
               else {
                   table.$('tr.selected').removeClass('selected');
                   $(this).addClass('selected');
                   showRegiCloseDetail2($(this).find('input')[0].value);
               }
           }
        } );

 
おそらくこの辺りが押したいボタンの部分なんです。

投稿日時: 20/10/13 15:52:24
投稿者: waju

おそらくcolvisっていうボタンに対する処理が必要なんですかね?
 
項目選択がcolvis、、、
 
excel,csvのボタンは普通のボタンなんですよね。
 
colvis,vbaで検索かけて色々試してみますが
 
アドバイス頂けたらと思います。
 
どうぞ宜しくお願い致します。

トピックに返信