[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/24 06:47 / Filesize : 292 KB / Number-of Response : 1024
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part60



1 名前:デフォルトの名無しさん mailto:sage [2019/03/16(土) 20:39:09.64 ID:6HWXzj9o.net]
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part59
https://mevius.5ch.net/test/read.cgi/tech/1549692750/

116 名前:デフォルトの名無しさん [2019/03/22(金) 17:56:53.75 ID:DJ7JSKt5.net]
会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな?

117 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 18:05:28.43 ID:wNvbYX88.net]
いまどきマルチポストに眉をしかめるような時代遅れの人間なんていないよ、ね?

118 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 18:13:30.85 ID:f/f2Qmpp.net]
>>114
IEオブジェクト作らずに通信すると早くなる気がするけど早くならないかもしれない
試してみて

Sub foo()
Set httpReq = CreateObject("MSXML2.XMLHTTP")
httpReq.Open "GET", "https://www.nicovideo.jp/watch/sm31763534"
httpReq.Send
Do While httpReq.readyState < 4
DoEvents
Loop
str2 = httpReq.responseText
End Sub

119 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 18:19:28.87 ID:wCnCSK0y.net]
>>114
どっかのサーバーでPHPなどで書けば

120 名前:
一度に取得を投げて戻ったイベントで処理を書く
ネットワークに依存しないし負荷はサーバー
詳しくはPHPなどの質問スレッドでしろ
[]
[ここ壊れてます]

121 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 18:37:45.64 ID:wCnCSK0y.net]
>>116
VBAでは書いたことないけど
リクエストを配列にして一度に投げ
戻った奴から処理する
普通はイベントで受ける

122 名前:デフォルトの名無しさん [2019/03/22(金) 19:06:06.24 ID:DJ7JSKt5.net]
>>116
そのCreateObject("MSXML2.XMLHTTP")はなんでしょうか?
str2にはたしかに入ってますが"https://www.yahoo.co.jp/"にしたら空欄になってしまいます。
HTMLページは膨大なソースなのでDOMツリーで必要なものだけを取り出したいのですが、それはできますか?

>>117
PHPって知らないのですが簡単に学習できるのですか?

>>118
VBAでイベントってどうやって受けるのですか

123 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:30:29.78 ID:s6oj+Xdm.net]
>>109
まだ分かんねーのかよw

124 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:31:45.60 ID:f/f2Qmpp.net]
>>120
すまん無能、ちょっと静かにしてくれ



125 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:35:09.00 ID:wCnCSK0y.net]
>>119
PHPをおけるサーバーの契約まあ無料のところも有るだろ
学習は無料でツールをダウンロード出来る
比較的簡単な言語でいろいろソースもあるが
VBAは超簡単な方だからな

VBAは特定のイベントしか受けられんのかな
普通VBやc++やPHP などでコーディングするときは
イベントで受ける

126 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:35:18.99 ID:wT5mo1++.net]
アホの考えなんてわからんしわかりたくもないわw

127 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:37:24.46 ID:s6oj+Xdm.net]
>>119
出来る。
ResponseTextをDOMに入れる。

128 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:37:49.10 ID:f/f2Qmpp.net]
>>118
jsで言うPromise?
非同期がvbaにあるんか、と思って調べたら一応あったけどかなりしんどいな
https://system-engineerlife.com/vba/multithread/

>>119
>CreateObject("MSXML2.XMLHTTP")
http通信するだけのもの。DOM構築しないから軽いはず

129 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:46:10.91 ID:s6oj+Xdm.net]
>>125
これ、マルチプロセスだけどな。
別にしんどくない。
ExcelVBAでマルチプロセスやるときはExcel.Applicationを複数作ってやるのが普通だと思うけどね。

最終的に速度どうにもならないときはマルチプロセスにする。

130 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:51:03.17 ID:s6oj+Xdm.net]
>>123
10時間ぶっ通しのVBAのようにアホ丸出しの例としてExcelVBAからPowerPoint動かすって話だろ。

>>75のような当たり前の話じゃないんじゃないの?
という問い掛けが>>93だろ。

131 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 19:58:09.82 ID:s6oj+Xdm.net]
>>125
ちなみにマルチスレッドはこっちにあるやり方
https://needtec.exblog.jp/18893727/

