21/09/13 08:13:09.52 tEaVHPxwM.net
>>1 乙
3:デフォルトの名無しさん
21/09/13 19:11:08.29 Pa7+I2w50.net
いつものあいつの釣りとあまりに馬鹿過ぎる質問はお断りです
また、Excelの使い方すらわからない人はお帰りください
4:デフォルトの名無しさん
21/09/13 21:24:22.31 dfMVUW3H0.net
それでも来たらスルーでいいんじゃね
5:デフォルトの名無しさん
21/09/14 16:24:06.98 QWQM37es0.net
A列の全行のセルの値を配列に突っ込む時、オートフィルターが複数列でかかっていると、
表示されてるやつだけ配列に入ってしまうの、なんとかならない?
配列をA列に縦方向に貼り付ける時も、オートフィルターが既にかかってると、適切に元の行に貼り付け戻せない。
仕様なのかな
6:5
21/09/14 16:26:32.34 QWQM37es0.net
2万行あるから、なるべく最初にa列の内容を全部配列に入れてから、それぞれを操作して、
それからまた修正済みの配列の中身をa列に上書き貼り付けしたい。
でも、オートフィルターがかかっているとまずい。
複数列でオートフィルターがかかっているととても難しい
7:デフォルトの名無しさん
21/09/14 16:40:04.06 dOl/0XMua.net
フィルタ全解除する処理を前に置けばいいじゃない
8:5
21/09/14 17:37:49.57 QWQM37es0.net
全解除して処理を行う、というのはできたけど、ユーザーのためにフィルタした状態ってのはそのままに戻したい。
フィルタしてる列が単体ならなんとかそれはできた。
だけど、複数列でフィルタした状態を、いったん全解除して、そんであとでまた元のフィルタ選択状態に戻すのが出来なさそうなのよね。
9:デフォルトの名無しさん
21/09/14 19:45:59.21 dPBji9ks0.net
テーブルの見出しはvalueじゃ取り出せないんだな
勉強になったわ
10:デフォルトの名無しさん
21/09/14 20:24:42.51 Tksl7xa90.net
フィルタは全解除するのが一番手っ取り早い
横に伸ばすのは異常に難易度高い
11:デフォルトの名無しさん
21/09/14 20:25:17.71 Tksl7xa90.net
列の増加が多いなら最初から大量にフィルタ列を用意シておいたほうが良い
12:デフォルトの名無しさん
21/09/14 21:12:31.57 u7isybhPa.net
>>8
フィルタの条件って色々指定できる(色とか日付とか特定の文字列を含むとか)から、全部に対応しようとするとすごくめんどくさい
URLリンク(excel-ubara.com)
割り切りとして「このマクロを使ったらフィルタは解除されますが情報は最新化されます」くらいにしとくのが無難かと
13:デフォルトの名無しさん
21/09/14 21:57:16.30 zgsbOTDxH.net
作業シートにコピペしてから処理すれば?
14:デフォルトの名無しさん
21/09/14 23:44:27.27 UJ1BwW9y0.net
コマンドボタンを押してユーザーフォームを開くときに、
TopとLeftの位置をセルC5のTopとLeftの位置に合わせるべく、
以下のようにコードを記述したのですがうまく合ってくれません。
※セルC5のLeftやTop位置より大分左や上に表示されてしまう。
何か記述的におかしいのでしょうか?
Sub UserFormOpenSet()
Dim varTop, varLeft
With Sheets("説明シート").Range("C5")
varTop = .Top
varLeft = .Left
End With
With UserForm
.Show
.Top = varTop
.Left = varLeft
.Label1.Caption = "コメント内容"
・
・
・
End With
End Sub
15:デフォルトの名無しさん
21/09/14 23:56:12.55 OBquwEh60.net
>>14
UserForm top left でググッたらこんなページがURLリンク(www.officepro.jp)
検証してないけど試してみたらどうですかね
16:デフォルトの名無しさん
21/09/15 00:23:15.17 8Tg1g6H40.net
>>15
UserForm top left セルの位置 でググったら
完璧なTipsがありました!
検索のヒントをありがとうございました!
17:デフォルトの名無しさん
21/09/15 00:48:53.61 YsJqQLCb0.net
どーでも良い質問なんだが、VBAからエクセルのセルに値を入れるときの表現について
意見が割れてるので、みんながどー表現してるか知りたい
例えばVBAで A1セルに 123 という値を入れるとき、
A1セルに 123 を出力するという表現を使うか、A1セルに 123 を入力するという表現を使うか、どっち?
仕様書で人によって同じことしてるのに出力となってたり入力となってたりで色々バラバラすぎる
18:デフォルトの名無しさん
21/09/15 01:03:00.63 gZeM1+Z6d.net
>>17
VBAで計算や処理した結果をワークシートに保存するだけ、セルに値を入れて終わりの場合は出力
シートに値をセットしたあと、さらにその値を使って数式やグラフなどで別の処理や加工をする場合は入力
19:デフォルトの名無しさん
21/09/15 07:18:17.38 zmLKkAKu0.net
>>17
それは一律で入力じゃないのか
代入って言うぐらいだし
「出力」はエクセルがrangeのvalueを出力してるだけでは?
20:デフォルトの名無しさん
21/09/15 07:51:35.00 qRxK7g6Y0.net
VBAの関数、メソッドとしてそのデータが入力値なのか出力値なのかは明白なのでは?
21:デフォルトの名無しさん
21/09/15 10:54:35.14 LR7HEnPp0.net
>>17
VBAがセルに出力
ユーザーがセルに入力
22:デフォルトの名無しさん
21/09/15 12:02:19.64 K+waubxMM.net
お知恵をお貸し下さい
String型の変数に文章を代入しています
その変数が「は」を助詞として使用しているかを検出し、その「は」が何文字目に記載されているかを抽出したいです
判定式はどの様に組むのが良いでしょうか
23:デフォルトの名無しさん
21/09/15 12:16:58.05 ggl3y/Wm0.net
>>22
これが使えるんじゃないかな。
URLリンク(qiita.com)
24:デフォルトの名無しさん
21/09/15 12:26:39.15 ggl3y/Wm0.net
こちらの下の方に具体的に品詞の判定方法がある。
URLリンク(www.excel.studio-kazu.jp)
25:デフォルトの名無しさん
21/09/15 14:02:58.42 XT7xZlnV0.net
是非とも
「はははははは、ははのはははははははと笑う」で
挙動確認を行なって欲しい案件だな
26:デフォルトの名無しさん
21/09/15 16:06:38.48 5d7y3fL1M.net
>>17
> A1セルに 123 を出力するという表現を使うか、A1セルに 123 を入力するという表現を使うか、どっち?
俺なら「A1セルに 123 を書き込む」かな
シートはストレージみたいなものなのと思ってるので出力とか入力って言うのはなんか違和感ある
27:デフォルトの名無しさん
21/09/15 16:59:13.14 3TKYe9Fz0.net
VBA側を主体に書いているなら(シートに)出力
シート側を主体にかいてるなら(VBAから)入力
だな
VBAの仕様書でVBA側を主体にしないのはどうかと思うが
(マクロ付き)エクセルの仕様書だと考えればまあ入力でもいいのかも
28:デフォルトの名無しさん
21/09/15 23:30:54.86 IO2bkDAL0.net
985なのですが、
URLリンク(whois.nic.ad.jp)
から
b. [ネットワーク名] YAHOO-NET
をVBAで抽出するいい方法はあるでしょうか?
29:デフォルトの名無しさん
21/09/16 00:13:25.85 /erdykE4H.net
>>28
Sub ネットワーク名取得()
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "URLリンク(whois.nic.ad.jp) False
.Send
For Each s In Split(.responseText, vbLf)
If InStr(s, "ネットワーク名") Then Debug.Print s
Next
End With
End Sub
30:デフォルトの名無しさん
21/09/16 00:59:42.68 5Hx4RpZ/0.net
一生使うことのなさそうなCreateObjectだな
31:デフォルトの名無しさん
21/09/16 01:49:26.07 tvb8xhvB0.net
>>28
shift-jis の古いサーバーっぽい。
Ruby で作った
require 'open-uri'
require 'nokogiri'
url = "ここへURL"
doc = Nokogiri::HTML( open( url ) )
elements = doc.css( "pre" )
text = elements.first.content # 1つ目のpreの内容
result = "エラー! 該当なし"
text.each_line( chomp: true ) do | line | # 改行を除去して、各行を処理する
if line.start_with? "b. [ネットワーク名]" # 行頭が何々で始まっていれば
result = line
break
end
end
puts result
出力
b. [ネットワーク名] YAHOO-NET
32:デフォルトの名無しさん
21/09/16 01:51:47.59 YFUf0QLVM.net
なぜRuby
33:デフォルトの名無しさん
21/09/16 02:01:13.02 FMosLWBbd.net
スレタイも質問も読めないRubyバカ
34:デフォルトの名無しさん
21/09/16 06:38:12.58 COWrCKXD0.net
利用者数激減の言語
それがruby
35:デフォルトの名無しさん
21/09/16 08:25:21.24 J7QCCEb9M.net
>>32-34
相手すんなよ…
36:デフォルトの名無しさん
21/09/16 08:25:49.50 3isIfw030.net
>>17
なるほど仕様書の問題か
ならば現場内で紛らわしくないような記載のルールを作ればいいかな。
例えばユーザーが手打ちで設定する場合は「入力」
VBAで書き込む場合は「出力」または「設定」
コード上では「取得」と「設定」とかに分かれるからあまり問題ないだろうけど、仕様書の記載はまた別のセンスが必要になるからね。
一見して分かりやすく曲解のない仕様書を作るときって日本語の難しさを痛感することあるよね。
そういう時は大まかな流れ図みたいなもの書いて添付して紛らわしさを回避するのも一つの手だよ。
37:デフォルトの名無しさん
21/09/16 11:33:48.95 0wHWe9CF0.net
質問への回答ありがとう
>>17の質問者です
個人的には「人が入力」、「VBAから出力」というとらえ方がしっくりきました
紛らわしくない書き方のルールを作るというのは本当にその通りで、
これは実践したい
日本語は改めて考えると主体が曖昧で難しい…
38:デフォルトの名無しさん
21/09/16 12:13:09.55 /erdykE4H.net
>>37
日本語の文章ってのは、主語が存在しなくても成立する性質があるんだよ
おかげでどっち視点かわからなくなる現象が起きやすい
逆に英文法では主語がほぼ省略できない
だから単語を置き換えただけの翻訳は不自然な文章になる
39:デフォルトの名無しさん
21/09/16 13:11:41.46 3+DQoJa1a.net
グッジョブ!俺
40:デフォルトの名無しさん
21/09/16 14:54:30.21 QuckXkbq0.net
>>38
馬鹿の典型例
41:デフォルトの名無しさん
21/09/16 17:31:50.83 Z23LNYuB0.net
質問させてください。
ウェブサイトから特定の場所の情報を抽出するのはこちらのVBAを使用するということで間違いないでしょうか?
またこれはExcelを購入することによって使用できるもので、WindowsでもMacでも使用できるのでしょうか?
現在Macを使用しておりまして、具体的に申し上げるとyahooファイナンスなどの個別銘柄ページから配当利回りなどの情報をまとめて抽出したいと考えております。
スレ違いでしたら申し訳ございませんが、検索してもよく分からなかったので、書き込み数が多いこちらで質問させていただきました。
よろしくお願い申し上げます。
42:デフォルトの名無しさん
21/09/16 17:42:26.31 3abSZdzaM.net
俺が馬鹿なだけかもしれねぇけど何をしたいのかがさっぱり分からない
43:デフォルトの名無しさん
21/09/16 18:02:43.18 nCqRUFyPM.net
スクレイピングしたいんだろ
そのデータをどう扱うかによるわな
44:デフォルトの名無しさん
21/09/16 18:31:48.90 sOgFGA/J0.net
というかMAC版のEXCELってVBA使えるの?
あとスクレイピング用のコンポーネントも
45:デフォルトの名無しさん
21/09/16 18:41:42.01 EvK5hxPzM.net
他のツールでデータを集めて
結果をExcelにするのが良いよ
csvでもいいんじゃね?
46:デフォルトの名無しさん
21/09/16 19:07:04.50 Az+Wn1Ze0.net
>>41
htmlから簡単なスクレイピングならPower Queryがとっつきやすいかと。
URLのリンク先がcsvやExcelファイル、pdfファイル、
GitHubにあるJSONなんかもこれで結構いける。
CSS構造や、
画面上で検索指定やボタンを押させるような対話型を必要とする
複雑なhtmlなら、Pythonとか。
その先の処理でVBAを組み合わせることはある。
クエリーエラーを避けるため、一つずつシーケンシャルに更新させたいとか、
同時にファイルをDLして保存したいとか。
47:デフォルトの名無しさん
21/09/16 19:33:58.44 COWrCKXD0.net
>>41
chrome 拡張機能 スクレイピング
で検索すると良い
ちなみにyahooなんかはスクレイピング対策として、短時間で大量にアクセスすると一発で垢一時停止になるぞ
一番いいのはyahoo APIなどのAPIを使う事
48:デフォルトの名無しさん
21/09/16 20:21:31.16 3isIfw030.net
MacのOfficeソフトとRubyには期待するなって
死んだばあちゃんが言ってた
49:デフォルトの名無しさん
21/09/16 20:24:24.60 MqGeVsp10.net
Macには無料で今流行りのPythonがついているそうなので
スクレイピンクはそっちの方が遥かに簡単じゃないかな
ExcelVBA経験がないのなら
50:デフォルトの名無しさん
21/09/16 20:45:30.18 B6OYbZSR0.net
>>48
ばあちゃんハイカラやな
51:デフォルトの名無しさん
21/09/17 03:52:03.83 O1PoA15N0.net
Rubyist は、たいていMac
スクレイピングは、Ruby, Selenium Webdriver, Nokogiri だけど、
無断で、大量のスクレイピングすると、営業妨害で逮捕される
スクレイピングする際、そのサイトのrobots.txt を遵守しないといけない。
取得したデータは、CSV, JSON、データベースなどに保存する
今は、どの本でも、無断でスクレイピングする事は推奨しないと書いてある。
相手のサイトと契約して、API を使わしてもらうべき!
YouTube API とか、Google Maps API とか、
株式相場などもそう
52:デフォルトの名無しさん
21/09/17 11:36:45.56 D2cYhIKk0.net
>>41
なんでできもしないことやろうとすんのかね
検索してもわからないんじゃ無理だろ
53:デフォルトの名無しさん
21/09/17 12:01:52.56 Y3MPn8p/0.net
できないことをやらないと
いつまでたっても何もできないのだが、、、
54:デフォルトの名無しさん
21/09/17 18:44:11.62 xtR/7aZz0.net
>>29, 31
ありがとうございました。
55:デフォルトの名無しさん
21/09/17 20:27:29.50 ZtM+Yv2y0.net
見えないものを見ようとして望遠鏡を覗き込んだら捕まった事例
56:デフォルトの名無しさん
21/09/17 20:40:10.73 7ovEcO6ia.net
>>53
おまえが出来ないのは自業自得
57:デフォルトの名無しさん
21/09/17 22:49:29.45 DaER+3fZ0.net
前の定義で移動できるセルを登録したいのですが、アプリケーションの定義エラーがでます。
範囲は101カ所登録したいのですが、
58:どうやらstr*を3個くらい抜くと動くのですが、名前の定義に制限があるのでしょうか? str*はどこを抜いても同じです。 Dim stra As String, strb As String, strc As String, strd As String, stre As String, strf As String, strg As String stra = "=sh1!$H$3:$K$3,sh1!$N$3:$O$3,sh1!$R$3:$S$3," & _ "sh1!$E$6:$N$6,sh1!$O$6:$AC$6,sh1!$AD$6:$BG$6,sh1!$BH$6:$BR$6," & _ "sh1!$BS$6:$CG$6,sh1!$CH$6:$CQ$6,sh1!$CV$6:$DB$6,sh1!$DC$6:DR6," & _ "sh1!$DS$6:$EH$6,sh1!$EI$6:$ER$6,sh1!$ES$6:$FA$6,sh1!$FB$6:$FD$6," & _ "sh1!$FE$6:$FF$6,sh1!$FG$6:$FH$6,"
59:57
21/09/17 22:50:14.26 DaER+3fZ0.net
続き
strb = "sh1!$E$7:$N$7,sh1!$O$7:$AC$7,sh1!$AD$7:$BG$7,sh1!$BH$7:$BR$7," & _
"sh1!$BS$7:$CG$7,sh1!$CH$7:$CQ$7,sh1!$CV$7:$DB$7,sh1!$DC$7:DR7," & _
"sh1!$DS$7:$EH$7,sh1!$EI$7:$ER$7,sh1!$ES$7:$FA$7,sh1!$FB$7:$FD$7," & _
"sh1!$FE$7:$FF$7,sh1!$FG$7:$FH$7,"
strc = "sh1!$E$8:$N$8,sh1!$O$8:$AC$8,sh1!$AD$8:$BG$8,sh1!$BH$8:$BR$8," & _
"sh1!$BS$8:$CG$8,sh1!$CH$8:$CQ$8,sh1!$CV$8:$DB$8,sh1!$DC$8:DR8," & _
"sh1!$DS$8:$EH$8,sh1!$EI$8:$ER$8,sh1!$ES$8:$FA$8,sh1!$FB$8:$FD$8," & _
"sh1!$FE$8:$FF$8,sh1!$FG$8:$FH$8,"
strd = "sh1!$E$9:$N$9,sh1!$O$9:$AC$9,sh1!$AD$9:$BG$9,sh1!$BH$9:$BR$9," & _
"sh1!$BS$9:$CG$9,sh1!$CH$9:$CQ$9,sh1!$CV$9:$DB$9,sh1!$DC$9:DR9," & _
"sh1!$DS$9:$EH$9,sh1!$EI$9:$ER$9,sh1!$ES$9:$FA$9,sh1!$FB$9:$FD$9," & _
"sh1!$FE$9:$FF$9,sh1!$FG$9:$FH$9,"
stre = "sh1!$E$10:$N$10,sh1!$O$10:$AC$10,sh1!$AD$10:$BG$10,sh1!$BH$10:$BR$10," & _
"sh1!$BS$10:$CG$10,sh1!$CH$10:$CQ$10,sh1!$CV$10:$DB$10,sh1!$DC$10:DR10," & _
"sh1!$DS$10:$EH$10,sh1!$EI$10:$ER$10,sh1!$ES$10:$FA$10,sh1!$FB$10:$FD$10," & _
"sh1!$FE$10:$FF$10,sh1!$FG$10:$FH$10,"
60:デフォルトの名無しさん
21/09/17 22:50:45.98 DaER+3fZ0.net
続き
strf = "sh1!$E$11:$N$11,sh1!$O$11:$AC$11,sh1!$AD$11:$BG$11,sh1!$BH$11:$BR$11," & _
"sh1!$BS$11:$CG$11,sh1!$CH$11:$CQ$11,sh1!$CV$11:$DB$11,sh1!$DC$11:DR11," & _
"sh1!$DS$11:$EH$11,sh1!$EI$11:$ER$11,sh1!$ES$11:$FA$11,sh1!$FB$11:$FD$11," & _
"sh1!$FE$11:$FF$11,sh1!$FG$11:$FH$11,"
strg = "sh1!$E$12:$N$12,sh1!$O$12:$AC$12,sh1!$AD$12:$BG$12,sh1!$BH$12:$BR$12," & _
"sh1!$BS$12:$CG$12,sh1!$CH$12:$CQ$12,sh1!$CV$12:$DB$12,sh1!$DC$12:DR12," & _
"sh1!$DS$12:$EH$12,sh1!$EI$12:$ER$12,sh1!$ES$12:$FA$12,sh1!$FB$12:$FD$12," & _
"sh1!$FE$12:$FF$12,sh1!$FG$12:$FH$12"
ActiveWorkbook.Names.Add Name:="Nyuryoku2", RefersToLocal:=stra & strb & strc & strd & stre & strf & strg
61:デフォルトの名無しさん
21/09/17 23:08:43.51 VKkEr3i80.net
255文字
62:デフォルトの名無しさん
21/09/17 23:31:47.79 4pHWHBC6H.net
>>57
1274文字まで
質問のために加工したんでなければ、その範囲はもっとシンプルにまとめられるぞ
"=$H$3:$K$3,$N$3:$O$3,$R$3:$S$3,$E$6:$CQ$12,$CV$6:$FH$12"
63:57
21/09/18 09:25:55.38 85XqBE5T0.net
>>61
ありがとうございます。シート名を削除したら動きました
64:デフォルトの名無しさん
21/09/18 09:39:13.68 iFpkyoTBa.net
>>62
横から失礼
RangeはUnionにすると実質文字制限がなくなる
65:デフォルトの名無しさん
21/09/18 10:16:04.89 jMbZYEP4H.net
>>63
引数はRangeじゃなくてStringなんよ
66:デフォルトの名無しさん
21/09/18 12:10:53.45 vNZ9H73d0.net
名前定義ってRangeオブジェクトからでもできるのか 知らなかった
Range("B1:G10").Name = "Nyuuryoku2"
67:デフォルトの名無しさん
21/09/18 12:26:09.80 FfOi19ZE0.net
便利だけどExcelの名前の定義ウインドウは使いにくすぎる
68:デフォルトの名無しさん
21/09/18 12:26:47.71 FfOi19ZE0.net
つまりたくさん定義すると管理しにくいんだよな
69:デフォルトの名無しさん
21/09/18 16:41:01.37 vNZ9H73d0.net
名前の管理を簡単にする便利なアドインって誰か作ってないの?
(とおねだり)
70:デフォルトの名無しさん
21/09/18 18:23:53.93 B91oASHcM.net
簡単の意味を定義してくれれば俺が作ってやるよ。
71:デフォルトの名無しさん
21/09/18 18:33:26.51 y+KnaSW50.net
表形式ならテーブルでOK
名前の定義使わなくても
72:デフォルトの名無しさん
21/09/18 18:45:25.50 +/kaLHzEM.net
>>69
俺が思った通りに名前を定義してくれて、不要な名前は勝手に知らない間に削除してくれるとかかな
当然 >>57-59 ⇒ >>61 程度の変換は自動でやる
73:デフォルトの名無しさん
21/09/18 18:49:07.44 FfOi19ZE0.net
ちょっとぐぐったけど
NamesコレクションをForEachで回してユーザーフォームにでも表示させれば作れそうだな
74:デフォルトの名無しさん
21/09/19 00:12:03.29 zQBxj3q40.net
>>71
めちゃくちゃ簡単だな。任せとけ。
75:デフォルトの名無しさん
21/09/19 05:13:48.14 AGA6cOjvM.net
おう、頼んだぞ
76:デフォルトの名無しさん
21/09/19 10:09:24.37 IfToBfi40.net
Internet Explorer_Serverのハンドルから取得したIHTMLDocumentオブジェクトではそのページ内での操作はできましたが
Navigate実行時にメソッドをサポートしていないというエラーになります
別のURLへ移動する方法ありますか?
77:デフォルトの名無しさん
21/09/19 12:24:27.96 jno0wMDOH.net
>>75
たぶんメソッドの使い方が間違ってる
デバッグしてやるからコード晒してみ
78:デフォルトの名無しさん
21/09/19 12:45:26.42 /yxUr6Cya.net
IEのオプションでcssの設定を変える
79:デフォルトの名無しさん
21/09/19 14:05:15.93 IfToBfi40.net
>>76
検証中のためハンドルも直接入力してますし
コードも他のサイトの転用したものだったりかなり端折ってますが
何か解りましたらよろしくお願いします
Private Declare PtrSafe Function CLSIDFromString Lib "ole32" (ByVal pString As LongPtr, ByRef pCLSID As Currency) As Long
Private Declare PtrSafe Function RegisterWindowMessageW Lib "user32" (ByVal lpString As LongPtr) As Long
Private Declare PtrSafe Function SendMessageTimeoutW Lib "user32" (ByVal hWnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByRef lParam As LongPtr, ByVal fuFlags As Long, ByVal uTimeout As Long, ByRef lpdwResult As Long) As LongPtr
Private Declare PtrSafe Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, ByRef riid As Currency, ByVal wParam As LongPtr, ppvObject As Any) As Long
Private Enum SMTO
NORMAL = 0
BLOCK = 1
ABORTIFHUNG = 2
NOTIMEOUTIFNOTHUNG = 8
End Enum
Sub test()
Dim hWnd As Long
hWnd = 136698
Set objDoc = GetHtmlDocument(hWnd)
'objDoc.Navigate ("URLリンク(www.google.co.jp))
'Googleの検索窓に入力
objDoc.getElementsByName("q")(0).Value = "test"
End Sub
80:デフォルトの名無しさん
21/09/19 14:06:52.91 IfToBfi40.net
続き
Public Function GetHtmlDocument(ByVal hWnd_InternetExplorer_Server As LongPtr, Optional ByVal uTimeout As Long = 1000, Optional ByVal documentVersion As Integer = 1) As Object ' As MSHTML.IHTMLDocument
Set GetHtmlDocument = Nothing
If documentVersion <= 0 Then
documentVersion = 1
ElseIf documentVersion >= 8 Then
documentVersion = 8
End If
Dim IID_IHTMLDocumentX As String
IID_IHTMLDocumentX = Split(",{626FC520-A41E-11cf-A731-00A0C9082637},{332c4425-26cb-11d0-b483-00c04fd90119},{3050f485-98b5-11cf-bb82-00aa00bdce0b},{3050f69a-98b5-11cf-bb82-00aa00bdce0b},{3050f80c-98b5-11cf-bb82-00aa00bdce0b},{30510417-98b5-11cf-bb82-00aa00bdce0b},{305104b8-98b5-11cf-bb82-00aa00bdce0b},{305107d0-98b5-11cf-bb82-00aa00bdce0b}", ",")(documentVersion - 1)
Dim InterfaceId(1) As Currency
Call CLSIDFromString(StrPtr(IID_IHTMLDocumentX), InterfaceId(0))
Dim lngMsg As Long
lngMsg = RegisterWindowMessageW(StrPtr("WM_HTML_GETOBJECT"))
If lngMsg <> 0 Then
Dim lpdwResult As Long
If SendMessageTimeoutW(hWnd_InternetExplorer_Server, lngMsg, 0, 0, SMTO.ABORTIFHUNG, uTimeout, lpdwResult) <> 0 Then
Dim hResult As Long
hResult = ObjectFromLresult(lpdwResult, InterfaceId(0), 0, GetHtmlDocument)
If hResult <> 0 Then
Err.Raise hResult
End If
End If
End If
End Function
81:デフォルトの名無しさん
21/09/19 14:13:18.62 qcTxghfBM.net
gethtmldocumentにnavigateあるのか?
82:デフォルトの名無しさん
21/09/19 21:14:40.95 +Er1+t3H0.net
navigateじゃなくてcreateDocumentFromUrlじゃないの?
知らんけど
83:デフォルトの名無しさん
21/09/20 00:12:39.27 wP8fgZ+m0.net
A1からA10000にデータが有って検索したい文字列があったとする。
この場合,範囲をdictionaryで調べるのと配列で調べるのは速度は同じぐらい??
84:デフォルトの名無しさん
21/09/20 00:16:46.79 GQS+gMma0.net
なぜ自分で試さないのか
85:デフォルトの名無しさん
21/09/20 02:45:51.50 KDTpyD+cH.net
>>82
データがセルに入ってるならワークシート関数使った方が速い
86:デフォルトの名無しさん
21/09/20 10:43:06.46 wP8fgZ+m0.net
えっ?そうなの??
87:デフォルトの名無しさん
21/09/20 10:44:41.60 wP8fgZ+m0.net
試しましたが、
コードはdictionaryのほうがすっきりした。
体感速度はあまり変わりませんでした。
88:デフォルトの名無しさん
21/09/20 10:54:05.02 9E+2eMtE0.net
かまってちゃんかよ
天気いいから散歩でもしてこいよ
89:デフォルトの名無しさん
21/09/20 11:55:16.12 djFT0hLf0.net
コード醸せよ
90:デフォルトの名無しさん
21/09/20 12:03:32.94 DYg0tonqd.net
A・オリゼー
91:デフォルトの名無しさん
21/09/20 12:27:59.43 lHEjG93V0.net
xxとyyどっちが早い、というのは本当に試した方が早い
バージョンアップで最適化されて、すげー早くなってる事がある
92:デフォルトの名無しさん
21/09/20 12:51:40.86 3QXihmxB0.net
>>87
別にかまってちゃんじゃなくて、回答に信頼性がないから自分で試したんだろう。誰かが信頼できそうな回答をくれたんだったら試さないと思うぞ。
93:デフォルトの名無しさん
21/09/20 13:12:45.31 26+LHXKYM.net
ちゃんと結果まで書き込んでるんだから
質問だけしていなくなるやつもいる中で、優秀だと思うよ
94:デフォルトの名無しさん
21/09/20 15:29:06.41 Ijs9yUmJM.net
>>86
まずはありがとうございました、だろ
うぜー帰れ
95:デフォルトの名無しさん
21/09/20 15:32:05.91 3QXihmxB0.net
>>93
お前何代表者みたいな顔して怒ってんだよ、とチャチャを入れてみる(笑)
96:デフォルトの名無しさん
21/09/20 16:38:36.67 my+lQwjla.net
イヤ
マジで>>86はウザいわ
2度と来るな
97:デフォルトの名無しさん
21/09/20 16:58:36.07 djFT0hLf0.net
スルー力がない奴もセットて消えろ
98:デフォルトの名無しさん
21/09/20 17:03:04.82 3QXihmxB0.net
>>96
お前もスルーしないと
99:デフォルトの名無しさん
21/09/20 17:07:29.03 FEM4xU2r0.net
子供か
100:デフォルトの名無しさん
21/09/20 17:16:52.36 3QXihmxB0.net
>>98
スルー力、言うのは易し、行うのは難し、を指摘しているだけ。
もう一ついいか?
人の振りして我が振り直せ(笑)
101:デフォルトの名無しさん
21/09/20 17:48:58.56 9E+2eMtE0.net
一番スルーしてない人が言うと説得力ある!
102:デフォルトの名無しさん
21/09/20 18:05:45.62 Mz1RekPdr.net
モジュールとボタンを別のブックにコピーしたくてできたと思ったんだけど
ボタンに登録されるマクロがコピー元のマクロになっちゃってとうすりゃええのか分からん
.OnAction=Thisbook&”マクロ名”とかじゃ動かないのね
103:デフォルトの名無しさん
21/09/20 18:30:41.29 aa1o0gq5a.net
それコピーじゃなくてインポートしろよ
104:デフォルトの名無しさん
21/09/20 18:40:40.67 FEM4xU2r0.net
>>99
寂しいのか?
105:デフォルトの名無しさん
21/09/20 21:44:55.52 djFT0hLf0.net
ボタンをインポート?
これも楽な方法があったらいいのにね
106:デフォルトの名無しさん
21/09/20 21:51:19.19 lHEjG93V0.net
シート上のフォームコントロールを消す時って
・右クリックで選択
・コンテキストメニューをESCで消す
・切り取り、もしくは「deleteキー」
で合ってますか?
選択する時はF5キーのオブジェクトでもいいんですけど、
どちらにしろ右クリックで選択というのが何か気持ち悪い
107:デフォルトの名無しさん
21/09/20 21:58:02.93 lHEjG93V0.net
>>101
sheetモジュールのマクロ?
それとも標準モジュールのマクロ?
どちらによるかでやり方が変わる
108:デフォルトの名無しさん
21/09/20 21:58:44.81 djFT0hLf0.net
Ctrl+クリック
Delete
でいいんじゃない
109:デフォルトの名無しさん
21/09/20 22:10:20.73 lHEjG93V0.net
>>107
短縮できました、ありがとうございました
110:デフォルトの名無しさん
21/09/21 16:59:19.72 6V+SG26ea.net
private subのどのプロシージャーからでも、グローバル変数に入った値を取り出す方法として、
たとえばenvという標準モジュールを作り、そのなかで
public dim grobal_a as string
sub hoge
global_a = "aaaa"
end sub
とやっておき、
エクセルのブック起動と同時にこの初期値を入れておきたいので
thisWorkbookにcall hoge
ってやるの、普通?
111:デフォルトの名無しさん
21/09/21 18:19:02.19 Qqw1uu/Y0.net
>>106
標準モジュールのマクロですー…
112:デフォルトの名無しさん
21/09/21 19:19:53.65 Bwxe0pHra.net
>>110
シートに標準モジュールのやつを呼び出すSubを書いて、それをボタンから呼び出せばいい
113:デフォルトの名無しさん
21/09/21 20:47:40.27 bgKjXBpU0.net
>>109
まず変数のスコープ覚えようね
114:デフォルトの名無しさん
21/09/21 21:06:44.82 0m2xZsmF0.net
>>109
普通は grobal_a と global_a の二つを一つにまとめると思う
115:デフォルトの名無しさん
21/09/21 21:13:59.43 pV6hI0Vx0.net
>>110
全シートを選択してカットペーストでいけるだろ、と思ったら無理だった
VBEをVBAで動かすしか無いと思う。
URLリンク(jizilog.com)
URLリンク(officetanaka.net)
116:デフォルトの名無しさん
21/09/21 21:29:23.86 pV6hI0Vx0.net
>>109
vbaってグローバル変数の初期化できないのか・・・
見たことはない。変な気はする
とりあえずはシートに書くほうが楽だと思う
constでいいなら初期化が出来る。社名みたいにほぼ絶対変わらない物ならこれでもいいかも
Public Const 定数 = 1
sub foo
debug.print 定数
end sub
>>113
わらった
117:デフォルトの名無しさん
21/09/22 07:59:00.83 ucS/NBRX0.net
>>109
普通か普通ではないか、と言われれば普通ではないかなぁ。
ではどこが、と言われるとまずモジュール変数をグローバル指定しているところはPrivateにして外部から呼び出す用のプロパティに組み込む。これでどこかで値が変更されてもブレイクポイント仕掛けてどこで呼び出されて値が変更されたかを確認出来るようになる。
あと、初期化用の関数はPublic指定にしておかないと別のモジュールから呼び出せないよ。ThisWorkbookから呼び出すんでしょ?
118:デフォルトの名無しさん
21/09/22 08:55:25.77 h9k7055fM.net
ありがとうございます
119:デフォルトの名無しさん
21/09/22 08:56:23.60 h9k7055fM.net
constやってみます
120:デフォルトの名無しさん
21/09/22 11:22:09.41 QukUYkwCa.net
普通じゃなかったのか…俺もそうしてた
>>116
勉強になります
121:デフォルトの名無しさん
21/09/22 15:13:16.34 XBxd6ZoY0.net
書籍「イヤンもう!最初からそう教えてくれればいいのに!ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本」の評判はどうですか?買うか検討中なのですが。
122:デフォルトの名無しさん
21/09/22 19:17:45.16 igHuaWyKa.net
>>120
ゼッタイにわかる本系の口語調文章に抵抗がないラノベ好きには良いんじゃない?
123:デフォルトの名無しさん
21/09/22 19:18:09.88 igHuaWyKa.net
>>120
ゼッタイにわかる本系の口語調文章に抵抗がない人には良いんじゃない?
124:デフォルトの名無しさん
21/09/22 19:19:18.20 igHuaWyKa.net
なにこのエラー去勢された
125:デフォルトの名無しさん
21/09/22 19:35:51.24 wAf2i/6rH.net
>>120
人それぞれ印象が違うから、参考書は最初の2、3ページ立ち読みして自分で決めるのがいいよ
126:デフォルトの名無しさん
21/09/22 20:05:10.79 anCt84pS0.net
イヤンもう
って言うから検索したら特にそんな単語ついてないじゃないですか
127:デフォルトの名無しさん
21/09/22 21:46:48.06 Th7N/2yOd.net
URLリンク(i.imgur.com)
128:デフォルトの名無しさん
21/09/22 22:05:18.59 anCt84pS0.net
若い子が水着姿で教えるVBAの本なら簡単に死ぬほど売れるのでは?と思った
129:デフォルトの名無しさん
21/09/22 22:14:11.23 ER/2UqvV0.net
そもそもVBA自体がオッサン臭い言語
130:デフォルトの名無しさん
21/09/22 22:16:41.63 cVN8rRFZM.net
そもそも5ch自体がオッサン臭い場所
131:デフォルトの名無しさん
21/09/22 22:21:20.29 RvuuvfBjM.net
そもそもオッサンしかいない
132:デフォルトの名無しさん
21/09/22 23:01:12.21 LAnicbtO0.net
VBAとか作業記録してそれループするなり可変したりするなりちょっと直せば誰でも作れるからな
133:デフォルトの名無しさん
21/09/22 23:14:36.78 jBUNeyMwa.net
「はたらくプログラミング 」
「高校生からはじめる プログラミング」
「メイクロックマン 史上最大のプログラミング」
「独学プログラマー Python言語の基本から仕事のやり方まで」
のようなアニメやゲームキャラやイケメンを
採用して若い子にアピールするとか
「乙女チック4Gamer」第267回:
「推しと学べるプログラミング」
初心者も学べるプログラミング学習ゲーム
とか
美少女×プログラミング学習×ソーシャルゲーム『コードガールこれくしょん』
とかゲームで呼び込み
恋のプログラミング~ダメ男の見分け方~ DVD-BOX2
のようなDVDを付録に付けてみたりとか
とかとにかくVBAもなんとか頑張って欲しい
134:デフォルトの名無しさん
21/09/22 23:55:17.87 ToEmXEKY0.net
オレも1冊3000円くらいのVBAの本買ったわ
その本をキーボードの下奥に置くと角度が良い感じになるんだわ
手首が疲れないし、職場でもなんか「やってる」感がかもし出せるし、本当に買って良かったと思える1冊だったな
135:デフォルトの名無しさん
21/09/23 00:25:56.19 1QHTb9H7a.net
全国フェミニスト議員連盟が半泣き←いまここ
URLリンク(www.tokyo-np.co.jp)
136:デフォルトの名無しさん
21/09/23 00:27:06.21 4aFmMHLK0.net
>>132
ん。
昔、EXCELVBAゲーム大作戦とかいう本が出てたよ。まぁVBAも昔からあるからゲーム作るのも先駆者がいたんだね。
けど、結局難しいというか、お仕事で覚えることとベクトルが違うんだよ。1/60秒単位で押されているキーの値読み取って、キャラクターや地形描いてその当たり判定行なっ�
137:スりね。 まぁ暇でそういうの作ってみたいというのにはいいかもだけど、お仕事でVBA使うのの興味を持つために、というのにはちょっと重いかもね。
138:デフォルトの名無しさん
21/09/23 00:56:08.87 O9y54sVl0.net
>>133
分かりすぎる
分厚い本って意外と重宝するよなw
139:デフォルトの名無しさん
21/09/23 00:59:12.19 O9y54sVl0.net
vbaでゲームは基本的にかなりめんどくさい
メインのループ処理がキツイ
定期的に処理をエクセルに返してあげないと色々と不具合が起きる
曲芸でなければvbaで作るのは絶対に避けたほうが良い
140:デフォルトの名無しさん
21/09/23 09:34:39.93 MTBJM7920.net
2つあるフレームの位置を調整していたら、
フレームAをフレームBの中にドラッグしてしまったらしく、
2つのフレームが一緒になってしまいました。
プロパティウィンドウを見ると、フレームAはまだ存在するのですが、
画面上にはフレームBしか表示されていないため、Aを選択することができず、
AをBから分離することができません。
AのLeftやTopを変更してみましたが、画面上に変化はありませんでした。
何かいい解決法があれば教えてください。
141:デフォルトの名無しさん
21/09/23 09:39:09.54 MTBJM7920.net
自己解決しました。
①プロパティウィンドウでプルダウンからフレームAを選択する。
②Ctrl+[A]で全選択した後、Ctrl+[X]で切り取り状態にする。
③フレームBのエリア外にマウスカーソルを持っていき、Ctrl+[V]で貼り付ける。
142:デフォルトの名無しさん
21/09/23 11:52:58.11 O9y54sVl0.net
おめ~^^
143:デフォルトの名無しさん
21/09/23 13:11:17.06 cmFu96z6a.net
>>139
たった5分も考える事が出来んのか
144:デフォルトの名無しさん
21/09/23 13:48:48.21 tEWlRRfOM.net
せっかく解決策書いてくれてるのにイチャモンつけるバカって何を考えてるんだろ…
145:デフォルトの名無しさん
21/09/23 13:53:17.23 DsLS3pBM0.net
ただの寂しがり屋の暇つぶしとか
146:デフォルトの名無しさん
21/09/23 13:59:57.49 5gST2jZHM.net
黙って去るやつよりよっぽどいいんだが
147:デフォルトの名無しさん
21/09/23 14:03:41.04 F4JAOFkVr.net
配列からグラフを書いたときってデータ数の上限はありますか?
その場合どのように対処すれば良いですか?
148:デフォルトの名無しさん
21/09/23 14:08:33.29 KMctW7zL0.net
>>145
上限を気にするようなデータ数だったら
excelでは重くて動かないと思う
別の言語で書いた方がいい
149:デフォルトの名無しさん
21/09/23 14:45:47.29 gN04ENXIM.net
>>145
その場合はデータをコンパクトにまとめるしかなくね
150:デフォルトの名無しさん
21/09/23 14:47:47.80 dUOklB1+M.net
>>145
数千個程度は描けたような記憶がある
そもそもそのレベルだと個々の値は見えないから複数個まとめて平均取るとかしてデータ量を減らせばいいかと
151:デフォルトの名無しさん
21/09/23 15:12:01.32 AtVLca4O0.net
系列数に上限がいかにもありそう 255とか
152:デフォルトの名無しさん
21/09/23 15:22:04.38 AtVLca4O0.net
>>145
上限なしだって
URLリンク(support.microsoft.com)
これスレのテンプレに入れといてほしい
153:デフォルトの名無しさん
21/09/23 18:38:01.80 rxtBh7Jj0.net
>>145
セルに適当なデータいれてグラフ作ったら 9万9千9百+α までしか表示されなかった
メモリの問題かもしれん
154:デフォルトの名無しさん
21/09/23 18:52:18.65 c0lh6Lzfr.net
ごめんなさい
セルからではなく配列から直接グラフを読み込むときの話です。
自分の場合配列から散布図書いてて
データ数が15000?あたりから表示されなくなったので
155:デフォルトの名無しさん
21/09/23 20:46:47.80 rxtBh7Jj0.net
だからメモリ少ないんじゃね
156:デフォルトの名無しさん
21/09/24 16:28:38.47 GLO6/yx90.net
VBAで、リボンを常に表示させるてことできるんですか?
ググると
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"
ていうのが出てくるんですが、
”タブとコマンドの表示”ていう状態にしたい。
157:デフォルトの名無しさん
21/09/24 18:53:45.39 towOKsyE0.net
If Application.CommandBars.GetPressedMso("MinimizeRibbon") = True Then
Application.CommandBars.ExecuteMso "MinimizeRibbon"
End If
158:デフォルトの名無しさん
21/09/25 02:37:13.36 p3qnNTxE0.net
>>155
おおサンクスww
できた。
なんでリボンの表示・非表示の記事書いてるやつはここまで書かないのかね。
159:デフォルトの名無しさん
21/09/25 06:01:58.81 A2HuAdJq0.net
なんでだと思う?
160:デフォルトの名無しさん
21/09/25 07:24:00.70 i7f0lbxJ0.net
しっかりと自分で考える事が大事!向上心をもって勉強しよう!
161:デフォルトの名無しさん
21/09/25 07:50:31.86 xUBmE3KO0.net
ひろゆきのクラスモジュールの説明は的確で分かりやすかった
162:デフォルトの名無しさん
21/09/25 07:51:02.02 xUBmE3KO0.net
クラスモジュールというよりはオブジェクト指向か
163:デフォルトの名無しさん
21/09/25 13:59:25.45 QZokVoY5p.net
このスレにはクラスとかオブジェクト指向とかいうと、ファビョって「マウント取りに来たー!!」とか騒ぐじじいがいるから気をつけた方がいいぞ
164:デフォルトの名無しさん
21/09/25 14:23:54.16 ADwaIx4kM.net
5chはじじいの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。
165:デフォルトの名無しさん
21/09/25 15:09:26.96 kjOWSdg4a.net
>>161
聞く方もじじいだし
166:デフォルトの名無しさん
21/09/25 22:54:03.42 /8ShLWKPp.net
エクセル詳しい方にご質問。
保護シートの「オートフィルター使用」にチェックつけてる状態で、
Range(Cells(1,1),Cells(1,5)).AutoFilterを実行すると保護解除しろと言われるのですが、原因わかりますか?
Rangeで指定しているセル範囲の保護を外しても言われる始末。
オートフィルターの使用を許可すりゃ通るもんだと思ってました。
見えない仕組みとか、基本的な仕様を見逃してるんかなぁ…
167:デフォルトの名無しさん
21/09/25 23:52:15.96 wPvtJ2EG0.net
>>164
オートフィルターのオンオフはできないのが仕様だな
URLリンク(support.microsoft.com)
注: ユーザーは、この設定に関係なく、保護されたワークシートでオートフィルターを適用または削除できません。
168:デフォルトの名無しさん
21/09/26 00:17:38.53 BPwZjS350.net
とあるフォルダへのショートカットを作成する方法を調べたところ、
コーディング前に、
>参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
>これでWshShellクラスとWshShortcutクラスを利用できるようになります。
という記述がありました。
それで作れそうですが、
作った.xlsmファイルを他人に渡した場合、
その相手が上記の参照設定をしていない環境だったとしても、ショートカットの作成は行えますか?
169:デフォルトの名無しさん
21/09/26 00:44:49.64 vU9Y5LAHp.net
>>165
ご回答頂きありがとうございます。
こういう基本的な説明くらい最初から見とけって話でしたね。
しかし、シートの保護とAutoFilterを両立できないとは、痒いところに手が届かない仕様ですな。
170:デフォルトの名無しさん
21/09/26 01:37:23.16 O844yIU50.net
>>167
オートフィルターON/OFFと同時にシートの保護/解除も書いてしまえばいいんでないの?
171:デフォルトの名無しさん
21/09/26 01:39:32.52 BPwZjS350.net
>>166
自己解決しました。
参照設定を変更しなくてもショートカットの作成は可能でした。
そちらの方法にします。
URLリンク(excel-ubara.com)
172:デフォルトの名無しさん
21/09/26 01:46:25.94 BPwZjS350.net
ちなみに、
①参照設定で「Windows Script Host Object Model」をONにする。
②WshShellクラスとWshShortcutクラスを利用してコーディングする。
③プログラムを実行する。
④ショートカットの作成に成功する。
⑤参照設定で「Windows Script Host Object Model」をOFFにする。
⑥プログラムを実行する。
⑦ショートカットの作成に失敗する。(②の中の定義について「ユーザ定義型は定義されていません」のエラー)
となったので、
>>166については、相手にも参照設定をしてもらわないとショートカットの作成は行えない、ということだと思います。
173:デフォルトの名無しさん
21/09/26 01:51:41.55 vU9Y5LAHp.net
>>168
確かに、仰る通りですね。
保護は事前に設定しておくものと勝手に思い込んでいました。
一番良い形で解決できそうです。ありがとうございます。
174:デフォルトの名無しさん
21/09/26 15:56:59.18 ynzNBMLj0.net
>>170
参照設定した内容はそのエクセルファイルに保存されてる
エクセルファイルを渡した先でその参照設定がちゃんと動くなら動く
175:デフォルトの名無しさん
21/09/26 18:28:19.91 6z2Q/VJPM.net
二次元配列の第三カラムが重複していたらレコードまるごと排除して、かつ排除された分のレコードを別シートに転記することってできます?
連想配列に入れておけば重複してたらわかるようになるけど、そういう方法ってまとも?
176:デフォルトの名無しさん
21/09/26 18:29:58.19 Fsa0c3oL0.net
第三限定なの?
177:デフォルトの名無しさん
21/09/26 19:28:17.19 HYuUGx6O0.net
できるかどうかではなく、そういう処理を作りたいんじゃないの?
178:デフォルトの名無しさん
21/09/26 21:42:42.58 hcQxkCQHM.net
配列とレコードとシートの区別ない人だね
179:デフォルトの名無しさん
21/09/26 23:35:14.87 ISHRJ32V0.net
そういう方法で重複チェックをしたことはあるけど
それがまともかと聞かれるとわからんなぁ
180:デフォルトの名無しさん
21/09/27 17:52:26.41 wG/2iXK70.net
配列は要素数が増減するものには向いてない
が、まあいろいろ頑張ればできる
連想配列でわかるのは、入れようとしたときに重複するかどうかで、そもそも重複したものは入っていないだろ
181:デフォルトの名無しさん
21/09/27 21:07:52.71 9JOCRyj50.net
>配列は要素数が増減するものには向いてない
「vbaの」配列な
他の言語にはpushとか色々便利なものがあるんやで
182:デフォルトの名無しさん
21/09/27 21:09:45.06 1fIlBTl00.net
Excelにはセルっていう使いやすい2次元配列があるからな
速度はご愛嬌
183:デフォルトの名無しさん
21/09/27 23:17:35.36 9JOCRyj50.net
シート入れれば三次元やぞ
184:デフォルトの名無しさん
21/09/28 06:06:35.41 NhFpYAOsM.net
>>179
> 他の言語にはpushとか色々便利なものがあるんやで
スクリプト言語とかだろそれ
言語自体の機能として配列のサイズを変えられる言語はそんなに多くないよ
そもそもVBAはその多くない言語に含まれるし
185:デフォルトの名無しさん
21/09/28 11:35:58.86 mkxQja700.net
無いものねだりしてもしょうがない
そもそも他言語やっててVBAやった場合
ない機能をどうやって実装するか考えるのが
醍醐味なんだから
186:デフォルトの名無しさん
21/09/28 12:14:47.38 fFhZgLlN0.net
>>182
実はVBAは「配列」のサイズを変えれる数少ない言語
まあ多分全コピー発生
187:してるんだろうけど コレクション系が弱いからそれぐらいできんとかなりツラい 今なら.NETの使うとか出来るけど
188:デフォルトの名無しさん
21/09/28 13:45:05.92 T/P4fEdFM.net
>>184
> コレクション系が弱いからそれぐらいできんとかなりツラい
どこが弱いの?
189:デフォルトの名無しさん
21/09/28 15:11:07.44 8+n9QyO8M.net
今の時代、メモリなんてたくさん確保しておけばよくね
190:デフォルトの名無しさん
21/09/28 15:43:04.78 ZLV/p08A0.net
「たくさん」と言ったってワークステーションやサーバ系のハードウェアでない限りせいぜい64GBか128GBが上限では?
191:デフォルトの名無しさん
21/09/28 15:46:57.39 9IVurO/LM.net
お、おう
192:デフォルトの名無しさん
21/09/28 16:43:48.67 yyyanN8B0.net
64KBまでだよ
193:デフォルトの名無しさん
21/09/28 16:48:32.26 vws8rDV40.net
VBA(Excel)にそんなメモリ使わせたらヒヤヒヤしちゃう
194:デフォルトの名無しさん
21/09/28 17:35:37.46 Fgmzo9M90.net
long配列の下位16ビットにデータ格納されている
long[0],[1]の下位16ビットを結合するとsingleの値となる
(要はsingleが16ビット分割されてlong型に格納されている)
こんなデータが大量に格納されるんですが、上手く結合して型変換する方法がわかりません。。
val("&H" & hex(long(1)) & hex(long(0)))
で32ビット結合はできましたが、その後の暗黙的な変換なしでsingleに変更するにはどうするのが良いでしょうか?
195:デフォルトの名無しさん
21/09/28 18:37:14.39 nfdxFkKa0.net
リアルタイムにやる必要が無いならバイナリでファイルに書いて
Singleで読むとか出来そうな気がする。
同じ考え方でADODB.stremも使えそう。
196:デフォルトの名無しさん
21/09/28 20:20:03.83 chK2kmIxd.net
>>191
禁じ手だけどユーザー定義型とLSetで変数の中身を型変換せずに直接コピーできる
LongをSingleにコピーする例
Type TypeLong
varLong As Long
End Type
Type TypeSingle
varSingle As Single
End Type
Sub Long2Single()
Dim myLong As TypeLong
Dim mySingle As TypeSingle
LSet mySingle = myLong
End Sub
197:デフォルトの名無しさん
21/09/28 21:06:13.76 mkxQja700.net
>>191
ん?
今一つよく分からんけど、CSng使って明示的に変換すればいいんじゃないの?
Sub Convert()
Dim originalValue(1) As Long
Dim convertSingle As Single
originalValue(0) = 1
originalValue(1) = 3
convertSingle = CSng(CDbl(originalValue(0) And 65535)) * 65536 + (originalValue(1) And 65535)
Debug.Print convertSingle
End Sub
こんな感じに。
オーバーフローして表示しきれなくなった分は知らんけど。
198:デフォルトの名無しさん
21/09/28 21:56:37.27 mkxQja700.net
おっと、すまんこ
括弧の位置間違えてた
Option Explicit
Sub Convert()
Dim originalValue(1) As Long
Dim convertSingle As Single
originalValue(0) = 7
originalValue(1) = 15
convertSingle = CSng(CDbl(originalValue(0) And 65535) * 65536 + (originalValue(1) And 65535))
Debug.Print convertSingle
End Sub
こうかな。
因みにビット扱っているなら説明すると失礼に当たるかもだけど、
65535は16進で&HFFFF、65536は16進で&H10000ね。
ANDは論理演算子ではなくてビット演算子。
199:デフォルトの名無しさん
21/09/29 02:45:23.84 DNRsGaHg0.net
>>191
SingleもLongも32ビット長なんだが、Singleの内部形式が分割されて二つのLongに16ビットずつ格納されているのか?
なんでそんなことになってるんだよ。Integer二つでいいじゃないか
考え方としては>>193さんの言う通りLSetでできる
二つのLongから有効な32ビット抜き出すのが手間だけど
Singleの内部形式はIEEE 754のはずだから、自分でビット演算してもできるだろうけど
200:デフォルトの名無しさん
21/09/29 02:50:45.14 DNRsGaHg0.net
とりあえず作ってみた
エンディアンの呪いがかかってても知らんw
Type TypeQByte
varByte1 As Byte
varByte2 As Byte
varByte3 As Byte
varByte4 As Byte
End Type
Type TypeLong
varLong As Long
End Type
Type TypeSingle
varSingle As Single
End Type
Function WLong2Single(ByVal long1 As Long, ByVal long2 As Long) As Single
Dim myLong1 As TypeLong
Dim myLong2 As TypeLong
Dim myQByte As TypeQByte
Dim tmpQByte As TypeQByte
Dim mySingle As TypeSingle
myLong1.varLong = long1
myLong2.varLong = long2
LSet tmpQByte = myLong1
myQByte.varByte1 = tmpQByte.varByte3
myQByte.varByte2 = tmpQByte.varByte4
LSet tmpQByte = myLong2
myQByte.varByte3 = tmpQByte.varByte3
myQByte.varByte4 = tmpQByte.varByte4
LSet mySingle = myQByte
WLong2Single = mySingle.varSingle
End Function
201:デフォルトの名無しさん
21/09/29 03:32:54.18 hT//j47fd.net
VBAには共用体もポインタもないから、
LSetでメモリの内容をコピー
バイナリファイル経由
IEEEの内部フォーマットに合わせてゴリゴリ計算
ぐらいしか思い付かん
この中ではLsetが一番シンプルだし高速
上位、下位の順番が分からんから適当に書くけど、基本的にはこんな感じ
MyLong = Long0 * &h10000 + Long1
Lset MySingle = MyLong
C#とか使えばもっと簡単にできるんで、そもそもこの作業はVBAに向いてない
202:デフォルトの名無しさん
21/09/29 04:17:58.49 DNRsGaHg0.net
>>198
それ符号ビットの問題があるぞ
VBAには論理シフトとかないからな
バイナリファイルにするにしても、Longの不要な16ビット捨てる方法考えんといかん
203:デフォルトの名無しさん
21/09/29 05:23:25.92 HULqg2bxd.net
符号ビット対策
64bit限定ならLongLong型を経由すればもっと簡単になるのか?どう書けばいいのかわからんけど
Dim MSB As Long
MSB = (Long0 And &H8000) And &H80000000
MyLong = MSB Or ((Long0 And &H7FFF) * &H10000 + Long1)
204:デフォルトの名無しさん
21/09/29 05:43:02.15 ia9ebpqvd.net
訂正
MSB = ((Long0 And &H8000) <> 0) And &H80000000
205:デフォルトの名無しさん
21/09/29 08:25:13.60 slA14A+y0.net
>>201
いや、Longの中に入っている時点でマイナスなら* -1してやればいいだけだけど、だったらもっと範囲の広い型で後ろ2バイト以外クリアする方が分岐もなくスッキリするだろう
206:デフォルトの名無しさん
21/09/29 08:41:09.05 +gGxbszWd.net
>>202
元データの上位2バイトが00で埋まってた場合、論理シフトで符号が変わる場合があるでしょ
VBAには論理シフトがないから、何か別の方法で再現する必要があると思うんだけど
具体的に、動くコード書いてみて
207:デフォルトの名無しさん
21/09/29 09:29:57.66 ilMiUA0BM.net
Byte型からLSetが単純で一番速いと思う
定義(追加部分のみ)
Type tyByte
Byte0 As Byte
Byte1 As Byte
Byte2 As Byte
Byte3 As Byte
End Type
代入処理はこんな感じ
データの格納順序は知らんから適当
myByte.Byte0 = long0 And &HFF&
myByte.Byte1 = (long0 And &HFF00&) \ &H100&
myByte.Byte2 = long1 And &HFF&
myByte.Byte3 = (long1 And &HFF00&) \ &H100&
LSet mySingle = myByte
208:デフォルトの名無しさん
21/09/29 09:40:16.79 f5tfMzLod.net
>>204
それなら最初にLongをByteにLsetすれば、マスクやシフトしなくても途中のバイトがそのまま取り出せる
コードの行数は増えるけど演算量はもっと減らせる
209:デフォルトの名無しさん
21/09/29 12:56:20.18 slA14A+y0.net
>>203
ちょっと何を言ってるか分かりませんね。
まずシフトの話はどこから出てきたの?
Long型ならマイナスであれば常にトップビットは
立っているよね?
だからプラスに変換するってことだけど?
トップビットが立っていなければプラスなんで変換する必要はない。
もちろん、最初の設定値のLong型の下位2バイトでマイナスを表現するならそれぞれ*-1してやらなきゃいけないけど>>191を見た限りではそのような扱いでもないしね。
途中でマイナスをもつような型の変数に入れるなら
その後始末をしないといけないというだけ。
そもそもトップビットがなぜ符号なのかというところから理解しないとね。
トップビットを単純に0にすればプラスの値に置き換わるというものでもないし。
例えば、1バイトの変数で言えば、-1はFFhだよね。
これのトップビットを倒すと、7Fhになる。
つまり、1にはならずに127になるよね。
210:デフォルトの名無しさん
21/09/29 19:09:56.88 UXZ9zF/70.net
VBAのウインドウの固定で行を選択するとA列に移動してしまうのはどうにかならない?
手動だとそのまま列でウインドウの固定になるから違いがよくわからん
211:デフォルトの名無しさん
21/09/29 21:29:48.02 7Q67NENAd.net
>>206
元の質問と、そこに付いてるレスをよく読んで
212:デフォルトの名無しさん
21/09/29 22:06:13.36 bAaW5g7mM.net
>>206
ゴタクはいいから
> 具体的に、動くコード書いてみて
って言われてるぞ
213:デフォルトの名無しさん
21/09/29 22:10:21.46 slA14A+y0.net
>>209
具体的なコードは昨日既に>>195で書いているな。
214:デフォルトの名無しさん
21/09/29 22:32:44.25 helTTC1Td.net
図解するとこういうことじゃないの?俺の理解が間違ってる?
URLリンク(i.imgur.com)
215:デフォルトの名無しさん
21/09/29 22:47:00.69 slA14A+y0.net
>>211
うん。それであってるよ。
ただ、.Netみたいにアンサインな型の変数が無いから
それをどうしようか、という話。
Longで普通に計算すると上位2バイトに65535(&HFFFF)辺りが入れば
例えば&HFFFF00000が入ったとして、4294901760が欲しいのに
普通にLong型だと-65536が取れちゃったりするよね。
216:デフォルトの名無しさん
21/09/29 23:33:48.06 slA14A+y0.net
あ、でも*-1する方法じゃダメか。
これはあくまでマイナスをプラスにする方法であって、トップビットが立っていてもプラスとみなす方法じゃないからね。
そう考えるとやっぱりもう少し幅の広い変数持っといて計算する方法が楽かな。
だからみんなByte型とか使ってたのかー。
なんか勉強になったわ。
217:デフォルトの名無しさん
21/09/29 23:39:44.93 +/PybBD+d.net
一つの例として、
Long[0]=&h00000000
Long[1]=&h00003E20
の時、得られるSingle値は0.15625になる
正しく計算できてるかどうか試してみればいい
>>191
Hexの戻り値は4桁とは限らないから、それでは正しく結合できないよ
218:デフォルトの名無しさん
21/09/29 23:43:02.21 +/PybBD+d.net
あまんり綺麗なコードじゃないけど、一応動くと思う
Option Explicit
Type tySingle
varSingle As Single
End Type
Type ty4Byte
Byte0 As Byte
Byte1 As Byte
Byte2 As Byte
Byte3 As Byte
End Type
Sub Long2Single()
Dim mySingle As tySingle
Dim my4byte As ty4Byte
Dim long0 As Long, long1 As Long
long0 = &H0&
long1 = &H3E20&
my4byte.Byte0 = long0 And &HFF&
my4byte.Byte1 = (long0 And &HFF00&) \ &H100&
my4byte.Byte2 = long1 And &HFF&
my4byte.Byte3 = (long1 And &HFF00&) \ &H100&
LSet mySingle = my4byte
Debug.Print mySingle.varSingle
End Sub
219:デフォルトの名無しさん
21/09/30 00:24:00.39 PZiEyg+B0.net
Option Explicit
Private Type TPLong
long0 As Long: long1 As Long
End Type
Private Type TPByte
byte0 As Byte: byte1 As Byte: byte2 As Byte: byte3 As Byte
byte4 As Byte: byte5 As Byte: byte6 As Byte: byte7 As Byte
End Type
Private Type TPSingle
single0 As Single: single1 As Single
End Type
Private Sub test()
Dim L As TPLong
Dim B As TPByte
Dim S As TPSingle
L.long0 = &H0
L.long1 = &H3E20&
LSet B = L
B.byte2 = B.byte4
B.byte3 = B.byte5
LSet S = B
Debug.Print S.single0
End Sub
動いた。改行多すぎって言われたので詰めて書いてる。
220:デフォルトの名無しさん
21/09/30 00:49:27.70 pCEIeulu0.net
>>214
それ、Longの上位下位どっち側にデータ入れるかによって
00 00 3E 20 で、数値表現としては &h3E200000 かもしれん
>>197はその前提で作ってるし>>211の図もそうだな
と思ったけど、HEX表現でそのまま連結してOKとか思ってるのか
3E 20 00 00 って格納してるのが正解なのか
エンディアンの呪いやっかいだなぁ
221:デフォルトの名無しさん
21/09/30 05:21:02.09 0qBy1lQqM.net
>>210
それツッコミないのはあまりにもレベル低いからだぞ…
222:デフォルトの名無しさん
21/09/30 06:14:58.44 gM2Bcn3cd.net
>>217
質問者が単純にHex関数の連結だけでOKだったと書いてるから、それぞれ下位16bitを使ってて、Long[0]が下位、Long[1]が上位側と読み取れる
まあ逆だったとしても簡単に修正できるし
223:デフォルトの名無しさん
21/09/30 08:01:56.59 R3l1DBbza.net
質問する前に良く考えれば自力でできたんじゃね
224:デフォルトの名無しさん
21/09/30 09:52:07.40 Vb95uiyM0.net
VBAで標準モジュールを削除するコードを書いてるんだけど、消えない場合がなくね?
removeしてもそれがすぐに反映されない。
commitするようなコマンドてある?
225:デフォルトの名無しさん
21/09/30 10:02:50.98 R1d8oRoFM.net
ないならいいじゃん
226:デフォルトの名無しさん
21/09/30 10:06:49.68 XH3u7BFNM.net
「場合がなくね?」を「場合がない」と読むのは流石に揚げ足取りが過ぎる
227:デフォルトの名無しさん
21/09/30 10:16:54.23 eFhgF698M.net
なくね?
→なくない?
ないよね?
言語仕様による違いかな
228:デフォルトの名無しさん
21/09/30 10:20:26.49 +bzcSAlDd.net
文脈から言い間違いだと気づけないのはアスペだそうですよ
229:デフォルトの名無しさん
21/09/30 10:58:49.96 SEX1vFKW0.net
> commitするようなコマンドてある?
→commitが欲しい
→なくね?は間違い
脳仕様による違いかな
230:デフォルトの名無しさん
21/09/30 12:35:11.89 Vb95uiyM0.net
調べるとこういうことが起こってるみたいだな。
URLリンク(try2explore.com)
VBComponents.Remove呼び出しは、VBAの実行が停止した場合にのみ実際に有効になる場合があります。
つまり、すべてのステートメントが終了するまで、またはコードがブレークポイントに達してデバッグを停止するまで、
削除操作は有効になりません。
これは、新しいモジュールをインポートするか、既存のモジュールのコードを新しいモジュールに置き換えるための次のコードが原因で問題になります。
231:デフォルトの名無しさん
21/09/30 13:00:34.16 aMauK9B30.net
もう起こったぞ
232:デフォルトの名無しさん
21/09/30 19:03:25.50 gc4CAj+A0.net
クリリンのことかー
233:デフォルトの名無しさん
21/09/30 19:31:20.50 4/dpkDC70.net
>>220
多分ビット演算を知らないんだと思う
いずれにしてもバイナリごにょごにょはVBAには適さないとレス見てて改めて思った
234:デフォルトの名無しさん
21/09/30 20:06:00.47 aMauK9B30.net
バイナリならByte型でやればいいのにね
235:デフォルトの名無しさん
21/09/30 22:38:31.79 tyeheD170.net
for i=0 to 10
if AAA(i) then Range("A1").offset(i,0)="OK"
next
↑こんな感じのfor文を書いたら普通に動いていたんだけど、
for i=0 to 10
debug.print i, AAA(i)
if AAA(i) then Range("A1").offset(i,0)="OK"
next
↑for文の中にdebug.printを入れたら、iが10になっても止まらず、
イミディエイトウィンドウ上に、「i, AAA(i)」の部分がずっとループして止まらなくなった。
こんなことってありえますか?
236:デフォルトの名無しさん
21/09/30 23:00:52.63 sFWbYEj80.net
AAA(i) って中身はなんだ
237:デフォルトの名無しさん
21/09/30 23:03:17.67 50MfSZL40.net
>232
i=i-1
や
i=3
みたいにiが永久に10を超えない動作が入るとそうなる
238:デフォルトの名無しさん
21/09/30 23:04:37.72 Vp0fi7DV0.net
普通に動いていると思っていただけで元々普通に動いてなかったとかはある
こんな感じのって言ってるから、そのソースそのまま受け取るわけには
いかんのだろうなって思った
239:デフォルトの名無しさん
21/09/30 23:16:32.92 VHGvetdVa.net
初心者の頃は手動でセル入力してた方が早く終わってしまうのが、もどかしくもあるけど
それでもvbaは覚えるべきだと思っていろいろ頑張ってます
240:デフォルトの名無しさん
21/09/30 23:22:00.84 sFWbYEj80.net
>>232 >>234
Function AAA(ByRef i As Variant) As Boolean
i = 3
AAA=True
End Function
こんな感じのじゃない?
241:232
21/10/01 00:46:48.32 85aYXoDy0.net
AAAはリストボックスです。
わかりにくかったので、listAとします。
中身はTRUEかFALSEです。
listA.list(0)がTRUEなら、A1セルにOKを入力
listA.list(1)がFALSEなら何もしない。
listA.list(2)がTRUEなら、A3セルにOKを入力
…
という処理でした。
debug.printを入れる前に動かした時は、画面が固まることもなく正常に終了しました。
debug.printを入れた後に動かしたらループが止まらなくなりました。
debug.printで出力されたiは、0→1→…→9→10→0→1→…というループではなくて、
0→1→…→9→10→6→7→8→9→10→6→…→10→6→…というループでした。
「debug.print i」がiの値に影響を与える、ということはないですもんね。
他の部分を明日あらためて確認してみます。
ありがとうございました。
242:デフォルトの名無しさん
21/10/01 17:55:16.70 fQjrPzOfa.net
クラスを使うメリットってなに?
243:デフォルトの名無しさん
21/10/01 19:26:10.62 aPfKzK/z0.net
見た目が美しい
244:デフォルトの名無しさん
21/10/01 19:29:13.73 AYkrwA2S0.net
自己満足
245:デフォルトの名無しさん
21/10/01 19:45:19.68 3/37uweO0.net
>>239
メソッドとプロパティが一箇所に集まって可視化しやすくなる
でもvbaのクラスは貧弱過ぎるので、モジュールで分けるのと大差ないという
246:デフォルトの名無しさん
21/10/01 19:47:27.08 4jCtmjal0.net
>>239
色々あるが、VBAのクラス機能はゴミなのでマジで自己満が多いと思う
解説サイトで玄人の技・隠し機能みたいなノリで紹介されてるので、使えるとプロっぽく見える。
①イベントやデフォルトメンバーみたいなオブジェクトモジュール専用の機能が使える
イベントをまとめたいとかで、仕方なしに、これ目的で使ってる人が多いと思う
②変数に値を入れて、その変数を色んな関数の引数にするっていう事が多々あるけど、
そういう「変数と関数」が常にペアになっているなら纏めた方が分かりやすい
③標準モジュールではモジュールレベルで宣言した変数は実行中保存される。
なので、ある関数でモジュールレベルの変数に値を保存して、別の関数で再利用みたいな使い方が出来る。
でも標準モジュールだと当然その変数に保存できる値は一つなので使い勝手が悪い。
クラスモジュールならインスタンスごとに別の値を保存できる
247:デフォルトの名無しさん
21/10/01 19:51:30.36 4jCtmjal0.net
この手の話題には「お前らは使いこなしてないからメリットを把握できてないが、俺は使いこなせてる」おじさんが来る
248:デフォルトの名無しさん
21/10/01 19:59:58.89 jrcl2rEY0.net
処理高速化するクラスくらいは単純だし使いまわせるし使ってもいいんじゃない
249:デフォルトの名無しさん
21/10/01 20:12:23.33 HK8CLsAI0.net
ただ単にすっきりして可読性がよい
クラスにしてると他人のコード化したときに何をしてるかもう一度把握するのが容易
自分でメソッドやプロパティを作るとファイルシステムオブジェクトやコレクションを扱い易くなる
250:デフォルトの名無しさん
21/10/01 20:33:12.85 4jCtmjal0.net
JSとかと違ってモジュール内に構文で記述できない(単体のモジュールファイルとしてしか書けない)から、
クラスモジュールを書くこと自体が億劫に感じて余り印象よくないわ
プロジェクト内だとどこからでも呼び出せるから、どこでどう使われてるのかサッパリだし
イベント機能とか状態保存を有効に使いたい、コレクションを自作したい、
みたいな特別な理由がない限り使わない方がいいんじゃないかなぁと思ってる
251:デフォルトの名無しさん
21/10/01 20:46:27.80 g1N/sLwpM.net
継承までは望まないとしてもせめてInitializeに引数を持てるようにして欲しかった
252:デフォルトの名無しさん
21/10/01 20:53:23.76 4jCtmjal0.net
>>248
Initializeはコンストラクタじゃなくてイベントだから、
仮に引数があってもオブジェクトモジュール内じゃないと使えない上に、
インスタンスごとにイベントハンドラ用のモジュールレベル変数が必要になって面倒だと思う
253:デフォルトの名無しさん
21/10/01 21:49:30.27 j+Pc2S4XM.net
イベントに引数渡せる言語はいくらでもあるのに何を言ってるんだ?w
254:デフォルトの名無しさん
21/10/01 22:01:08.86 4jCtmjal0.net
>>250
どう読んだらそういうレスになるの?
読解力のないバカはこれだから困る
255:デフォルトの名無しさん
21/10/01 22:07:37.29 CXdVtwXkM.net
>>251
はいはい、説明できないバカ乙
そもそもコンストラクタにすればいいだけの話だし
256:デフォルトの名無しさん
21/10/01 22:11:26.60 CmFZe7Ct0.net
質問者の環境や能力を無視すんなよ
257:デフォルトの名無しさん
21/10/01 22:24:35.99 4jCtmjal0.net
>>252
何をどう解釈したのか言ってくれれば対応できるけど、最早返答が意味不明過ぎるんだわ
何に対して「イベントに引数渡せる言語はいくらでもあるのに何を言ってるんだ?w」と疑問が沸いたのか説明して?
258:デフォルトの名無しさん
21/10/01 22:34:31.13 4jCtmjal0.net
>>252
あと、VBAのクラスに「引数が付いたコンストラクタが欲しいな」っていう希望から
「Initializeに引数を持てるようにして欲しかった」っていう要望が出たのは明白だろう
で、イベントに引数を渡すのは面倒だよねって話をしたら「コンストラクタにすればいい」ってのもよくわからん。
だったらイベント関係なしに、初めから使いやすいコンストラクタ相当の言語機能が定義されてた方がいいだろう
259:デフォルトの名無しさん
21/10/01 22:55:44.73 f1R1MoFX0.net
一般のObject指向言語で言うところの継承が使えないとか色々あるから普通にデザインパターンを考慮して作ろうとするとそこそこ制限受けるよね。
例えば継承が使えないからテンプレートメソッドパターンが使えないとか、
VB.Netで言うSharedが使えないからキチンとシングルトンパターン使おうとすると結構厄介だったりとか。
インターフェースが使えるから継承の代わりにストラテジーパターンでも使って組もうとか考えても限界あるし。
あ?コンストラクタに引数?
そんなのは初期化用のメソッド作って呼びゃいいだろうと俺は思うけどね。
まあでもそういうのに頭使って組むからVBAは面白いんだと思うよ。
他のObject指向言語やってる人って結構インターフェースの概念を疎かにしたりするしね。
260:デフォルトの名無しさん
21/10/02 02:59:35.03 xagjL2JO0.net
イベントに引数渡す(というか受け取る)のは別に面倒でもなんでないから
コンストラクタの引数をInitializeイベントに渡せたらまあそれもいいんだが
VBAだとInitializeイベントがオーバーロードできないからなぁ
まあもともとのVBがオブジェクト指向でもなんでもなかったとこからスタートしてるからな
俺はVBAのクラスは自作イベント使いたいときに使うものと思ってる
261:デフォルトの名無しさん
21/10/02 06:05:15.61 g1EUYVpxM.net
>>254-255
イベントだから何?って話
VBAでも引数を持つイベントはあるし、できない理由を必死に探してるだけにしか見えない
そもそもイベントとコンストラクタなんてある意味呼び方の問題だし
262:デフォルトの名無しさん
21/10/02 06:08:02.24 g1EUYVpxM.net
>>256
> あ?コンストラクタに引数?
> そんなのは初期化用のメソッド作って呼びゃいいだろうと俺は思うけどね。
> まあでもそういうのに頭使って組むからVBAは面白いんだと思うよ。
そういうのは頭使うとは言わない
単に面倒(かつバグの元)なだけ
無い物ねだりすんなと言うならわかるけど
263:デフォルトの名無しさん
21/10/02 07:21:09.62 f83gGEH/0.net
VB7を待て!
264:デフォルトの名無しさん
21/10/02 07:44:35.99 PmOXqFk20.net
>>259
言ってる意味が分からない。
生成した後初期化用のメソッド呼ぶだけだろ?
なんでそんなのが面倒でバグの元になるんだ?
お前はそんな程度でバグを生むソースを書くのか?
265:デフォルトの名無しさん
21/10/02 07:49:32.43 i6pQYLUQ0.net
それ言い出すとどんな言語でも「だけ」になるぞ
266:デフォルトの名無しさん
21/10/02 07:52:52.17 PmOXqFk20.net
それにポリモーフィズムを理解している奴ならむしろバグやUTケースを減らせるコードが書ける。
でなければObject指向なんてここまで浸透しなかっただろうよ。
267:デフォルトの名無しさん
21/10/02 07:53:44.67 PmOXqFk20.net
>>262
例えば?
268:デフォルトの名無しさん
21/10/02 08:50:27.63 7sXji/t3M.net
むしろ>>263の方に例えば?って言いたいわw
269:デフォルトの名無しさん
21/10/02 09:59:20.90 PmOXqFk20.net
>>265
学生なのか?
社会人であるなら上司から
質問を質問で返すようなマネはするなと
教わらなかったのか?
まぁいい
答えてくれれば答えよう
それが順序というものだ
270:デフォルトの名無しさん
21/10/02 10:26:50.08 SSNRs28sM.net
>>266
バカなの?
別人だし>>263は質問じゃねーし
まあまともな答えは期待してないから答えなくてもいいぞw
271:デフォルトの名無しさん
21/10/02 10:45:25.61 l9bGJwl90.net
>>267
お前はまた勉強する機会を損失した
ただそれだけのこと
272:デフォルトの名無しさん
21/10/02 11:55:15.97 SSNRs28sM.net
勉強?
からかわれてることぐらいは理解した方がいいぞw
273:デフォルトの名無しさん
21/10/02 11:56:22.57 h3OHY9Ln0.net
まあまあ、通りがかりの者だけど、お前ら仲良くやれや
274:デフォルトの名無しさん
21/10/02 12:17:57.73 4Bm9Y75Jp.net
まったく最近のじじいは
マウントどうのとかほざくくせに
負けず嫌いで困る
275:デフォルトの名無しさん
21/10/02 12:26:19.80 s0PycLWJM.net
5chはじじいの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。
276:デフォルトの名無しさん
21/10/02 17:44:59.50 i6pQYLUQ0.net
>>264
クラスにコンストラクタがない
→newの後にメソッドなりで中身かえればいい「だけ」
それを言い出すとクラスそのものもなくてもどうにでもできるだろって話になる
そうじゃなくて、そんなめんどくさいことを「今更」したくないって話なんだ
それが苦にならないor自分で既にそれらを自動化するライブラリがある!ってなら問題ないと思うよ
君の言ってる事は間違いではない。単に感覚の違いだ
ただ、俺はやだなぁ
ついでに言うとarrayにpushはマジで欲しい
277:デフォルトの名無しさん
21/10/02 17:50:29.29 ffSwt3TR0.net
>>273
したくないのは自由だが、いまさらVBAが更新されることはないから、諦めて他の言語に行ってくれ
278:デフォルトの名無しさん
21/10/02 18:23:04.84 xagjL2JO0.net
>>263
ちゃんとしたオブジェクト指向言語使えば減らせるってならともかく
VBAでオブジェクト指向でやってUTケース減らせると思えんが
ちょっとVBA関係ない話になるが
お前の思うポリモーフィズムと引数付きコンストラクタの使いどころ教えてくれ
279:デフォルトの名無しさん
21/10/02 18:24:23.99 yfSowQXWM.net
>>274
> いまさらVBAが更新されることはないから
みんなそんなことはわかってるけどいきなりどうしたw
280:デフォルトの名無しさん
21/10/02 18:35:12.83 ffSwt3TR0.net
>>276
無駄な議論する意味なしでしょ
VBAの質問スレだし
281:デフォルトの名無しさん
21/10/02 19:02:41.91 /B20gKTEM.net
ああ確かにそうだな
そりゃすまん
282:デフォルトの名無しさん
21/10/02 21:28:02.67 PmOXqFk20.net
>>275
283:> そうだな、ちょっとその前に 例えば一つの例としてゲームを作ったとしよう。 それは簡単なシューティングゲームだったとして、 キャラクターの中に自機、弾、敵、ヒットマークがあったとする。 キャラクター数の上限は考えないものとし、敵は幾つか種類がいるものとして、ひとつは地形判定を行う、一つは弾を打つ、等の違いがあった場合、 君ならどう作るか聞いてもいいかな? 質問を質問で返すようなことするなと言っておいて悪いが最初に認識を合わせるために聞いておきたい。
284:デフォルトの名無しさん
21/10/02 21:48:51.07 PmOXqFk20.net
>>273
そもそも論として、クラスを使わなければ何か出来ないことがあるかと言われれば、それはあまり思い付かない。
ただ、VBAでクラスのコンストラクタに引数を持ってないという程度であればそれで代用が効くだろうという話。
それも面倒だというのであれば、クラスを生成して初期化するメソッドを作ってそれに引数を持たせるようにして呼び出せばいくつそういう場所があっても一回書いておけばいいということになる。
285:デフォルトの名無しさん
21/10/03 05:20:08.91 fyf/YlYy0.net
>>279
認識あわせの例がシューティングゲームとかその時点でお前とは合わんわ
シューティングゲームとか作らんし、その想定でどう作るとか言われてもな
まあ一から全部作ることはないし、何らかのフレームワークに従って作るんじゃね
そんな細かい実装的な話を聞きたいんじゃないんだよ
286:デフォルトの名無しさん
21/10/03 07:39:28.72 8uofczFap.net
>>281
話が合わないというのには同意だ
新しい何かを作る際にその構成が考えられない人に説明しろと言われてもな。
VBAスレでフレームワークとかも持ち出す意味ないしな。
287:デフォルトの名無しさん
21/10/03 11:58:59.58 Lx3l1CXP0.net
ガンダムで例えてくれ
288:デフォルトの名無しさん
21/10/03 12:18:23.19 PztuncMq0.net
坊やだからさ
289:デフォルトの名無しさん
21/10/03 12:51:23.55 oCTMWA/sa.net
excel+vbaでマインスイーパーは造れますか?
どこかにソースありますか?
290:デフォルトの名無しさん
21/10/03 12:54:45.72 cPfMe0TfM.net
>>285
考えただけでも簡単そう
ソースはしらんけど
291:デフォルトの名無しさん
21/10/03 13:18:38.78 PZL9KPgcM.net
vba minesweeper code でググれ
292:デフォルトの名無しさん
21/10/03 22:35:03.42 x8fdTISD0.net
教えて下さい
ガンチャート形式の日程表で
日付の色塗りだけじゃなくて
タスク表示(その日の予定)もさせたいんだけど
どう関数組んだらいい?
293:デフォルトの名無しさん
21/10/03 23:22:18.21 VDfIFkhd0.net
>>288
ガントチャート形式の日程表とやらの構成はどうなっている?
日付の色塗りとは、何を指している?
タスク表示とは、タスク名?をどこに表示させることを言っている?
このへん予め提示しないと解決が長引くよ
294:デフォルトの名無しさん
21/10/04 00:04:37.41 j9cfwAH/0.net
>>288
セルサイズを大きくしてタスクを入力すればいい
295:デフォルトの名無しさん
21/10/04 01:17:19.95 BaE5qGe00.net
excel ガントチャート フリーで検索
296:デフォルトの名無しさん
21/10/04 09:25:56.63 dlhTdODc0.net
質問失礼します
タイマーで二つのマクロを順番に実行したいのですが
ひとつめのマクロ実行が長引いてしまい
マクロ実行中にApplication.OnTimeのcallで次のマクロが動くとエラーになってしまいます
Application.OnTimeの時間になっても前のマクロが終わるまで待つやぶつからなくする方法はあるでしょうか?
297:デフォルトの名無しさん
21/10/04 09:37:56.41 X/RNGavO0.net
>>292
へ?
ひとつ目の実行開始時に処理中フラグ立てて
実行終了時に倒すようにして
それ見て二つ目のマクロの処理を飛ばすか
待たせてまた実行するかすればいいんじゃないの?
聞いてる意味違う?
298:292
21/10/04 10:15:29.97 dlhTdODc0.net
>>293
はいあっています
処理中のフラグでぐぐると色々出てきました
困っていたので助かりました
ありがとうございます
299:デフォルトの名無しさん
21/10/04 10:57:06.41 JQlH+vDNM.net
ontimeの第3引数も調べてね
300:デフォルトの名無しさん
21/10/04 12:27:18.56 kyO84GtQa.net
関数に引数が七つも八つもあるとわかりにくくなるから、それならクラスにしておけば、可読性が良くなるのかな
301:デフォルトの名無しさん
21/10/04 12:54:51.17 X/RNGavO0.net
>>296
そうね。
ただVBAのクラスは1クラス1モジュール使ってしまうのと、クラスが格納されているフォルダが一階層しか使えないからネーミングに気を付けて後でそれがそういう意味を持つクラスだって分かるようにしておかないとね。
後、あれやこれやと引数のクラス作らなくても、引数として格納する変数が一意でいい場合は標準モジュールでも同じように作れば使えるよ。
ただしこの場合は引数として渡すんじゃなくてその標準モジュール側に作ったプロパティを直接読みに行くことになるけどね。まぁ使い分けだね。
302:デフォルトの名無しさん
21/10/04 13:39:00.82 1MgeDxIh0.net
マクロを実行させると、Excelが落ちてしまい、
ステップ実行させるとマクロが正常終了orExcelが落ちない
ていう事になってるんだが、
どこで異常終了してるか調べる方法ある?
303:デフォルトの名無しさん
21/10/04 13:41:09.43 X/RNGavO0.net
>>298
ブレイクポイント貼りまくりで
徐々に外して落ちてる範囲を狭めて
最終的ににどこで落ちてるか確定させる
304:デフォルトの名無しさん
21/10/04 13:54:27.50 X/RNGavO0.net
上記のやり方が大変だというのであれば
Logをどこかのtxtファイルにはく、という手もある。
305:デフォルトの名無しさん
21/10/04 14:13:00.80 1MgeDxIh0.net
>>299,300
ブレイクポイントを貼ると落ちない。
なんとなくやばい場所は分かってるんだけど、on errorでもcatchできないんだよな。
やってることは、 uiautomationを使ってコンボボックス叩く(Expand)てことやってるんだが、
おそらくその行で落ちるんだが、
落ちずに成功する場合もあるんだよな。
306:デフォルトの名無しさん
21/10/04 14:34:03.70 AbV0YbaI0.net
>>301
WinAPIで似たような事があった
本来待ち時間が必要な処理を待たずに次へ行くからブレイクポイント無しだと落ちるってケースね
怪しい所にSleep関数使って500ミリ秒待たせたら落ちなくなった事があるよ
307:デフォルトの名無しさん
21/10/04 15:02:49.67 1MgeDxIh0.net
298です。
いろいろ試してみると、マクロを実行じゃなくてステップインボタン押してF5で実行させると落ちない事がわかった。
ならば、待ち時間の問題かと思って、sleepとかDoEventsを入れてみても、落ちる。
今の所唯一の回避策がステップイン+F5だな。
ググるとステップインだとうまくいくていう記事は散見されるが、合理的な説明はない。
308:デフォルトの名無しさん
21/10/04 15:29:55.92 NBSFfuMDM.net
コンボボックスって表示したときにはテータは入ってなくて
クリックされたときにデータを読みに行くとかじゃなかったかな
309:デフォルトの名無しさん
21/10/04 18:42:56.09 CJXp4LD30.net
タイマーの間隔が短すぎなんじゃね
310:デフォルトの名無しさん
21/10/04 19:42:11.08 2sXWsmVMa.net
ワークブック開きすぎ(それも容量やシートが多すぎ)や、複数アプリケーション開きながらマクロ動かすと遅くなるからそういうところからも気をつけるといいかもしれない事例
311:デフォルトの名無しさん
21/10/04 20:35:24.21 X/RNGavO0.net
>>303
当たりをつけるというフィジカルな部分ももちろん大事だけれど、本当に自分が当たりをつけたところが原因なのか切り分けを行った方がいいね。
その為にもどこで落ちているかを確定するのが一番先にやることだよね。やっぱりLogをtxtファイルか何かに出力するのが遠回りになるようで一番近道かもしれないよ。
箇所箇所で吐き出すロジック組み込んで、毎回書き込んでセーブしておけばどこで途切れたかで分かると思うからそれで絞り込んでどの命令で落ちたかを確定出来れば儲けもの。
もっとも、都度落ちる箇所が違う場合もあるかもだろうけど、そうなったらそうなったでそれから当たりをつけて調べればいいのであって、まず落ちている箇所が特定出来れば原因もある程度絞れるよね。
312:デフォルトの名無しさん
21/10/04 20:43:05.82 TWw1hYLnM.net
>>296
たいていはユーザー定義型で十分
313:デフォルトの名無しさん
21/10/04 22:16:21.62 YLhov1R00.net
For i = 1 to 10
Call Sleep(200)
DoEvents
Next i