場合によっては使える(自分で表示したメッセージボックスのボタンをクリックとか)と言いたいところだが止めとくべきだね。

132 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 20:11:29.06 ID:f/f2Qmpp.net]
>>119
Sub foo()
Set httpReq = CreateObject("MSXML2.XMLHTTP")
httpReq.Open "GET", "https://www.yahoo.co.jp/", False
httpReq.Send
Do While httpReq.readyState < 4
DoEvents
Loop

Set HTML = CreateObject("htmlfile")
HTML.write httpReq.responsetext
End Sub

これでHTMLがdomになる
ちなみにphpなら二行で終わる
サーバー借りなくてもxamppっての使えばPCだけで行けるけど、
どっちにしても学習コスト高い気がする
ついでにHP作ってみると良いかも知れない

>>126>>128
excelかVBSインスタンスをスレッドの分作って文字列作ってevalみたいにして実行か
もうここまで来るとVBAでやるのはなぁ
VBAしかないなら頑張れるけど、他言語だと瞬殺と思うとやる気が削がれる

133 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 20:17:17.71 ID:PU7qmvYu.net]
>>127
> 10時間ぶっ通しのVBAのようにアホ丸出しの例としてExcelVBAからPowerPoint動かすって話だろ。
その例がアホって話だろw

134 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 20:59:52.84 ID:EWPhTEeI.net]
>>116
httpReqを配列にしてreadyStateが4より小さいものから処理すれば良いだけだろ



135 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 22:37:39.98 ID:kGxcTvNs.net]
もうExcelの変な使い方スレでいいよ、ここ。

136 名前:デフォルトの名無しさん [2019/03/22(金) 22:41:13.31 ID:DJ7JSKt5.net]
レスありがとうございます。

>>122
なるほどそうですかありがとうございます。
いまの直近の問題が解決したらあとで勉強してみます。

>>124-125, >>129
DOMができたとして
50個くらいある複数のURLの1つ1つに
Do While httpReq.readyState < 4
DoEvents
Loop
で時間待ちするのが問題なんです。
1つあたり1分近くかかるから。
一気に全部同時にやれないかなと。

137 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 22:51:56.07 ID:tgov+uRX.net]
PowerShellでやった方が絶対に速い

138 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 22:54:22.06 ID:CAtaruvO.net]
>>134
PowerShellのプログラミングってめっちゃめんどくさい
タイプ量が半端なく多くなる。 大嫌い

139 名前:デフォルトの名無しさん [2019/03/22(金) 23:08:19.23 ID:E2ofkEmJ.net]
まとめてダウンロードしてファイルに保存
その後一つずつ解析するべき
domなんて使わなくても正規表現で何とかするべき

140 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 23:19:11.20 ID:tgov+uRX.net]
でもpowershellなら.NETのWorkflowが手軽に使えるよね

141 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 23:23:39.28 ID:tgov+uRX.net]
Runspaceも使えるし

142 名前:デフォルトの名無しさん mailto:sage [2019/03/22(金) 23:36:27.88 ID:f/f2Qmpp.net]
>>133
すまん、無理だった
他の人頼む
arrayでurl設定して、class使ってforeachだろうけど
vbaのclassを覚える気力がもう内
とりあえず2つだとこんな感じ

Sub foo()
Set httpReq = CreateObject("MSXML2.XMLHTTP")
httpReq.Open "GET", "https://www.yahoo.co.jp/", False
httpReq.Send
Set httpReq2 = CreateObject("MSXML2.XMLHTTP")
httpReq2.Open "GET", "https://urasunday.com/", False
httpReq2.Send

Do
flg = False
If httpReq.readyState < 4 Then flg = True
If httpReq2.readyState < 4 Then flg = True
DoEvents
Loop While flg

Set HTML = CreateObject("htmlfile")
HTML.write httpReq.responsetext
Set HTML2 = CreateObject("htmlfile")
HTML2.write httpReq.responsetext
End Sub

143 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 00:08:10.78 ID:GJYnZjvR.net]
If httpReq.readyState < 4 Then flg = True
If httpReq2.readyState < 4 Then flg = True
片方で抜ける
配列ぐらい使えよ

144 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 00:23:31.53 ID:GJYnZjvR.net]
読み込めた物から処理するんだよ



145 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 00:41:36.68 ID:sBAP9hOD.net]
>>140
・普通に逆だった、スマン
・pushくれ。redimしなくていい素直なpush
・なんかテキトーにやってもうまいことやってくれる非同期欲しい
・eachで自動生成されるindexくれ
・インクリメントくれ
ってことでうんこコードになったわ、すまん

>>141
それは分かるし書きたいんだけど
documrnt.ready(function(){}〜
的な奴が分からなかった

146 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 00:42:04.83 ID:sBAP9hOD.net]
>>133

Sub foo()
Const max_count = 1000 '1000で決め打ち
url_arr = Array( _
"https://www.yahoo.co.jp/", _
"https://urasunday.com/" _
)

Dim httpReq(max_count)
index_httpReq = 0
For Each url_foo In url_arr
Set httpReq(index_httpReq) = CreateObject("MSXML2.XMLHTTP")
httpReq(index_httpReq).Open "GET", url_foo, False
httpReq(index_httpReq).Send
index_httpReq = index_httpReq + 1
Next

147 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 00:42:09.03 ID:sBAP9hOD.net]
Do
flg = False
For Each url_foo In url_arr ' どれかがまだ
If httpReq(index_foo).readyState < 4 Then flg = True
Next
DoEvents
Loop While flg

Dim html(max_count)
index_html = 0
For Each url_foo In url_arr
Set html(index_html) = CreateObject("htmlfile")
html(index_html).write httpReq(index_html).responsetext
Cells(index_html + 1, 1).Value = httpReq(index_html).responsetext 'テスト。A列に出力する
index_html = index_html + 1
Next

End Sub

148 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 00:45:06.99 ID:sBAP9hOD.net]
>>143までは問題ないと思う
>>144でグダグダになった。
パフォーマンス的にはそんなに変わらんだろう。大量にあるとメモリにも影響してきそうだけど

149 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 01:11:21.36 ID:GJYnZjvR.net]
If httpReq(index_foo).readyState < 4 Then flg = True
コレじゃ1つでも読み込めたらループから抜ける
set したのはリリースする

処理がおもいのは
html(index_html).write httpReq(index_html).responsetext
これだろ

150 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 01:15:54.12 ID:GJYnZjvR.net]
同じ個数配列で使うものはTypeを使って構造体にしろよ
構造体を配列で取る
redimぐらい使えよ

151 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 01:39:28.59 ID:sBAP9hOD.net]
>>144
Do
flg = False
For Each url_foo In url_arr ' どれかがまだ
If httpReq(index_foo).readyState < 4 Then flg = True
Next
DoEvents
Loop While flg

For Each url_foo In url_arr ' どれかがまだ
Do
flg = False
If httpReq(index_foo).readyState < 4 Then flg = True
DoEvents
Loop While flg
Next

>>146
>コレじゃ1つでも読み込めたらループから抜ける
入れ子逆だった、スマン

>set したのはリリースする
httpReq is nothingがエラーになる
vbaって配列 is nothing出来ないのか

>処理がおもいのは
相対的に重いけど体感上重くは無いと思う

>>147
vbaのclassは正直もう無理や

152 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 02:18:04.14 ID:GJYnZjvR.net]
構造体を使うのは処理を分かりやすくするため
リリースは
Set オブジェクト変数 = Nothing
感覚的に難しいかな

153 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 04:53:32.37 ID:4V4ijAbJ.net]
>>142
普通は以下のように、自分で状態を調べたりしない。
If httpReq.readyState < 4 Then flg = True

これは、Node.js などの低レベルな書き方で、普通はこれらの状態をラップして、
簡潔に書ける方法が、ライブラリ・フレームワークに用意されている

例えば以下は、JavaScript, jQuery の非同期処理の書き方。
ready になったら、引数で定義した、callback 関数を呼んでもらう。
document.ready(function(){}〜

非同期処理には、promise, deffered, async/await の書き方もある

Ruby で、Selenium WebDriver なら、非同期処理を考えなくても、普通に同期的に書ける。
非同期処理の書き方のすべてが、ラップされているから。

Timeout 設定時間までに、状態が満たさなければ、Timeout Error になるだけ

154 名前:150 mailto:sage [2019/03/23(土) 05:31:12.29 ID:4V4ijAbJ.net]
漏れなら、Ruby で、Selenium WebDriver で、

url.txt には、行区切りでURL を書いておく。
script.rb には、Selenium WebDriver での処理を書いておく

main.rb には、以下を書いておいて、このファイルを、ruby main.rb で実行する

File.foreach( "url.txt" ) do |line|
`ruby script.rb #{ line }`
end

url.txtを、1行ずつ処理して、各URLを取得して、それを引数にして、
ruby script.rb URL の別プロセスを呼び出す。
ただし、Selenium WebDriverでの処理が、URLだけが異なって、他は同じ事が条件

つまり、マルチプロセス

これをマルチスレッドにすると、排他処理などが面倒。
それに同一プロセス内の処理になるので、1つのエラーで、すべての処理が止まるし、やってられない!



155 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 05:42:27.10 ID:GJYnZjvR.net]
VBA以外の構造化言語で書けば綺麗に書ける
まあ出来るだけ近いように書くのがよいが
まあ所詮俺もこんな処理ではJavaかPHPでしか書かない
まあ

156 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 07:22:22.14 ID:4ZM/hDcb.net]
>>148
> vbaのclassは正直もう無理や
TypeとClassは関係ないぞ
Typeは単に複数の値を纏めるだけ

157 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 08:17:41.71 ID:Rd0MSm4a.net]
たぶん、構造体 = Type = 型 = クラス っていうアナロジーで考えてたんだろうね

158 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 09:27:10.21 ID:GJYnZjvR.net]
まあ、コードも間違ってるし書き方も良くない
配列すら得意でないようなので・・・
あと、せっかくExcelを使ってるんだから
Url等の情報はセルから読み込むよな

159 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 11:00:19.04 ID:tmlWK/3A.net]
>>151
seleniumってまだ使えんの?もう機能しなくなったと思ってた

160 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 11:18:14.30 ID:sBAP9hOD.net]
あぁvbaってclassと構造体両方あったのか

>>155
コールバックの部分だけはマジで分からんかった
どうやって書くんだ

>>150
クソ言語乙

161 名前:fusianasan mailto:sage [2019/03/23(土) 11:19:15.45 ID:j1qksDnK.net]
Debug.Print("test")

162 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 11:39:13.69 ID:uLwnX5A6.net]
>>130
だから、お前が真面目に出来るとか言ってるのは、真面目な話じゃ無くてアホな話だろと言ってるんだが。

アホな例を出さなかったらそれこそアホだろw

163 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 11:47:22.03 ID:4ZM/hDcb.net]
>>159
はあ?
>>67
> やろうと思えば出来んでもないのか
って書いてるからやること自体は難しくないって書いてるだけだぞ
そもそもExcel VBAでPowerPointを操作するのがアホとか言ってるわけじゃないことも理解できてないのかよw

164 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 11:52:28.25 ID:/daUWZWt.net]
>>157
Excelでコールバックで受けたいって言っても、やったことないな
所詮そんなにクリティカルなルーチンを書く環境じゃないだろ
そんなことしなくても、ステータスが読み込めた物から処理して
全ての配列が処理出来たら終わればいいぐらいのコーディングだな
自分で書かなきゃ意味ないぞ



165 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 12:03:01.48 ID:jhd39dfA.net]
>>160
無能の相手はほどほどで

>>161
やっぱり難しいよな
>全ての配列が処理出来たら終わればいいぐらいのコーディングだな
これで書いたよ
DOM部分はどうせ瞬殺だからまとめて良い

166 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 12:12:55.71 ID:/daUWZWt.net]
>>162
他の言語で簡単にかけるって言っても
所詮その言語で提供されたルーチンを使うだけだから
適した言語で書けば比較的簡単にかけることは確か
コーディングに関しては直感で書いたからもう少し読んでみよう

167 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 12:16:35.94 ID:/daUWZWt.net]
まあ、所詮夜勤から帰って書き込みしてるから
午後は、お酒が進むんでまあ気にするな

168 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 12:44:05.74 ID:4ZM/hDcb.net]
>>157
> コールバックの部分だけはマジで分からんかった
> どうやって書くんだ
コールバックなんていらんだろ
素直にreadyStateが4になったら処理すればいいだけ
スマホから打ってるからデバッグしてないけどこんな感じ
Type Request
 Session As Object
 Done As Boolean
End Type
url_arr = Array("https://www.yahoo.co.jp/", "https://urasunday.com/")
Dim Requests()
ReDim Requests(LBound(url_arr) To UBound(url_arr))
Dim Index As Integer
For Index = LBound(url_arr) To UBound(url_arr)
 With Requests(Index)
  Set .Session = CreateObject("MSXML2.XMLHTTP")
  .Session.Open "GET", url_arr(Index), False
  .Session.Send
  .Done = False
 End With
Next
' 続く…

169 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 12:44:29.37 ID:4ZM/hDcb.net]
' 続き
Dim AllDone As Boolean
Do
 AllDone = True
 For Index = LBound(url_arr) To UBound(url_arr)
  With Requests(Index)
   If Not .Done Then
    If .Session.readyState < 4 Then
     AllDone = False
    Else
     Cells(Index + 1, 1).Value = .responseText
     .Done = True
    End If
   End If
  End With
 Next
 DoEvents
Until AllDone

170 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 14:51:45.33 ID:uLwnX5A6.net]
>>160
いや、だから...
それに>>67じゃなくて>>69だろ。

やろうと思えば出来るけど、驚いてるのはそこじゃ無いだろという指摘が理解できなかったから>>96みたいな頓珍漢なことを言ったんだろ。

じゃなかったら>>96みたいに噛み合わない発言にならない。

171 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 14:57:22.48 ID:jhd39dfA.net]
>>165
俺も使わなくてもいいと思うが
上でコールバックコールバック言ってたからな

>>167
お前に何の能力もないのは分かったから落ち着け

172 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 15:09:34.24 ID:4ZM/hDcb.net]
>>167
お前はアンカーもまともに見れないのかよw

173 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 19:02:03.41 ID:4V4ijAbJ.net]
157デフォルトの名無しさん2019/03/23(土) 11:18:14.30ID:sBAP9hOD

>>150
クソ言語乙

142デフォルトの名無しさん2019/03/23(土) 00:41:36.68ID:sBAP9hOD

こいつは荒らしじゃね?
相手しない方がよい

174 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 19:19:07.38 ID:tumCHHdc.net]
>>170
ここはVBAのスレだよ。 そこにRubyとか持ってきたからじゃねえのw



175 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 20:10:53.10 ID:VsaUG60l.net]
>>170
そのruby信者が荒らしだぞ
あらゆるスレで「rubyなら〜」と言ってrubyを貶めしている
pythonスレではスレタイにruby禁止とまで入る始末

176 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 22:49:02.19 ID:XxYiFSG+.net]
コールバックって何?
ググると、関数の引数に渡す関数って出てくるけど、
それって、複数の処理を、
↓こうやって横着して1行に書くのと何が違うのかわからん。

a = Replace(Replace("あいうえお", "あい", ""), "えお", "")

177 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 22:57:17.29 ID:VsaUG60l.net]
>>173
a関数の処理が終わった場合、a関数の引数を受け取ってb関数を自動的に開始する・・・という処理
非同期、特にスクレイピングが多重で続くような場合は非常に強力
https://www.sejuku.net/blog/67743

使う場面が分からないのは、使う必要が無いと思って良い
jsだと死ぬほど使うが、EXCELで使う事はまずない

178 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 23:43:32.78 ID:vBZJiXyX.net]
VBAでコールバックを実装しようとしたら、 Application.Runを使うかクラスモジュールでメソッド書いてCallByName関数で呼び出すようにするかって感じになるんかね

179 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 23:54:56.46 ID:49H4PHbP.net]
>>175
AddressOf

180 名前:デフォルトの名無しさん mailto:sage [2019/03/23(土) 23:57:25.89 ID:49H4PHbP.net]
>>175
ごめんVBAでコールバックを「実装」か。
VBAの関数をコールバックするにはどうするかという問題と勘違いした

181 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 00:19:26.62 ID:lQI3nZvh.net]
>>177
そう、外部プログラムにVBA側の関数ポインタを渡す話じゃなくて、受けとる側の処理の書き方

182 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 00:40:55.67 ID:MjUvfGmD.net]
クラスのメソッドとしてコールバック関数を実装してinterfaceか遅延バインディング使えばいい

183 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 07:46:43.58 ID:myNgr9GS.net]
>>173
> a = Replace(Replace("あいうえお", "あい", ""), "えお", "")
これは外側のReplace()に内側のReplace()の「結果」を渡してる
コールバック関数は内部で呼ぶ関数を変えたい時に使う
例えば図形を描くルーチンがあったとして出力先を色々切り替えたいとかだと出力する関数を自体を渡す
やり方はこの辺りを参考にして
https://qiita.com/rai_suta/items/c07b22130b302682b729

184 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 11:58:57.43 ID:DVu1xjKe.net]
>>179
やっぱりAddressOfの値を受け取ってそれをAPI経由で実行するのがいいんじゃないか
ただしシグネチャは一定とする



185 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 12:25:58.30 ID:3NyLxN/m.net]
https://i.imgur.com/nvGsYOy.jpg
エクセルあればワードもパワポもアクセスもいらない

186 名前:デフォルトの名無しさん [2019/03/24(日) 12:32:32.58 ID:4ve/ST91.net]
そんな事をエクセルVBAでやる意味って何?
何が何でもVBAって馬鹿のひとつ覚えって言うんだよ

187 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 12:35:25.20 ID:aL5blMH8.net]
>>183
他言語を覚えなくて良いのは大きなメリット
環境構築、記述方法、言語仕様
この辺全部覚えなくて良いのはデカイ
特にvbaはプログラマーじゃなく事務員が使ってる場合も多いので、環境構築が苦手な事が多々ある

188 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 13:44:54.25 ID:PQbtijKV.net]
ノコギリで刺身切ろうとして包丁使えよって言われて包丁の使い方覚えなくていいのはメリットって言ってる構図

189 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 13:53:08.65 ID:aL5blMH8.net]
>>185
例え下手でわらった

190 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 13:54:25.82 ID:PQbtijKV.net]
>>186
お前は仕事下手だよな

191 名前:デフォルトの名無しさん [2019/03/24(日) 14:07:22.16 ID:OZ1kvGmt.net]
他言語を覚えなくて良いって発想がどうかと思う
適材適所で効率良くするのも仕事だし
死にゆく言語の代表がVBA

192 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 14:08:05.28 ID:myNgr9GS.net]
>>185
流石に頓珍漢すぎ
出刃包丁で刺し身切ろうとしたら刺身包丁買ってこいって

193 名前:ゴネてる奴がいるだけ []
[ここ壊れてます]

194 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 14:30:37.07 ID:aL5blMH8.net]
>>187
根拠もなく、何を見てそう思ったの?

>>188
>他言語を覚えなくて良いって発想がどうかと思う
>適材適所で効率良くするのも仕事だし
これは同意
俺も効率化のためにphpとjsはある程度覚えてるわ

ただ、人に勧めるのは現実的に厳しい面がある
たまーに出てくるスクレイピングのためにphp覚えろって言うのはなかなか酷
時間がかかって良いならウンコみたいなコードでも処理できるしな
ここの人でもサーバー=レンタルサーバーって発想した人いるけど、
スクレイピングのためにphp動かすならxamppで良い

>死にゆく言語の代表がVBA
ずっと言われてるけど全然死なないので俺も困っている。せめてバージョンアップして



195 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 14:34:03.77 ID:dT6Xb8jy.net]
既に公式にはJavaScriptに置き換わってるのに今更バージョンアップもクソも

196 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 14:35:01.83 ID:aL5blMH8.net]
>>191
JavaScriptに置き換わってるって言ってもアドインだけでしょ

197 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 14:43:19.68 ID:dT6Xb8jy.net]
>>192
だけもクソも、現在推奨されているExcelのプログラミングインターフェイスはアドインのみだよ
VBAは廃止予定のレガシーな機能であり、使用は推奨されない

198 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 14:53:50.44 ID:aL5blMH8.net]
>>193
それは知りませんでした、申し訳無い
そのソースってどこかにありますか?

vbaがやっと進化するのか

199 名前:デフォルトの名無しさん [2019/03/24(日) 15:03:11.84 ID:A9z4XFqj.net]
自分の現在分かる範囲で創意工夫してやろうとするのは良いことで出来ちゃってるんだろうけどこの先ずっと出来るかは不明
新しいのを取り入れないとダメ
特にエクセルVBAでやる必要のないのがあるなら勉強のチャンスなのに古いのでやろうとするから進歩しない

200 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 15:10:13.55 ID:gZMjxNOF.net]
xampp入れてPHP一から覚えるぐらいなら、VB.NET覚える方がはるかにマシだわ

201 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 15:19:49.80 ID:Mw3X0nZC.net]
>>191
エクセルのマクロもVBAじゃなくてjavascriptになるのか?
てか、もうなってるの?
ボタンと押したときの動作とかもすでにjavascriptで書くようになってる?

202 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 15:23:45.60 ID:aL5blMH8.net]
>>197
アドインがjsで書けるように鳴ったんだよ

203 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 15:39:49.96 ID:y9CSgW5G.net]
ここは言語スレじゃなくてExcel VBAスレなんだが
バイクやチャリの板で日本縦断の準備とか注意点についての質問レスに対して飛行機使えよ馬鹿とレスしてるやつ居たらアホだろ

204 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 15:47:43.47 ID:aL5blMH8.net]
>>199
何回やっても例え下手やなw
もっとやっていいぞ



205 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 15:54:11.30 ID:Mw3X0nZC.net]
>>198
マクロは関係ないのね。 VBAが無くなるとは考えられん

206 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 16:01:00.66 ID:dT6Xb8jy.net]
>>201
マクロは単純に廃止だろうね
知らないかもしれないが、昔はVSなどMS製品には大抵VBAマクロが入ってたんだよ
どんどん廃止されて、今や残ってるのはOfficeだけ

207 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 16:08:12.38 ID:Mw3X0nZC.net]
>>202
ん? マクロ自身が廃止になるのか?
マクロは残るがVBAじゃなくてjavascriptになるのか、って聞いたんだが

208 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 16:19:40.92 ID:aL5blMH8.net]
>マクロ自身が廃止
上でそう言ってたけどソースが見つからない
ただの噂かも

>VBAじゃなくてjavascriptになるのか
現状はjsでもアドインを作れるようになっただけ

俺もvbaは廃止しないと思う

209 名前:デフォルトの名無しさん [2019/03/24(日) 16:19:49.86 ID:rXU7uH3v.net]
だってVBAってセキュリティ的にヤバいし
エクセルファイルに偽装してマルウェア的なかなりの事までやれちゃうから廃止で良いよ

210 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 16:23:34.70 ID:Mw3X0nZC.net]
>>204
>俺もvbaは廃止しない

絶対あり得んよね。 今までの過去の資産がどれだけあるか
それを作ってるのは理系のプログラマじゃなくて文系の経理の女の子も相当いるからな

211 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 16:46:14.04 ID:cASdygc2.net]
全くバカばっかりだ。
その場で最適なのを選択すりゃ良いんだよ。

レガシーとか言ってるバカは救いようがない。
VBAで簡潔出来るならその方が良いんだよ。
VBScriptでファイル選択ダイアログを使う時にExcel.Application使うなんてのは本当はやりたくないけど他にうまい方法が無いから仕方ない。
このやりたくないというか筋が悪いと感じることが出来ない奴は結局駄目だね。

レガシーなのはその通りだが、それで別言語使って筋悪プログラミングしてたら意味が無い。

212 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 17:13:35.45 ID:cASdygc2.net]
“Office アドインはVBAやVSTOを置き換えるものではないので(現時点では)、「何でこんな簡単なこともできないの!?」とイライラしてはいけない”だとさ。

213 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 17:17:26.83 ID:iA9UpJgV.net]
Officeアドインとかいうの忌み子になりそうだよな

214 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 17:43:12.27 ID:bibhGphx.net]
とりまIEが消えればVBAでスクレイピングは消える
OS依存の負債を作りかねない機能はどんどん省いて欲しいね



215 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 17:58:19.82 ID:XiACCcaf.net]
セルの中に、そのセルが存在するシート名を抜き出す関数の定義ってどんなのがある?
シンプルで分かり易い、エクセルの版に依存しないのが良いな。

216 名前:デフォルトの名無しさん mailto:sage [2019/03/24(日) 18:00:03.79 ID:XiACCcaf.net]
ここはVBAのスレだから、セル内で使う計算式の質問はスレ違か。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<292KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef