22/03/25 22:44:11.29 3hBoOPeGa.net
>>565
来る板間違えてる
> ローカルルール
> この板はプログラムを作る人のための板です。
こっちへ行け
【Excel】Power Queryを語るスレ【Power BI】
スレリンク(bsoft板)
580:デフォルトの名無しさん
22/03/25 22:44:52.03 4vyR1Miw0.net
>>568
縦軸となる共通するkey列はなに?
何の順番で行が並んでるの?
581:デフォルトの名無しさん
22/03/25 22:58:31.64 UnnJynAs0.net
>>569
ありがとうございます
582:デフォルトの名無しさん
22/03/25 22:58:38.87 378bs0UD0.net
なんだ、Power Queryか。
いい機会だからVBAも勉強してってくれ
583:デフォルトの名無しさん
22/03/25 22:59:53.49 378bs0UD0.net
Sub hoge()
Dim targetSheet As Worksheet
Dim bottomRow As Long
Dim toPasteColumn As Long
Dim isFirstTime As Boolean
isFirstTime = True
toPasteColumn = 1
With ThisWorkbook
If .Sheets.Count = 1 Then
Exit Sub
End If
For Each targetSheet In .Worksheets
If Not isFirstTime Then
targetSheet.Activate
bottomRow = targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).Row
targetSheet.Range(targetSheet.Cells(1, 1), targetSheet.Cells(bottomRow, 4)).Copy _
Destination:=Sheets(1).Cells(1, toPasteColumn)
toPasteColumn = toPasteColumn + 4
End If
isFirstTime = False
Next
End With
End Sub
584:デフォルトの名無しさん
22/03/25 23:02:44.53 378bs0UD0.net
うん、やっぱりインデントつぶれたね。
これで動くはずなので良ければVBEに張り付けて実施してみて。
最初のA列がキーであることが前提だけども。
585:デフォルトの名無しさん
22/03/26 00:22:2
586:2.08 ID:wN9O5mc/0.net
587:デフォルトの名無しさん
22/03/26 00:30:29.64 3d/IeTqK0.net
Sub aaa()
For bbb = 0 To 0
If ccc = 0 Then
ddd = eee
End If
Next
End Sub
588:デフォルトの名無しさん
22/03/26 01:25:30.54 x5oh4kDTa.net
ツールの利用者から、ツールの改修担当者に問合せがいったんでしょ。
改修担当といっても、前任者から引き継いだだけだから、全ての仕様はわかっていない。
現在の業務にそぐわない仕様があって、エラーが出たから、
利用者が改修担当者に問合せ。
前任者なら「もともとこういう仕様です」と答えれば、
「ああ、それなら業務が変わったから改修が必要だな」と
改修依頼を出せる。
ツールの利用者も着任して間もない人の場合、
業務が変わったのかどうかもわからない。
そういう場合、ソースコードの条件文を日本語にして
回答するのではなくて、
昔から存続しているチームの誰かに聞くのが普通。
それをしないのは職務怠慢。
自分一人で売上を引っ張ってこれていると勘違いしているのかな。
589:デフォルトの名無しさん
22/03/26 06:35:02.37 4/mAEYCl0.net
>昔から存続しているチームの誰かに聞くのが普通。
>それをしないのは職務怠慢。
つまりそれをしないで改修担当者に聞いてるやつが悪いってことだな
590:デフォルトの名無しさん
22/03/26 10:14:46.58 p8/YoqyTd.net
ここって長文で講釈を垂れる人おおいよね
しかもVBAにはまったく無関係という
591:デフォルトの名無しさん
22/03/26 12:35:46.08 OVfO91qG0.net
自力でできないのに調べない、人に聞かない、期待されているのものがつくれないのは できない人 としか言いようがない
592:デフォルトの名無しさん
22/03/26 15:44:49.86 wN9O5mc/0.net
時には長文になるのは仕方ないよ。
丁寧に説明するばそうならね?
上の方で個人名みたいの書いてるアレな人いるけど今の5ちゃんて個人名書いただけでNGじゃなかったか?
593:デフォルトの名無しさん
22/03/26 16:02:36.43 1KsbV4Zma.net
個人名NGの規制ってあるのか?
WindowsやLinux板とかでは機能していないように見えるけど
594:デフォルトの名無しさん
22/03/26 17:07:43.61 kCwfN6Gy0.net
個人名というか個人情報な
通報されたら警察来るかな
595:デフォルトの名無しさん
22/03/26 17:58:02.51 wN9O5mc/0.net
昔バイトしていた居酒屋のマスターが5ちゃんに実名晒されて誹謗中傷書かれていたのを思い出してさ。
596:デフォルトの名無しさん
22/03/26 18:09:02.02 Gn2xNTk6p.net
>>577
> 昔から存続しているチーム
そんなのは跡形もないから
597:デフォルトの名無しさん
22/03/26 20:17:20.58 wN9O5mc/0.net
職務怠慢は言い過ぎでは?
何かしらの事情あるだろうし。
598:デフォルトの名無しさん
22/03/26 23:22:10.99 lmdSWMnfa.net
dim ki as string
ki = "まあいろんな事情があるよね"
ki = ki & "チームメイトに嫌われていて聞きづらいとか"
dim shou as string
shou = ki
shou = shou & "「こんなことくらいしかわからなくて、すみません」と謝られても"
shou = shou & "お前がそんなことしかわからないことは、百も承知。"
shou = shou & "誰かに回してくれることも見込んでの質問なんだけど、"
shou = shou & "ってね。"
dim ten as string
ten = shou
ten = ten & "プログラマーは基本、自分ひとりで仕事完結して、周りに電話したりメールしたりチャットしたり、"
ten = ten & "という連携は面倒くさがる人が多いからね。"
ten = ten & "コーディングされていないことは、できませんが何か? みたいな"
ten = ten & "職務はここまで。これ以上はできませんが何か?みたいな"
dim ketu as string
ketu = ten & "ロボットみたいな人が多い。"
599:デフォルトの名無しさん
22/03/26 23:52:13.63 4I5liEUu0.net
何?
この気持ち悪いスレ・・・・・・
600:デフォルトの名無しさん
22/03/26 23:57:27.46 zJILPsYJM.net
>>587
汚いコードだな、そんな代入の仕方じゃ変数を4つ用意した意味がまったくないじゃん
そういう時は最後に足すんだよ
Dim DeathStory As String
DeathStory = ki & shou & ten & ketu
601:デフォルトの名無しさん
22/03/26 23:58:14.85 zJILPsYJM.net
>>588
そっ閉じすりゃいいのに、そんなスレに何か書き込んでる時点で同類
602:デフォルトの名無しさん
22/03/27 03:21:42.29 hNNvtCzu0.net
深夜になると定期的に変な書き込みあるよね
603:デフォルトの名無しさん
22/03/27 03:29:36.79 /OZccBd9M.net
>>591
自己紹介かよ!
604:デフォルトの名無しさん
22/03/27 07:40:40.82 BqsGdBXW0.net
>>587
無駄に
変数 = 変数 & 文字列 をやると
その分余計にメモリを使用する。やり直し。
605:デフォルトの名無しさん
22/03/27 09:48:21.10 8deA3KtJa.net
そもそも >>587 だと
"まあいろんな事情があるよねチームメイトに嫌われていて聞きづらいとか「こんなことくらいしかわからなくて、すみません」と謝られてもお前がそんなことしかわからないことは、百も承知。誰かに回してくれることも見込んでの質問なんだけど、ってね。プログラマーは基本、自分ひとりで仕事完結して、周りに電話したりメールしたりチャットしたり、という連携は面倒くさがる人が多いからね。コーディングされていないことは、できませんが何か? みたいな職務はここまで。これ以上はできませんが何か?みたいなロボットみたいな人が多い。"
ってなるし、適宜 vbCrLf 挟めや
606:デフォルトの名無しさん
22/03/27 10:09:59.57 GXS4gvi+M.net
>>594
読んでないけど読む価値のないレスであることだけは判る
607:デフォルトの名無しさん
22/03/27 10:21:55.52 dieR0oCra.net
↑ どこを読めばいいのかもわからんアホw
608:デフォルトの名無しさん
22/03/27 10:33:27.62 jqHr+5yx0.net
最初と最後の行しか読んでないけど
スペースも改行もつかないって突っ込みだって事だけは判る
609:デフォルトの名無しさん
22/03/27 10:56:36.33 hNNvtCzu0.net
ようは字下げしないと読みにくいって教えてくれたんですね親切な人。
610:デフォルトの名無しさん
22/03/27 11:49:34.86 17nxG3290.net
>>593
そうなのか
賢くなった
でもいつものクセでSQL文はこの式で書いているわ
611:デフォルトの名無しさん
22/03/27 12:17:45.42 CPBl4WFea.net
>>597
それで十分、てか最後の行読んだらわかるだろ
612:デフォルトの名無しさん
22/03/27 12:19:46.20 CPBl4WFea.net
>>599
まあ高々数十行位なら気にすることはないよ
613:デフォルトの名無しさん
22/03/27 12:41:21.31 cPay0R1J0.net
誰かSalseforceのAPIをVBAでたたく方法わかる人いませんか?
API関連に関して全く無知で、何をどうしていいのか、、、
詳しい人教えてほしいです、、
614:デフォルトの名無しさん
22/03/27 12:52:04.46 dAzXJbreM.net
字下げや改行なんてVBAでやることじゃない
印刷だろうが電子化だろうが、文書の整形は出力アプリ側に投げるもんだ
リーダー端末の画面サイズやフォントサイズなんて予測できんだろ?
615:デフォルトの名無しさん
22/03/27 13:07:11.24 OVREMJced.net
文書の整形と文書自体を一緒にしてしまうところが悲しい・・・
616:デフォルトの名無しさん
22/03/27 17:11:35.24 hNNvtCzu0.net
なんでよ?VBAの義務教育編で字下げは真っ先に学習するはずじゃ??
617:デフォルトの名無しさん
22/03/27 17:22:28.69 2Abk94v90.net
年収1000万のインド人はインデントもコメントもなし
一般人はちゃんとつけよう
618:デフォルトの名無しさん
22/03/27 17:30:10.15 6akgwO9ga.net
>>602
アクセスするライブラリとAPIリファレンスを掲示してくれたら捗るんじゃね?
619:デフォルトの名無しさん
22/03/27 17:33:41.29 OVREMJced.net
>>607
APIは変に教えるとよくないと思うから
それを使って何かするような事をしたいなら正式な仕事なりで発注させるべきだと思うぞ
そもそも何もわかってない奴がここで質問してるのもおかしな話だろ
620:デフォルトの名無しさん
22/03/27 17:34:17.13 OVREMJced.net
スクレイピングもたまに質問するやつがいるけど
それも同じな
621:デフォルトの名無しさん
22/03/27 17:50:20.50 ob1ESvJwH.net
>>609
VBA でのスクレイピングはイマイチですねえ、動いたり動かなかったりするし、なにかいい方法はないものか?
Function ScrapingAlgoA003(objIE As InternetExplorer, url, keyword As String)
objIE.navigate url
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.document
Dim ReturnValue As Double
Dim div As HTMLDivElement
For Each div In htmlDoc.getElementsByClassName(keyword)
ReturnValue = CDbl(div.innerText)
ScrapingAlgoA003 = ReturnValue
Next div
Set htmlDoc = Nothing
End Function
622:デフォルトの名無しさん
22/03/27 19:02:58.02 jqHr+5yx0.net
>>600
そうだな
>>597は>>595へのレスだ
623:デフォルトの名無しさん
22/03/27 19:18:00.28 7EXZAGuD0.net
>>610
VBAのスクレイピングは今だとSelenium使ったChromeのスクレイピングが主流なんじゃなかろうか
バージョン合わせるのが面倒だけど安定してるし
624:デフォルトの名無しさん
22/03/27 19:39:07.33 2Abk94v90.net
Seleniumはほんといいね
IEからxpathで・・・ってやってたのがほんとアホらしくなった
625:デフォルトの名無しさん
22/03/27 19:43:23.36 U13zJWe20.net
Seleniumは昔インストールしたんだがよくわからず
未だにIEばかり使ってるんだが もうそろそろ切り替えた方がいいのかな
626:デフォルトの名無しさん
22/03/27 19:51:02.70 7EXZAGuD0.net
昔のSeleniumはChromeの方にも拡張機能入れて…とかだった気がするけど今は事前準備も書くのも凄く簡単になってるね
627:デフォルトの名無しさん
22/03/27 19:59:57.15 2Abk94v90.net
>>614
100%切り替えた方が良い
ちょっと癖があるけど、cssセレクタ覚えればアホみたいに楽になるぞ
ちなみにXPathはしんどい
628:デフォルトの名無しさん
22/03/27 20:17:18.33 Df2KiTxu0.net
質問です。
連想配列に格納した連想配列の値を取り出すには
どうしたらよいのでしょうか?
Dim dicA as Dictionary
Dim dicB as Dictionary
dicB.Add "a",100
dicB.Add "b",100
dicB.Add "c",100
dicA.Add "A",dicB
としたとき、dicAの中のdicB("b")の値を取得したいとき
どうしたらいいのでしょうか。
Debug.print dicA("A").("b")
とかで出せるかと思ったのですが駄目でした。
629:デフォルトの名無しさん
22/03/27 20:19:01.83 uW5IEa4H0.net
set TikuB = dickA("A")
Tikubi("b") = bibibibibi-----
630:デフォルトの名無しさん
22/03/27 20:22:07.59 EN8vWua40.net
>>610
For EachなのにIfで条件指定しないのか
631:デフォルトの名無しさん
22/03/27 20:29:11.49 hNNvtCzu0.net
乳首エロい
632:デフォルトの名無しさん
22/03/27 20:31:09.02 BqsGdBXW0.net
>>617
よく分からんのだけど、Dictionalyって
型宣言しただけで使えるの?
普通に考えると、
Set dic A = New Dictionaly
Set dic B = New Dictionaly
とか、必要そうに見えるけど。
633:デフォルトの名無しさん
22/03/27 20:33:33.24 BqsGdBXW0.net
おっと、Dictionalyのスペルが違ってるか
Dictionaryかすまんこ
634:デフォルトの名無しさん
22/03/27 20:45:16.14 Df2KiTxu0.net
元の文と違いますが解決しました。
ありがとうございました。
Sub foo()
Dim dicA As Dictionary: Set dicA = New Dictionary
Dim dicB As Dictionary: Set dicB = New Dictionary
Set dicA("A") = dicB
dicA("A")("a") = "test"
Debug.Print dicA("A")("a") 'test
End Sub
635:デフォルトの名無しさん
22/03/28 01:22:22.67 LEJNBveMa.net
("A")
636:デフォルトの名無しさん
22/03/28 02:04:12.07 dJWBHkZn0.net
(:; U: ::)
637:デフォルトの名無しさん
22/03/28 07:56:32.13 bggr0gZp0.net
Selenium Webdriver と、
Chrome の拡張機能・Selenium IDE の2種類ある
638:デフォルトの名無しさん
22/03/28 07:57:45.06 W5FkPi4A0.net
Selenium Webdriver
639:デフォルトの名無しさん
22/03/28 12:34:55.90 DkLhkvc4M.net
ウェブダイバー
640:デフォルトの名無しさん
22/03/28 13:29:17.84 9Kb03WZY0.net
ウェブダイバーはカラオケで歌うぞ
641:デフォルトの名無しさん
22/03/28 18:29:52.50 jKre83rL0.net
>>623
今更だけど
Dim dicA As New Dictuonary
みたいに普通に1命令で設定しなかったのは何故?
642:デフォルトの名無しさん
22/03/28 18:47:34.87 2Ad/srHwa.net
横からだけど
For ...
Dim D As New Dictionary
...
Next
ってやると最初の一回しかNewしないから常に
Dim D As Dictionary: Set D = New Dictionary
ってやる人はいるみたい
643:デフォルトの名無しさん
22/03/28 18:55:38.23 jKre83rL0.net
>>631
いやいや、ループでそれぞれ別インスタンスとして使うにしても、定義は1回でNewするのが複数回で済むでしょ。
例えば上のレスのようにDictionaryにDictionaryを格納する場合でもDictionaryにしまった時点で参照は渡されるんだから消えないし、
その後、Newしてまた渡してやればインスタンスはまた別物として扱われるよね。
644:デフォルトの名無しさん
22/03/28 19:07:54.06 AcTRGxgL0.net
コードで語ればいいのに
645:デフォルトの名無しさん
22/03/28 19:46:09.16 W5FkPi4A0.net
>>630
知らなかっただけじゃないか
646:デフォルトの名無しさん
22/03/28 19:46:21.63 jKre83rL0.net
>>633
Sub hoge()
Dim dic1 As Scripting.Dictionary
Dim dic2 As Scripting.Dictionary
Dim itemCounter As Long
Set dic1 = New Scripting.Dictionary
For itemCounter = 0 To 3
Set dic2 = New Scripting.Dictionary
dic2.Add 0, "fuga" & CStr(itemCounter)
dic1.Add itemCounter, dic2
Next
For itemCounter = 0 To 3
Debug.Print dic1(itemCounter)(0)
Next
End Sub
出力結果:
fuga0
fuga1
fuga2
fuga3
dic1の中にdic2を入れてるけど、dic2の変数自体は使いまわし。
dic2はループの中でNewされているけど、dic1の中にそのときの
dic2の参照情報が格納されているため、きちんと別の値が保持される。
つまりはそういうこと。
647:デフォルトの名無しさん
22/03/28 19:51:37.75 BH9MBdK/a.net
↑ こいつは一体何を説明してるんだろう…
648:デフォルトの名無しさん
22/03/28 19:53:39.70 nzzJclxc0.net
みんな教え方バラバラだから質問者が困ってるよー
649:デフォルトの名無しさん
22/03/28 20:06:46.75 GBAIeVpDp.net
>>636
分からないならすっこんでればいいんじゃないかな
650:デフォルトの名無しさん
22/03/28 20:07:19.86 jdteRYNZd.net
実務ではよくある話
651:デフォルトの名無しさん
22/03/28 21:12:23.25 DlrSWjY+a.net
>>637
>>617の質問は解決してるし、>>630
の質問は>>634が一番ありそうだし
困ってる質問者って誰?
>>638
そうだねw
652:デフォルトの名無しさん
22/03/29 00:49:06.48 zHBdUnr/a.net
>>638
うるさい、だまってればいいんじゃないかな
653:デフォルトの名無しさん
22/03/29 01:38:58.63 YOHlvasK0.net
まあ、知らなかっただけって可能性が高いんだが
DimでNewしてるオブジェクト変数はNothingにできないって罠があるからな
そして今更だが、VBAにDictionaryはないぞ、と
654:デフォルトの名無しさん
22/03/29 06:28:42.33 z3WwGups0.net
>>642
nothingに出来ないってどういう事だ?
以下のコード、間違えてるんだろうか
Sub foo()
Dim a As New Collection
Set a = Nothing
End Sub
655:デフォルトの名無しさん
22/03/29 07:06:07.15 YJRadFF90.net
>>643
URLリンク(thom.hateblo.jp)
656:デフォルトの名無しさん
22/03/29 07:24:06.81 Nk63wsBAa.net
それをNothingにできないと言うか?
657:デフォルトの名無しさん
22/03/29 07:25:09.72 z3WwGups0.net
>>644
量子論で草
nothingできるけど元に戻る、vbaの狂気を垣間見た気がする
658:デフォルトの名無しさん
22/03/29 08:16:28.05 JuGZiW1lM.net
dictionaryって連想配列だろ
VBA的にはマスタの代わりか、重複を避けて集計するぐらいしか使わないイメージ
だからここで問題にされてることってどうでもいい気もするけどなw
>>602
お前の質問に答えられるレベルに人はここにはいないだろw
海外のサイトで質問するほうがいいよ
659:デフォルトの名無しさん
22/03/29 08:48:32.13 ZoTD6ZCz0.net
そもそもVBAのオブジェクト型は参照カウンタ方式だから、Nothingの代入はオブジェクトの破棄じゃないし
破棄の予約とでも言えばいいのかな
システムは予約が入ってるかどうか定期的にチェックして、可能なら破棄する
実際に破棄するタイミングはシステムが勝手に決めて、いつのまにか予測不可能なタイミングで破棄されてる
ところで破棄のアルゴリズムって公開されてる?
あるいは誰かが解析した資料がどっかにある?
660:デフォルトの名無しさん
22/03/29 08:57:03.34 91VKkhT6M.net
カウントゼロで破棄だろ
説明するまでもない
661:デフォルトの名無しさん
22/03/29 08:58:53.63 TzrFOdrRd.net
>>648
トレーシングGCと参照カウントがごっちゃになってるのかな
参照カウントは基本的に参照が外れたら即破棄
662:デフォルトの名無しさん
22/03/29 10:42:09.75 YJRadFF90.net
この辺、VB.Netとかの他言語でCOMオブジェクトの解放とかやってないと想像つきにくいよね。
そういうの知ってても面倒くさいし、サーバーサイドでEXCEL自体ないこともあるから
あの手この手で別の方法使ってEXCELの更新行おうとするよね。
663:デフォルトの名無しさん
22/03/29 11:13:32.55 DZfi33jJd.net
想像というよりやるべき作法をわからずに適当に作るからでは
使ったら解放するものは何か理解していれば間違えないでしょ
適当にここでNothingすればいいやとか思ってるから問題がおきてしまう
664:デフォルトの名無しさん
22/03/29 11:35:23.69 4eDRgxgoM.net
>>602
Salesforce CLIを呼び出してCSV等に出力し、それを読み込めばいい
VBAから直接APIを呼ぶのは自前でパースしなきゃいけなくて面倒だぞ
665:デフォルトの名無しさん
22/03/29 12:59:23.02 YOHlvasK0.net
>>643
Set a = Nothing
のあとに
MsgBox (a Is Nothing)
とかやってみ
問題にしてるのはオブジェクト変数をNothingにできないことで
つまり
Set obj = Checkobj()
If obj Is Nothing Then
みたいなコードがバグるってことなんだが
>>648
インスタンスの解放とか問題にしてないが
破棄の予約ってなんなんだよ
Nothingの代入は単に参照カウンタを減らすだけだぞ
結果カウントゼロなら廃棄される
.Netじゃないし、VBAで
>システムが勝手に決めて、いつのまにか予測不可能なタイミングで破棄されてる
なんてことはないはず
666:デフォルトの名無しさん
22/03/29 13:35:16.03 oJxqSb9ha.net
>>654
> Set a = Nothing
> のあとに
> MsgBox (a Is Nothing)
> とかやってみ
>>644のリンク先にも書いてあるけどMsgBox にブレークポイントかけてウオッチウインドで見てみ
Nothing にできないことと、Nothing の時に参照されたら New されると言うのは違う
667:デフォルトの名無しさん
22/03/29 13:45:44.59 YOHlvasK0.net
>>655
ああ、そうだな
オブジェクト変数をNothingにできない
は
(VBAコードから)オブジェクト変数をNothingとして評価できない
に訂正しとくわ
668:デフォルトの名無しさん
22/03/29 13:49:11.35 DZfi33jJd.net
>>654
バグるんではなく自分でバグらせてるだけでしょ
Dimで変数を宣言する際にNewを付与するとヘルプのこちらの記載
「オブジェクト変数の宣言時に New を使用すると、その変数を最初に参照したときにオブジェクトの
新しいインスタンスが作成されるようになり、Set ステートメントを使用してオブジェクト参照を
割り当てる必要がなくなります。」
にある通り変数を参照する限りはNothingにすることはできない
(デバッグで変数を参照してしまっても同様)
変数がNothingか判定したいなら素直に宣言の際はNewを使わなければいいだけ
Newをどういうときに使うとコーディング上効果的かわからない、他人が理解�
669:ナきないかもしれないなら使わないほうがいい
670:デフォルトの名無しさん
22/03/29 13:53:26.54 /B8eDHF6d.net
>>656
評価って表現もなんかおかしくない?
Nothingになっていることを確認できない、とか
671:デフォルトの名無しさん
22/03/29 14:15:22.73 YJRadFF90.net
でもこれ、ちょっと怖いよね
Dimの宣言時にNewしてやると、Nothingにしたら次触るとき、インスタンスが設定されていなければ
勝手に新しいインスタンスを設定するなんて
知らなかったら分岐に Is Nothingとか使いそうだし、知ってたら知ってたでSet ~ As New ~の代わりに使って、知ってる人じゃなければ分からないような属人化コードわざと書いたり出来るってことだもんね。
.Netとかでも同じような挙動をするのかな?
672:デフォルトの名無しさん
22/03/29 14:49:39.05 DZfi33jJd.net
怖いもなにもヘルプに書いてあることを理解せずに伝えたりそれを聞きかじっただけでやるからでしょ
質問する側も答える側も一部分だけのやり取りしてるのを踏まえて会話しないと事故のもとだよ
まあ事故るのは質問する側だけなんで答える側はそこまで保証できないが
673:デフォルトの名無しさん
22/03/29 15:00:51.71 5Hfxlu6fa.net
>>657
> 「オブジェクト変数の宣言時に New を使用すると、その変数を最初に参照したときにオブジェクトの新しいインスタンスが作成されるようになり、Set ステートメントを使用してオブジェクト参照を割り当てる必要がなくなります。」
から
> 変数を参照する限りはNothingにすることはできない
と言うのは飛躍しすぎ
問題はそっちじゃなくて
> 「必ずオブジェクトが存在することが保証される (Nothing を設定してオブジェクトが破棄されたとしても、オブジェクト変数を再利用しようとすると、再作成される)」
の方な
ただ個人的には上記の文で「オブジェクトが破棄されたとして」のくだりは余計だと思う
複数から参照されてたらオブジェクト自体は破棄されないから
674:デフォルトの名無しさん
22/03/29 15:09:04.14 DZfi33jJd.net
Nothingしてもその後に”変数を参照した”らNothingが再作成されたインスタンスに変わるんだからできないと一緒じゃない?
それと変数とオブジェクトを一緒に考えてないか?
自分は
Dim A As Object
Dim B As Object
Set A = XXX
Set B = A
Set A = Nothing
この場合のAの話をしていてXXXで作成したインスタンスの話はしてないよ
675:デフォルトの名無しさん
22/03/29 15:12:01.06 DZfi33jJd.net
まあどうでもいい話だった無視してくれ
すまん
676:デフォルトの名無しさん
22/03/29 15:23:41.67 YOHlvasK0.net
>>657
元の話はなぜDimでNewしないって話だから
バグのもとだからやめといたほうが良いという、理由の可能性の一つを挙げてるだけだが
実際知っててもミスることはあるし、しらないとデバッグが困難だからな
677:デフォルトの名無しさん
22/03/29 15:30:09.53 9zoeUatEa.net
>>662
混同してるのはお前さんの方
Aは変数でオブジェクトじゃないぞ
678:デフォルトの名無しさん
22/03/29 15:31:19.17 YOHlvasK0.net
>>662
まあ、Nothingにできないは厳密には確かに違う。Nothing代入できるし
Nothingにならないって言うほうが正しいな
このコンテキストでその違いが重要か?とは思うが
679:デフォルトの名無しさん
22/03/29 15:54:16.92 ffasCIjOa.net
>>666
違いは重要じゃないけど
> Nothingにならないって言うほうが正しいな
と言う明らかな間違いを言い続けるのはどうかと思うぞ… ⇒ >>655
680:デフォルトの名無しさん
22/03/29 18:10:12.28 OyTS9aq30.net
列ではなく、選択した箇所だけを固定したいのですが出来ませんか?
681:デフォルトの名無しさん
22/03/29 18:32:44.42 ZoTD6ZCz0.net
>>666
違う
代入すればNothingになる
その次にアクセスすると、またそのタイミングで自動的にNewされる
682:デフォルトの名無しさん
22/03/29 18:52:31.36 DZfi33jJd.net
各自が想定してるコードが違うんだから言葉遊びにすぎないよ
自分のレスもいまいちだったかもしれんがNothingをセットして終了するならNothingかもしれないが
後続のコードにIs Nothingなり変数の参照があるならそれは結果的にNothingではなくなるのと一緒と自分は思ってるだけ
例に出して申し訳ないが
> Set a = Nothing
> のあとに
> MsgBox (a Is Nothing)
これとかね
自分なりの結論は宣言時にNewは使わないほうが無難
683:デフォルトの名無しさん
22/03/29 19:12:31.97 YOHlvasK0.net
>代入すればNothingになる
>その次にアクセスすると、またそのタイミングで自動的にNewされる
厳密にはその通り
そんなことは分かったうえで、それをコード上で確認できないから
Nothingにならない と表現したわけで、その表現が間違いらしいですわ
(VBAコードから)オブジェクト変数をNothingとして評価できない
すべての個所をそう読み替えといてくれ
飽きたし俺はこの話はもうこれで終わり
684:デフォルトの名無しさん
22/03/29 19:15:45.64 YJRadFF90.net
まぁ>>670の言う通り言葉遊びだよね
みんな実際の挙動は理解しての会話になってるみたいだし
685:デフォルトの名無しさん
22/03/29 19:19:18.21 y+mxjJK80.net
まあオレは今まで知らなかったけどな!
686:デフォルトの名無しさん
22/03/29 19:32:15.47 /IcSX3Pk0.net
>>644
おれ以外にもthom先生見てる人いたか
687:デフォルトの名無しさん
22/03/29 20:35:52.45 TgcL8J/yM.net
どう見ても最初はわかってなかったやろ
最後にやっと理解できたみたいだけど
688:デフォルトの名無しさん
22/03/29 21:25:13.63 YV5lTWI/0.net
人に優しく行きましょう
それは分かる人に与えられた特権なのです
689:デフォルトの名無しさん
22/03/30 05:40:49.56 bXpTryOw0.net
人生は優しくなるためにある
690:デフォルトの名無しさん
22/03/30 08:23:09.21 0ps204vGM.net
スマホ手打ちなので誤字等ありましたらすみませんがよろしくお願いします。
rangeを用いた範囲指定でcells(row,columns)の行、列の部分に端数切り上げで数式を入れたいと考えています。
vbaで roundupを用いる時はworksheetfunction.をつける必要があることをネットで知ったのですが、ページによって頭にapplication.をつけてるものとそうでないものが混在しました。有無によってどのような違いがあるのか教えてください。
691:デフォルトの名無しさん
22/03/30 08:47:30.52 06EhkzBAd.net
数式を入れるのかワークシート関数を使って値をいれたいのかよくわからないけど
後半の質問であればVBA上では動作に違いはないよ
「URLリンク(docs.microsoft.com)(object)」の
「アクティブ セル (ActiveCell プロパティ) など、最も一般的なユーザーインターフェイス オブジェクトを返すプロパティとメソッドのほとんどは、Application オブジェクト修飾子を指定しないで使用できます。」
と書いてある通り
こういう質問する前にヘルプを見ると知りたい事や知っておいたいいことが書いてる場合もあるし怪しい回答の知識を覚えなくて済むから見る癖つけたほうがいいぞ
692:デフォルトの名無しさん
22/03/30 08:54:37.31 6Q6BE8PxM.net
>679
ありがとう、参考にします。
693:デフォルトの名無しさん
22/03/30 09:15:22.27 p8/VPuFXr.net
いえいえ
694:デフォルトの名無しさん
22/03/30 10:25:12.15 otm0Hfbh0.net
実際に組んでみてうまく行かない場合に調べるとか質問とかしたらいいと思う
695:デフォルトの名無しさん
22/03/30 10:38:48.27 xL2+oAob0.net
ちょっと教えてください
複数のシートを一緒にスクロールして
常に同じ位置に同じ行列が表示させられるような移動方法ってありますか?
例)
シート1~シート10までをグループ化して
シート1をスクロールして1000行目を頭に表示すると
残りのシート2~シート10も同じように1000行目を表示している
よろしくお願いします
696:デフォルトの名無しさん
22/03/30 14:07:54.57 4QxrGADI0.net
裸の王様がやってきた やってきた やってきたぞ
697:デフォルトの名無しさん
22/03/30 19:23:16.04 QNA9H61R0.net
>>683
いったんアクティブにしていいなら
Application.GotoとかWindow.ScrollIntoViewとかで表示位置は変えられるけど
まあ使い物にならない可能性が高いな
アクティブじゃないシートのスクロール位置を変える方法があるなら俺も知りたい
それかWindow10個作って同時にスクロールにするとか
698:デフォルトの名無しさん
22/03/30 19:31:25.53 ljpoek3c0.net
複数のシートのデータを纏めたシートを作ったらどうかな
699:デフォルトの名無しさん
22/03/30 19:32:55.87 2JfZorGz0.net
スクロールのイベントってないんか
クリックしたセルを同じにするマクロ
なんじゃこりゃ
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Sheet1" Then
Sheets("sheet2").Select
Sheets("sheet2").Cells(Target.Row, Target.Column).Select
Sheets("sheet3").Select
Sheets("sheet3").Cells(Target.Row, Target.Column).Select
Sheets("sheet1").Select
End If
End Sub
700:デフォルトの名無しさん
22/03/30 19:47:16.20 R9seM6Mc0.net
馬鹿が考えた操作なんて実装しても、所詮馬鹿の馬鹿な発想でしかない
701:デフォルトの名無しさん
22/03/30 22:06:13.73 wN+Ljz7f0.net
>>687
フォーム内のスクロールバーはイベント取得できるぽい
そういうのでいいならフォーム内スクロールバーに従ってシートをスクロールさせることはできそう
もしくはシート1のスクロールを監視して自分でイベント発行するか
702:デフォルトの名無しさん
22/03/30 22:25:38.10 N270RWsC0.net
彼女の下のお口から出る糸を、シート(She糸)と呼びます
703:デフォルトの名無しさん
22/03/30 22:25:54.14 2JfZorGz0.net
>>689
逆にスクロールを実装すればよかったのね
下スクロールを実装したら期待通りの動きになったわ
Sub Macro4()
' Keyboard Shortcut: Ctrl+Shift+P
Windows("Book1 - 1").Activate
ActiveWindow.SmallScroll Down:=30
Windows("Book1 - 2").Activate
ActiveWindow.SmallScroll Down:=30
Windows("Book1 - 3").Activate
ActiveWindow.SmallScroll Down:=30
End Sub
704:デフォルトの名無しさん
22/03/31 04:24:20.35 YoVJ22V0M.net
糸を出す女ってスパイダーガールか
705:デフォルトの名無しさん
22/04/01 07:19:21.13 fdMR9HVCM.net
宗教的な話題になりそうだけど、If文で判定入れてそれ以外の場合は何もしないって処理の時、elseを省く?それとも何も処理をしないって明示するためにelseの中に何も書かない?
706:デフォルトの名無しさん
22/04/01 08:08:06.08 AJ0kjIG/a.net
俺は省く
逆に Select Case の Case Else は必ずつけて何もしなくていいことを明示するコメントを書いておく
707:デフォルトの名無しさん
22/04/01 08:13:36.66 YZ/4IsUH0.net
こういう書き方ってどうにかしてうまくまとめる方法はありますか?
if C=1 then
if B=1 then
if A=1 then
msgbox "メイン処理を実行します"
else
msgbox "A=1じゃなかったので実行しなかった"
else
msgbox "B=1じゃなかったので実行しなかった"
else
msgbox "C=1じゃなかったので実行しなかった"
708:デフォルトの名無しさん
22/04/01 08:33:32.40 cX1o4aeta.net
>>695
If C <> 1 Then
msgbox "C=1じゃなかったので実行しなかった"
Goto Skip
End If
If B <> 1 Then
msgbox "B=1じゃなかったので実行しなかった"
Goto Skip
End If
If A <> 1 Then
msgbox "A=1じゃなかったので実行しなかった"
Goto Skip
End If
msgbox "メイン処理を実行します"
Skip:
Goto 嫌なら Sub に入れて Return とか
709:デフォルトの名無しさん
22/04/01 09:19:19.95 qbFmdfWP0.net
>>695
ネスト深くなるとわかりにくい
処理は簡単な単位でまとめたほうがいい
実行する/しないは一つの単位(success/errorのように)としてまとめたほうがいい
拒否理由="なし"
if c<>1 then 拒否理由="cじゃない"
else if b<>1 then 拒否理由="bじゃない"
else if a<>1 then 拒否理由="aじゃない"
if 拒否理由="なし"
メイン処理
else
msgbox 拒否理由&"ので実行しません"
710:デフォルトの名無しさん
22/04/01 19:02:13.39 qNIRpAbL0.net
わかりにくいってだけで正常に動作しているならコメントでも書いとけばいいんじゃね
711:デフォルトの名無しさん
22/04/01 19:04:18.25 iXF+QXI0M.net
>>696
do loop 0でブレイク
712:デフォルトの名無しさん
22/04/02 10:46:13.39 fjGlq1dk0.net
>>697
おれもこんな感じだな
Elseifは好きじゃないからSelectCaseかなあ
713:デフォルトの名無しさん
22/04/02 12:32:39.80 wbru5aYXa.net
VBA の Select Case は Case 節に式が書けるから素直に
Select Case True
Case C <> 1
msgbox "C=1じゃなかったので実行しなかった"
Case B <> 1
msgbox "B=1じゃなかったので実行しなかった"
Case A <> 1
msgbox "A=1じゃなかったので実行しなかった"
Case Else
msgbox "メイン処理を実行します"
End Select
がわかりやすいかな
714:デフォルトの名無しさん
22/04/02 13:02:04.64 ZSAOoecqp.net
>>701
俺もこんな感じにするかな
C#とかと違って;で止められないけど
まぁそれはそれとして。
715:デフォルトの名無しさん
22/04/02 19:50:51.52 xmwnc1Js0.net
複数の条件が成り立つ場合の優先度とか気にせんと・・・
716:デフォルトの名無しさん
22/04/02 20:08:08.57 rQp/oHNqa.net
>>703
なんでドキュメント読まないの?
複数の Case 句の expressionlist 式に一致する場合は、最初に一致した句に続くステートメントのみが実行されます。
URLリンク(docs.microsoft.com)
717:デフォルトの名無しさん
22/04/03 00:02:19.90 ZgXClf4M0.net
A=1かつB=1かつC=1だったらXが実行されるって言う事ではないのね
なんかややこしいね(´・ω・`)
718:デフォルトの名無しさん
22/04/03 03:01:36.86 J74pUyNp0.net
俺は中身が1行の時はCaseを1行にまとめる派
Sub Macro()
Select Case True
Case C <> 1: errmsg ("C")
Case B <> 1: errmsg ("B")
Case A <> 1: errmsg ("A")
Case Else: MsgBox "メイン処理を実行します"
End Select
End Sub
Sub errmsg(s$)
MsgBox s & "=1じゃなかったので実行しなかった"
End Sub
719:デフォルトの名無しさん
22/04/03 06:50:49.06 o4u0MtXma.net
>>706
errmsg の呼出時の括弧は要らないのでは?
720:デフォルトの名無しさん
22/04/03 07:52:44.68 6Vj/pyuu0.net
>>706
こういうふうにはしないほうが良い?
Sub Macro()
Select Case True
Case C <> 1: msg ="C"
Case B <> 1: msg ="B"
Case A <> 1: msg ="A"
Case Else: msg= "メイン処理を実行します"
End Select
End Sub
msgbox(msg)
721:デフォルトの名無しさん
22/04/03 08:39:48.32 D1zTFGCZM.net
そうやって本筋じゃない方へ話題は逸れていく
722:デフォルトの名無しさん
22/04/03 09:01:58.41 Uf1/B9Ep0.net
Subの場合は
括弧を付けるならCallも付ける
Callを付けないなら括弧も付けない
それだけ
723:デフォルトの名無しさん
22/04/03 09:05:23.70 r53Jbhkva.net
>>708
> こういうふうにはしないほうが良い?
うん、それだと C = 2 でテストしたら単に C って表示されるだけだし
724:デフォルトの名無しさん
22/04/03 09:06:11.26 6Vj/pyuu0.net
>>709
今回はどんどん話を膨らませていいよ
725:デフォルトの名無しさん
22/04/03 10:18:01.32 spDayutJd.net
僕が考えた最高のコード
ってやつだろこんな話題にくいつくのもはずいわ
726:デフォルトの名無しさん
22/04/03 10:39:12.57 6Vj/pyuu0.net
>>708は間違いね
こういう風に、メッセージの中だけ変数に入れて最後で表示させるってのはやめたほうがいいでしょうか
Sub Macro()
Select Case True
Case C <> 1: msg ="C=1じゃなかったので実行しなかった"
Case B <> 1: msg ="B=1じゃなかったので実行しなかった"
Case A <> 1: msg ="A=1じゃなかったので実行しなかった"
Case Else: msg= "メイン処理を実行します"
End Select
End Sub
msgbox(msg)
727:デフォルトの名無しさん
22/04/03 10:49:41.47 LxaPNz9fM.net
好きにすればいい
728:デフォルトの名無しさん
22/04/03 12:48:35.67 AxYcslms0.net
>>714
実行しなかったって表示するのに実行しそうだな
729:デフォルトの名無しさん
22/04/03 13:26:31.81 mz7mxvwZp.net
しねーよハゲ
730:デフォルトの名無しさん
22/04/03 15:21:18.52 4YOQBH220.net
お前ら頑張ってるけど
メッセージなんかただの処理サンプルだろうから
>>701が採用されそうだけどね
731:デフォルトの名無しさん
22/04/03 15:52:40.85 vYlFEoJTd.net
実際の仕様でもなんでもない話に採用もクソもないのでは
好きにすればいいはなし
732:デフォルトの名無しさん
22/04/03 17:28:53.57 m8vuVm8ra.net
話題に食いつくのははずいのに批判だけはするんだな
てか、批判しかできないのかなw
733:デフォルトの名無しさん
22/04/03 17:42:03.95 6Vj/pyuu0.net
草
734:デフォルトの名無しさん
22/04/05 23:43:32.11 4aElhsU0a.net
>>714
最高のコード
735:デフォルトの名無しさん
22/04/07 20:06:13.11 k57kmbe60.net
>>722
End Sub の下に msgbox(msg) があるのに?
736:デフォルトの名無しさん
22/04/07 20:57:01.15 WZu7hIyw0.net
やっと書き込めた。
BB2Cが死んでJane Stileとかいうアプリで書き込んでるけど、VBAスレもその煽りかめっきり書き込み減ってるね。
737:デフォルトの名無しさん
22/04/07 22:52:18.94 shKfmndDa.net
>>723
最(もお茶が)高(く噴き出た)のコード
738:デフォルトの名無しさん
22/04/08 09:32:33.40 P5V0Axif0.net
ハイパーリンクで、他のファイルを開こうとすると、警告ダイアログが出ますが、
(「ファイルには、ウイルスやコンピューターに問題を…」)
非表示にできますか?
レジストリでDisableHyperlinkWarningをやっても、ダメでした…。
739:デフォルトの名無しさん
22/04/08 09:48:16.01 O75PAQWK0.net
ユーザーフォームに設置したボタンをクリックすると
Private Sub ~~~_Clickのイベントプロシージャが追加されますが、
このコードの追加位置はどういう基準で決まっていますか?
すぐ隣のボタンのClickの近くに挿入されることもあれば、
結構離れた位置に挿入されることもあります。
740:デフォルトの名無しさん
22/04/08 18:32:41.81 DozpoMh4a.net
質問は一人一つまで。
741:デフォルトの名無しさん
22/04/08 19:07:30.71 aNhRPKRk0.net
>>726
ウイルスでも作っているの?
742:デフォルトの名無しさん
22/04/08 19:44:29.30 p3Omju050.net
エクセルVBAでウイルスを作ることはできますか?
エクセルVBAでAIを作ることはできますか?
743:デフォルトの名無しさん
22/04/08 19:49:56.82 0/Kcf5P10.net
>>726
試してないから出来るか分からんけどディスプレイアラートは?
744:デフォルトの名無しさん
22/04/08 19:59:37.27 iHtexTHZ0.net
>>730
直クライアントだからな
余裕で出来る
745:デフォルトの名無しさん
22/04/08 20:10:13.83 cwm3b4Q1d.net
>>730
はい
はい
746:デフォルトの名無しさん
22/04/08 20:43:11.43 p3Omju050.net
>>732
でもおまえウイルスの作り方わからないじゃん
747:デフォルトの名無しさん
22/04/08 20:59:12.69 AMkeYZ900.net
ウィルスの定義は「操作する人が意図しない動作を起こすプログラム」
だから空白のボタン押すと背景の色が変わるとかそんなんでもウィルスです
748:デフォルトの名無しさん
22/04/08 21:53:49.35 iHtexTHZ0.net
やっとBB2Cが使えるようになった
>>734
煽ってもダメ
ウイルスなんて作らないし
作り方だって載せるつもりはないよ
749:デフォルトの名無しさん
22/04/08 22:14:19.86 AMkeYZ900.net
>>736
いやもう作り方載せたって>>735
750:デフォルトの名無しさん
22/04/08 22:18:44.47 7fG2FYL40.net
ヤンキー・ドゥードルが懐かしい
751:デフォルトの名無しさん
22/04/09 00:48:37.33 C63TJhml0.net
AIの定義が明確に定まってないので自己学習して勝手に洗練されていくものもAIだしただのマクロもAI
752:デフォルトの名無しさん
22/04/09 00:55:30.60 tyw5ZPAK0.net
AIは作るものじゃない
育むものなんだよ
753:デフォルトの名無しさん
22/04/09 02:28:28.01 FQQX8rtBa.net
>>736
もうすでにウイルスのソースコード載ってますが?
>>714
754:デフォルトの名無しさん
22/04/09 06:04:10.90 +bGajSMm0.net
任意の列が左端に来るように水平スクロールする方法ってある?
Application.Gotoで左端に寄せてSmallScrollで上下位置を調整してるけど完全な水平スクロールにはならないんだよね
755:デフォルトの名無しさん
22/04/09 07:34:48.36 Dec5MFVZ0.net
With ActiveWindow
.ScrollRow = x
.ScrollColumn = y
End With
756:デフォルトの名無しさん
22/04/09 08:12:43.36 +bGajSMm0.net
>>743
それも試したけど、アクティブセルが変わると数値が変わらない?
757:デフォルトの名無しさん
22/04/09 08:52:12.11 +bGajSMm0.net
任意の列とアクティブセルの列の差を求めればScrollRowで行けるかな?
今度試してみよう
758:デフォルトの名無しさん
22/04/09 11:14:24.15 Mfv2lAJId.net
Sub World()
Dim Abe As Virus
Set Abe = New prime minister
Abe.coin.End(xldown)
Abe.tax.End(xlup)
Abe.wing.End(xlright)
End World
759:デフォルトの名無しさん
22/04/09 12:54:27.64 FQQX8rtBa.net
で、誰かがズームしたりページレイアウト変えたりして、
トラブルの元になると。
ウィンドウ系はいじらない方がいいと
職場のおじいちゃんが言ってた。
760:デフォルトの名無しさん
22/04/09 13:45:19.95 6rDUdJJw0.net
アース、ファイア、ウォータ系の属性のほうがいいかもね
761:デフォルトの名無しさん
22/04/09 14:39:59.55 FQQX8rtBa.net
Excel VBA の Window 関連のオブジェクトって、船に刻して剣を求むって感じ
走っている電車の中から、指で窓ガラスに風景を描くみたいな
762:デフォルトの名無しさん
22/04/09 15:26:28.03 +bGajSMm0.net
さっぱり例えが分からんw
763:デフォルトの名無しさん
22/04/09 16:04:42.29 2h0/Yyo40.net
詩的すぎるだろw
764:デフォルトの名無しさん
22/04/09 18:41:50.44 8cH1hwr70.net
>>749
なるほど納得。
納豆食う。
765:デフォルトの名無しさん
22/04/09 20:23:31.13 8/Ft6Y7L0.net
日本人だけど意味がさっぱりわからんw
766:デフォルトの名無しさん
22/04/09 22:16:01.68 XcpxlUbda.net
ごめん失敗したテヘ
767:デフォルトの名無しさん
22/04/10 01:02:21.87 tD6svEJl0.net
ヘッドレスChromeをseleniumやWebdriverなしでどうにかなりませんか?
768:デフォルトの名無しさん
22/04/10 19:56:53.98 anoG1hsda.net
>>755
UiPathおすすめ
769:デフォルトの名無しさん
22/04/11 21:59:21.11 Kyp6sDnX0.net
オブジェクトの代入を同一プロジェクトで使いまわすことはできるでしょうか?
Public ws1 as worksheet
Module1
Sub test1()
Set ws1 = Worksheets("Sheet1")
ws1.Range("A1") = "Test1"
End Sub
Module2
Sub test2()
Set ws1 = Worksheets("Sheet1")
ws1.Range("A2") = "Test2"
End Sub
これを下記のようにできないかな、ということです。
Public ws1 as worksheet
Set ws1 = Worksheets("Sheet1")
Module1
Sub test1()
ws1.Range("A1") = "Test1"
End Sub
Module2
Sub test2()
ws1.Range("A2") = "Test2"
End Sub
770:デフォルトの名無しさん
22/04/11 22:26:56.33 p2QF/trT0.net
なにがしたいのか
771:デフォルトの名無しさん
22/04/11 22:56:21.06 7xr/cYmKd.net
オブジェクトは無理でしょ
Funtionで対応すれば良い
最もそうしない方が良いからデフォで出来ないようになってることは考慮すべきだと思う
772:デフォルトの名無しさん
22/04/11 23:25:19.91 9dLPe5470.net
ん
773:?そもそもワークシートってオブジェクト化されてるんだからわざわざ変数にセットする必要なくない? 対象のシートがコードを書いているファイルにあるなら Sheet1.Range("A1").Value = "Test1" で良いでしょ?
774:デフォルトの名無しさん
22/04/11 23:56:27.01 Kyp6sDnX0.net
簡略化するためにThisworkbookを省略して書きましたが、実際には
マクロ動作中にほかのブックを触っても大丈夫且つコードがすっきり
するようにSet ws1 = Thisworkbook.Worksheets("Sheet1")のように
しています
少し時間ができたので増築増築でややこしくなったコードを整理している
最中で、複数のプロシージャで使う固定のシートはまとめて変数にセットして
おこうかと思ったのですがFunctionで調べてみます、ありがとうございます
775:デフォルトの名無しさん
22/04/11 23:58:43.07 amT3mnzR0.net
変数を使いまわす(というか広域で使う)のは普通にできる
モジュールレベルでPublic変数定義するだけ
なんならモジュール名で修飾してもいい
ただ、変数の寿命が管理しにくいから、
中身がセットされてないとか、いつの間にか中身が消えてるとかいうことになるかもなw
776:デフォルトの名無しさん
22/04/12 00:23:20.44 ccOkbRo70.net
シートをオブジェクト名で指定すればどのブックを触っていようがそのコードが書いてあるブックから参照すると思うのだけど
>>761 がやろうとしてる事って他のブックのシートを変数に収納したい場合しか使わなくないか?
777:デフォルトの名無しさん
22/04/12 02:00:50.12 vEgugssg0.net
>>763
一部のメソッドでオブジェクト名を省略できないのがあるじゃん
自分がちゃんと理解してないのが原因なのはわかってるけど、構文とかデフォルトのオブジェクトとかいちいち覚えるのが面倒くさいんだわ
778:デフォルトの名無しさん
22/04/12 06:30:21.52 j+U2fOIu0.net
やるならこうか?
init()に色々初期化みたいなものをまとめて、毎回呼び出す
Public ws1
Sub init()
Set ws1 = Worksheets("sheet1")
End Sub
Sub foo()
Call init
Cells(1, 1) = 1
End Sub
Sub foo2()
Call init
Cells(2, 2) = 2
End Sub
779:デフォルトの名無しさん
22/04/12 06:46:39.08 da5RcI7d0.net
汎用性と独立性を確保するなら引数でシートを渡せ
780:デフォルトの名無しさん
22/04/12 07:15:19.69 t+9U/8lg0.net
>>757
初心者がかち当たるあるある疑問だよね。
最初は>>762の言う方法でやってみればいいと思うよ。
もう少しやり込んでくればデバッグし易くするためにモジュールスコープレベルのPrivateな変数をPublicな関数やプロパティでやり取りするようになるんだけどね。
781:デフォルトの名無しさん
22/04/12 07:20:31.49 j+U2fOIu0.net
こういうイメージ?
よく考えたらpublicにする必要性が全くない
Sub init()
Set ws1 = Worksheets("sheet1")
Set ws2 = Worksheets("sheet2")
Set ws3 = Worksheets("sheet3")
Set ws4 = Worksheets("sheet4")
End Sub
Sub foo()
Call init
ws1.Cells(1, 1) = 1
End Sub
Sub foo2()
Call init
ws2.Cells(2, 2) = 2
End Sub
782:デフォルトの名無しさん
22/04/12 07:21:37.35 j+U2fOIu0.net
と思ったらpublicいるわスコープ他の言語と間違えたわ
783:デフォルトの名無しさん
22/04/12 17:42:54.51 oSnOjvyr0.net
Recordset.openでselect文を実行するとエラーになるけどツールでログに出した物を実行してもエラーにならない時って何が原因?
ダブルクォートは含まれてない
あとはイミディエイトウィンドウに出てくるsqlが変なとこで改行されてるけど関係ないよね?
784:デフォルトの名無しさん
22/04/12 17:45:16.76 pq/BAZJoM.net
シラネーヨ
785:デフォルトの名無しさん
22/04/12 19:22:20.07 D2BP6h+A0.net
742で書いた完全な水平スクロールできたわ
786:デフォルトの名無しさん
22/04/12 19:25:18.42 D2BP6h+A0.net
>>757
Sheet1モジュールに書くだけでは?
787:デフォルトの名無しさん (ワッチョイ c6da-EhK1)
22/04/12 19:48:28 hYDOb6070.net
>>770
それだけで答えられるほどエスパーじゃない
788:デフォルトの名無しさん
22/04/12 19:58:04.86 t+9U/8lg0.net
>>770
まず出力されているエラーは何なの?
789:デフォルトの名無しさん
22/04/12 20:52:44.19 oSnOjvyr0.net
ora 00933
sqlコマンドが正しく終了されていません
が出るんだよね
790:デフォルトの名無しさん (ワッチョイ e2da-vtdv)
22/04/12 21:13:36 cLFsXNmb0.net
そのままのエラー文でググれば一発で回答出てくるぢゃねーか
791:デフォルトの名無しさん (ワッチョイ e24f-EtAN)
22/04/12 21:30:37 t+9U/8lg0.net
>>776
SQLのケツに;付けろってよ
792:デフォルトの名無しさん
22/04/13 01:24:31.19 idY8HIbz0.net
757です、いろいろご意見ありがとうございます
その後考えた結果、シートのオブジェクト名を変数として代入しようとした名前に変えればいいんじゃないかと思いついたんですが問題ないでしょうか
793:デフォルトの名無しさん
22/04/13 03:33:56.70 +aMOkW0p0.net
>>779
シチュエーションにもよるかな。
シート名を変えられてもそのシートを使う前提であればそれでいいんじゃないかな。
その場合、
自ブックのシートであれば
Dim targetSheet As Worksheet
Set targetSeet = 変更後のシートオブジェクト名
みたいに使えるし、
他ブックのシートを扱う場合は
Dim targetSheet As Worksheet
Set targetSheet = ブックオブジェクト.(シートオブジェクト.Name)
みたいに書けば設定出来る。
もっとも、後者の書き方で前者を賄えるから後者だけ関数化してそれを使い回してもいいけどね。
794:デフォルトの名無しさん (ワッチョイ 7b68-xb3m)
22/04/13 07:03:06 CoVp5Ukt0.net
>>779
オブジェクト名はやめたほうが良い。あんまり意味が無い
やるなら、シートの内容を変数名にする
ローマ字
set shain_master = sheet("社員マスター")
日本語許容するなら
set 社員マスタ = sheet("社員マスター")
なおベストは英語
795:デフォルトの名無しさん
22/04/13 07:35:12.98 6wqio091M.net
会社員を英語でなんと言うかがわからんわ
worker(労働者)やemployee(被雇用者)じゃニュアンスが違うしー
辞書なしですぐ出てくるレベルのやつはVBAなんかやってないやろ、という偏見
796:デフォルトの名無しさん
22/04/13 07:37:38.41 CoVp5Ukt0.net
staffでええやろ
797:デフォルトの名無しさん
22/04/13 07:50:17.55 +aMOkW0p0.net
>>782
会社員だから
companyEmployeeでいいんじゃね?
798:デフォルトの名無しさん
22/04/13 07:56:48.50 HWn/7Hddd.net
Google翻訳だとmember
んー、なんかしっくり来ない
799:デフォルトの名無しさん
22/04/13 07:59:18.64 PsKYJxH90.net
staffは関係者ってイメージ
800:デフォルトの名無しさん
22/04/13 08:15:50.97 1kKv9jFRd.net
staffという単語はcompanyと同義で集団に対して使うって日本人は意外とわかってない
801:デフォルトの名無しさん
22/04/13 08:30:55.20 CoVp5Ukt0.net
employee以外ないだろう
802:デフォルトの名無しさん (スプッッ Sd22-eTSu)
22/04/13 08:56:08 wBIIYhTid.net
会社員という表現は英語では難しい
大人しく syachiku か Karoushi_Man にしとけ
803:デフォルトの名無しさん (ブーイモ MM02-CB6w)
22/04/13 09:04:23 YJgAVhDkM.net
業務用語の変数は日本語で業務用語そのものを使ってる
中途半端な英語だと誤解しやすいし、ローマ字は読みづらい
804:デフォルトの名無しさん
22/04/13 10:04:01.74 NHlBNLdW0.net
Accessならお馴染みの「Northwind」のテーブルでは Employee List とか Employee Details
概念としての会社員ではなく、自社の社員リストなので「従業員・使用人」の意で
ま、そのファイルを誰が見る?誰が使う?どこに出す?で適宜に 恥かかない程度で 何だっていいんだろうけれども
805:デフォルトの名無しさん
22/04/13 10:09:02.25 93SXwTUS0.net
リーマンが和製英語からすでに世界に浸透してる
806:デフォルトの名無しさん
22/04/13 10:28:39.30 Wmi1ga+iM.net
ワークマン
807:デフォルトの名無しさん
22/04/13 11:06:56.09 BozzLOUH0.net
ワークマンは流行りよ
808:デフォルトの名無しさん (スップ Sd22-2p/j)
22/04/13 12:58:38 7IxClg8bd.net
緊急です!
マクロの入ったボタンが図だかイラストになってしまい困ってます。
直し方のアドバイスお願いします。
809:デフォルトの名無しさん (ワッチョイ 6711-LXkm)
22/04/13 13:07:23 zDnWB3YN0.net
>>795
スレリンク(bsoft板:342番)
810:デフォルトの名無しさん
22/04/13 13:09:58.08 Wntan1Ql0.net
こういうの30分一万円無保証とかで稼げないかな
811:デフォルトの名無しさん
22/04/13 13:57:45.74 +aMOkW0p0.net
>>795
もうその図からマクロ実行させちゃえばいいじゃん
812:デフォルトの名無しさん
22/04/13 14:00:17.02 uBZa/q6E0.net
■質問
サウンド再生は何通りかあるけど、
一番遅延が小さい方法は何ですか?
winmmのPlaySound ?
813:デフォルトの名無しさん
22/04/13 14:08:46.36 6qNApkxLM.net
>>798
多分それ自体わからんのちゃう?
Excel作った本人とかじゃなく事務員とかだろうし
814:デフォルトの名無しさん
22/04/13 15:42:21.02 7cmYTCQn0.net
3時間くらいかけてVBA作って、合間に別のエクセルファイル開いて、閉じようとしたら
「変更を保存しますか?」って出たので、保存せずに閉じたら。
VBAを作った方のファイルまで変更保存せずに閉じられてしまったーーー!!
どうにかならない?
815:デフォルトの名無しさん
22/04/13 15:45:55.22 7IxClg8bd.net
とりあえず顧客に頭を下げてFAXでリスト送って頂いたのでしばらくはなんとかなりそうですがエクセルファイル自体のトラブルについては全員サッパリ意味不明なためどうしようも無さそうです…
(エクセルファイル作った方自身が既に会社にいないのでどうしようもない)
とりあえずエクセルファイルがどうする事もできないため私と社長ら数名は土日も休日出勤して1月から4月までの記録も全部紙ベースの資料に手書きで書き写す事になりそうです
しばらくは紙とペンでのアナログなやり方で回すしかないですがアドバイスくださった方ありがとうございました
816:デフォルトの名無しさん
22/04/13 17:20:07.59 SMVlXKyy0.net
>>801
3時間くらいなら今からやれよ
817:デフォルトの名無しさん
22/04/13 17:28:47.62 MldHjaMW0.net
>>802
あちこちマルチで書いて馬鹿かよ
どこかに金を出して頼めよ
ゆとりの馬鹿はこれだから
818:デフォルトの名無しさん
22/04/13 17:42:34.06 Wmi1ga+iM.net
>>801
該当のファイルを開いた状態でファイルタブのどこかにある自動保存云々が書いてある場所を探せ
運が良ければ一時ファイルが残ってる
残ってなけりゃ諦めろ
次からは動作確認をする前に保存する癖をつけるようにするんだな
819:デフォルトの名無しさん
22/04/13 19:21:42.96 9TA12m3K0.net
>>801
これがあるからコーティング中はOneDriveに置いとる
820:デフォルトの名無しさん
22/04/13 21:38:12.45 wBIIYhTid.net
>>805
何で誰でも言える極々普通のアドバイスをこんなに上から目線で言えるんだろう
821:デフォルトの名無しさん
22/04/13 21:47:36.66 MBul3VW80.net
便所の落書きにいちいち目くじら立てて突っ掛かるなよ
より一層老けて見えるぞ
822:デフォルトの名無しさん
22/04/13 22:55:33.89 uonj2wEf0.net
全国10エリアのそれぞれに、2016年度から6か年度分の「各年度集計用book」があり、
中身は1時間値と月合計を集計する等のクエリーが17あって、
これをsheet上のクエリーリストを基に
For Nextで順次更新・上書き保存するVBAを仕込んであります。
これとは別に、各エリアごとにやはりbookのフルパスリストを基に
For Nextで「各年度集計用book」を順次開いて、
中のVBAを実行するよう仕込んだ「各エリア一括更新book」を作りました。
(今さら2016年度を再集計するのは、たまにシレーッと修正が訴求修正が入るため)
これまで10ヶ月間ほどの月次更新では問題もなく動いてきたのですが、今月の更新で
・sheet名とクエリー名によるクエリー更新のステップでデバックエラーで止まった
・2つ目2017年度あたりのbookをVBAで開いたと思ったら、Excelごと落ちた
となり、不安定になりました。
モジュールごと再構成たり、「各年度用集計book」クエリー計算を簡略化して17ステップに削減したりして、
・タスクマネージャーでは動作中のメモリーは最大10GB/32GBくらい、CPU使用率は最大60%弱
・1つの「各年度集計用book」の所要時間に30秒程度
まで軽量化したのですが、今後もbook数が増えることを考えると
何か工夫のしどころはないものかと。
自分で気になっているのは、6か年度分のbook更新がどうにか上手くいっても、
「各エリア一括更新book」のプロジェクトに、
済んだはずの「各年度集計用book」の情報が残っていること。
URLリンク(i.imgur.com)
よく分からないけれど、VBAが扱えるインスタンス数を超過しているのか?
これが残っていて良いのか、よくわかりません。
・Set wb = Workbooks.Open で開いて
・wb.Close SaveChanges:=True で上書き保存して閉じているのですが、
・For Next内で済んだ変数はできる限りNothingで開放
していますが、改善の余地はありますか?
823:809
22/04/13 23:53:53.55 uonj2wEf0.net
>>809 タイポ訂正
誤) 訴求修正
正) 遡及修正
824:デフォルトの名無しさん
22/04/14 08:48:02.28 jf4kHNax0.net
>>809
825:デフォルトの名無しさん
22/04/14 09:46:20.53 EGNxXvqd0.net
>>809
マクロを1つの専用ブックにまとめてみたら
826:デフォルトの名無しさん
22/04/14 13:25:49.47 E7ePXpuT0.net
VBAで他ブックのプロシージャを実行したいんだけど、実行まちをなくすことてできる?
Application.Run "Book2!Test2"
を実行したあと、"Book2!Test2"の処理終了を待たずに次の行に移りたいんだが。
827:デフォルトの名無しさん
22/04/14 13:53:36.44 TZzbtw0W0.net
非同期は無理
試してないけど、別のApplicationインスタンスを作成して
そちらでファイルを読み込んで実行とか
828:デフォルトの名無しさん
22/04/14 18:58:30.99 RElcaA4D0.net
メソッドを使い回したいときはクラスを別のクラスに参照渡ししてるんだけど、これってVBAに継承があれば機能的に処理できるのか
829:デフォルトの名無しさん
22/04/14 19:03:41.33 sxqTZKvqM.net
クラスのメンバーに他のクラスを入れるのがマイルド
830:デフォルトの名無しさん
22/04/14 19:25:43.40 RElcaA4D0.net
いいね
それ試してみよう
831:デフォルトの名無しさん
22/04/14 20:26:12.03 VI/N1Akx0.net
>>816
継承を委譲で置き換える、というだけですね…
832:デフォルトの名無しさん
22/04/14 21:25:22.08 YCtpuDrNx.net
参照設定なしでエクセルからアクセスファイルの操作をしようとしているのですが
フィールド定義の構文エラーが出ます。
テーブルの登録数を減らすと通りますが
上限か何かに引っかかっているのでしょうか?
Sub Test()
Dim CN As Object
Set CN = CreateObject("ADODB.Connection")
CN.Open "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" & "C:\Users\Downloads\データ.accdb"
CN.Execute "CREATE TABLE TBL(管理 INT,日付 DATE,番号 INT,内容 MEMO,担当 MEMO,OrderTeam MEMO,Place MEMO,Floor MEMO,GuestNum INT,種別 MEMO,物品 MEMO,対象 MEMO,状態 MEMO,時間1 MEMO,時間2 MEMO,Note MEMO,Total MEMO);"
CN.Close
MsgBox "作成しました。"
End Sub
833:デフォルトの名無しさん
22/04/14 21:40:59.88 zMqJUzcEa.net
MsgBox は、End Sub の外に出して下さい。
このスレの流れ的に。
834:デフォルトの名無しさん
22/04/14 22:31:20.84 Ep0kCh050.net
フィールド名 DATE は? 予約語では?
他には、day、month、table、text、user、when、where、year、zone とかも
835:デフォルトの名無しさん (ワッチョイ e2da-EhK1)
22/04/14 22:55:38 Ep0kCh050.net
すまん 読み間違いだった MEMOが多いような気がするが、それも多分外してるな すまん 居ないことにしといてくれ
836:デフォルトの名無しさん
22/04/14 23:23:47.63 fL/YN0Wd0.net
予約後はNote
[]で括れ
837:デフォルトの名無しさん
22/04/14 23:41:44.78 kOhvUD5R0.net
838:解決しました。 感謝です!
839:デフォルトの名無しさん
22/04/15 14:24:02.27 TsNK8La+0.net
>>816
クラスになじめなかったくせに
840:デフォルトの名無しさん
22/04/15 15:02:32.60 m9CVWFGZ0.net
う、うるさい!
841:デフォルトの名無しさん
22/04/16 10:04:25.26 g0AA3ay0p.net
無理してクラス使わんでもええんやで
842:デフォルトの名無しさん
22/04/16 10:12:12.08 94XVUrLP0.net
保健室でいいってことか
843:デフォルトの名無しさん
22/04/16 10:20:43.39 Xjbe7mxod.net
特別クラスにさえ入れてもらえないのk
844:デフォルトの名無しさん (ワッチョイ 17da-UOua)
22/04/16 14:51:07 gJCOre2S0.net
今は特殊学級は廃止されつつあると聞いたわ
差別に繋がるからだとか
845:デフォルトの名無しさん (ワッチョイ b768-fNw1)
22/04/16 14:55:23 pYTE49690.net
>>830
それな
・ひまわり学級導入
差別だから廃止しろ!
・ひまわり学級撤廃
障がい者と一緒に授業できるわけねーだろ!分けろ!
これを5年ぐらいの周期でず~~~っと繰り返してる。少なくともここ30年はそう
846:デフォルトの名無しさん
22/04/16 15:07:04.56 rh08QZl8a.net
1年目 ひまわり学級導入
6年目 ひまわり学級撤廃
11年目 ひまわり学級導入
16年目 ひまわり学級撤廃
21年目 ひまわり学級導入
26年目 ひまわり学級撤廃
30年目、ひまわり学級は撤廃された状態
847:デフォルトの名無しさん (ワッチョイ d7da-dJ8g)
22/04/16 17:39:51 aIa1oxEK0.net
コールバイネームしたいから無理にクラス使うというのはある。
848:デフォルトの名無しさん (ワッチョイ 17da-UOua)
22/04/16 18:34:28 gJCOre2S0.net
自分が通っていた学校の特殊学級は8組て名称だった
6組まではノーマルで何故か7組が無くて8組が特殊だった。
849:デフォルトの名無しさん
22/04/16 18:39:26.14 vqf9SIAK0.net
>>833
何故無理にCallbyName使う必要があるの?
標準モジュールなら普通にApplication.Runじゃダメなの?
850:デフォルトの名無しさん
22/04/17 02:09:30.35 BVP+DOJH0.net
>>835
コールバックのやり方調べた時に、
何か忘れたけど、他は面倒な制約があって、
コールバイネームしか使わなくなった。
851:デフォルトの名無しさん
22/04/17 03:28:38.26 N2omx0Taa.net
たまーに出てくるオブジェクト指向の話。
もうオブジェクト指向なんて忘れたは。
852:デフォルトの名無しさん
22/04/17 07:38:47.19 X2S+9pHC0.net
ワイのコードは素人指向
853:デフォルトの名無しさん
22/04/17 09:54:53.72 c23oRZKe0.net
>>837
それでも知らんうちに使ってるんやで
使ってる奴に意識させないのがオブジェクト指向
854:デフォルトの名無しさん
22/04/17 10:13:47.49 a3I3T2VGM.net
excel vbaではオブジェクトを利用したプログラミングにはなるけど、
それだけでオブジェクト指向だとは言えないな
855:デフォルトの名無しさん
22/04/17 10:56:37.84 acUYvJMnd.net
玄人志向が玄人向けだったのは最初だけ
856:デフォルトの名無しさん
22/04/18 22:09:45.73 dtBLR+IO0.net
どなたか相談に乗っていただきたいです。
現在、大学の講義で使用するため関数を作成しているのですが、最後に関数に戻り値を入れる際に「代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなけれななりません。」
とコンパイルエラーが出てしまいます。このエラーはどのように解決したらよいでしょうか?
857:デフォルトの名無しさん
22/04/18 22:14:18.56 5XyRTXLN0.net
コード見ないとちょっときつい
858:デフォルトの名無しさん
22/04/18 22:20:21.18 JAMU3YD50.net
コード作成お願いします!
2つのcsvがあってどちらも1列目に主キーがあります。
B:15列目の対応するキーの値を
A:3列目に代入
したいです。
できますかね?
859:デフォルトの名無しさん
22/04/18 22:25:33.62 dtBLR+IO0.net
Sub TEST1()
Dim Hight As Double, Time As Double
Hight = 0.4
Time = 2#
MsgBox WaveLength(Hight, Time)
End Sub
Function WaveLength(Hight, Time) As Double
Dim G As Double, PAI As Double
Dim WL0 As Double, WL1 As Double, WL2 As Double
G = 9.80665
PAI = WorksheetFunction.Pi()
WL0 = G * Time * Time / (2# * PAI)
WL1 = WL0
Do While ((WL2 - WL1) / WL1) >= 0.001
WL2 = WL0 * Worksheet.Tanh((2) * PAI * Hight / WL1)
If ((WL2 - WL1) / WL1) < 0.001 Then Exit Do
WL1 = 0.5 * (WL1 + WL2)
Loop
WaveLength() = WL2
End Function
860:デフォルトの名無しさん
22/04/18 22:26:31.08 dtBLR+IO0.net
>>845
こういった感じです
861:デフォルトの名無しさん
22/04/18 22:27:22.86 dtBLR+IO0.net
VBA自体初めてなので何からしたらいいのかわかっていない状況です。
862:デフォルトの名無しさん (ワッチョイ b768-fNw1)
22/04/18 22:30:08 5XyRTXLN0.net
>>845
functionの返り値使いたい時はfunction名に代入すればok。カッコは不要
Sub TEST1()
MsgBox WaveLength(Hight, Time)
End Sub
Function WaveLength(Hight, Time) As Double
WaveLength = 5
End Function
863:デフォルトの名無しさん
22/04/18 22:41:26.28 dtBLR+IO0.net
>>848
できました。ありがとうございます。
すみません、もう少し相談させていただいてもよろしいですか?
ループさせる際に値を変化させてDoにもどすことはできますか?
864:デフォルトの名無しさん
22/04/18 22:44:42.92 kMWXV8yj0.net
>>847
本筋と関係ない話だけど、HightとTimeは変数名に使わない方がいいよ
同じ名前の関数が既に存在するからトラブルの原因になる
別の単語か略語を考えて
865:デフォルトの名無しさん
22/04/18 22:46:49.95 dtBLR+IO0.net
>>850
小文字一文字とかでも大丈夫ですか?
866:デフォルトの名無しさん
22/04/18 22:48:03.57 tZvgKjwbd.net
それが出来るのがFunctionの良いところよ
戻り値は配列とかに入れておけばok
867:デフォルトの名無しさん
22/04/18 22:54:56.92 kMWXV8yj0.net
>>851
1文字でも動くけど、誰が見ても意味のわかる言葉にするのがマナー
どうしても別の単語を決められなかったら、Height1とかTime1とかにしとけばいい
1文字にするよりはマシ
868:デフォルトの名無しさん
22/04/18 23:00:04.07 5XyRTXLN0.net
マナーってなんだよw
あとで自分が見て分からなくなるのが問題
赤の他人が見てもわかるような名前にしておくと、自分のためになる
869:デフォルトの名無しさん
22/04/18 23:00:47.59 5XyRTXLN0.net
>>849
>ループさせる際に値を変化させてDoにもどすことはできますか?
言ってる意味がよくわからんかった
870:デフォルトの名無しさん
22/04/18 23:01:50.92 dtBLR+IO0.net
とりあえず、できました。
Sub TEST1()
Dim hight1 As Double, Time1 As Double
hight1 = 0.4
Time1 = 2#
MsgBox WaveLength(hight1, Time1)
End Sub
Function WaveLength(hight1, Time1) As Double
Dim G As Double, PAI As Double
Dim WL0 As Double, WL1 As Double, WL2 As Double
G = 9.80665
PAI = WorksheetFunction.Pi()
WL0 = G * Time1 * Time1 / (2# * PAI)
WL1 = WL0
Do While ((WL2 - WL1) / WL1) >= 0.001
WL2 = WL0 * Worksheet.Tanh((2) * PAI * hight1 / WL1)
WL1 = 0.5 * (WL1 + WL2)
Loop
WaveLength = WL2
End Function
871:デフォルトの名無しさん
22/04/18 23:03:04.12 dtBLR+IO0.net
ただ、まちがっているみたいです。
872:デフォルトの名無しさん
22/04/18 23:03:10.61 wKhqv1yX0.net
>>850
Hight なんていう関数あったっけ?
873:デフォルトの名無しさん
22/04/18 23:09:31.78 dtBLR+IO0.net
Doの中でWL2=WL0*tanh(2*PAI*H/WL1)を実行して、((WL2-WL1)/WL1)の絶対値が0.001より小さい場合には関数にWL2を代入して、0.001より大きい場合にはWL1=0.5*(WL1+WL2))と変換して再度Doを行うという繰り返しです。
874:デフォルトの名無しさん
22/04/18 23:13:08.37 dtBLR+IO0.net
すみません、わかりにくいですね。
WL1からなる計算式で求められるWL2とWL1の関係が条件に合わない場合、WL1をWL1とWL2の平均をとって再度WL2を求めたいです。
875:デフォルトの名無しさん
22/04/18 23:55:22.83 6SbGdBJw0.net
Do
WL2 = WL0 * Worksheet.Tanh((2) * PAI * hight1 / WL1)
If Abs((WL2 - WL1) / WL1) < 0.001 Then Exit Do
WL1 = 0.5 * (WL1 + WL2)
Loop
876:デフォルトの名無しさん
22/04/19 05:01:48.08 dRTEe6m5a.net
どうでもいいが GやPAIは定数として関数の外にだす方が好き
877:デフォルトの名無しさん
22/04/19 06:39:40.35 UDMLP6tq0.net
>>858
cellsのプロパティにある
文脈的に予約後ってコトぐらいwかるだろ
878:デフォルトの名無しさん (ワッチョイ 9f01-0UVf)
22/04/19 07:20:27 KrqnU+fb0.net
>>863
Cells w
それを言うなら Range だし、Range にあるのは Height な
そもそも単なるプロパティ名で関数でも
879:予約後でもないし
880:デフォルトの名無しさん (ワッチョイ b768-fNw1)
22/04/19 07:25:56 UDMLP6tq0.net
よく見たらhightかよクソがw
881:デフォルトの名無しさん
22/04/19 07:48:45.10 muVDZfH30.net
>>860
ざっくり見た感じだけなので詳しく分からないけどその計算式って正しい?
その計算式の内容と判定条件だと初期値の値によっては計算が収束せずに振動を繰り返すことになるので
ループから脱出できなくなる気がする
882:デフォルトの名無しさん (ワッチョイ bf14-4qoo)
22/04/19 12:03:50 SIyX6JLR0.net
Do?Loopの例文見ると条件はWhileが多い気がする
自分はUntil派なんですが
883:デフォルトの名無しさん
22/04/19 12:41:24.95 y80OoYXYM.net
でっていう
884:デフォルトの名無しさん
22/04/19 12:53:32.89 Hbe28u0D0.net
Untilはコーディングミスで「なぜか抜けられない」状態が起きた時の解決がめんどくさいからあんま使いたくない
Whileならコーディングミスっても、値が範囲内でループし続けてるくらいしか原因がないから突き止めやすい
885:デフォルトの名無しさん
22/04/19 14:33:22.38 XaMNMP/i0.net
>>869
無能自慢?
886:デフォルトの名無しさん
22/04/19 14:38:03.91 Hbe28u0D0.net
>>870
リスクは減らしたいってだけの話
自分一人だけがマクロいじるとは限らないし
887:デフォルトの名無しさん
22/04/19 15:06:19.06 XaMNMP/i0.net
>>871
いや、お前が無能なだけ
888:デフォルトの名無しさん
22/04/19 15:24:45.82 Cixyrkk96.net
URLリンク(imgur.com)
一応、大学から共有されている理論式がこんな感じなのでおそらく会ってます
889:デフォルトの名無しさん
22/04/19 16:03:50.77 NrfRvlTVr.net
どうでもいいけど、Excelってそういう計算やったほうがいいんだっけ
小数点以下になるようなものは避けたほうがいいって記憶がある
890:デフォルトの名無しさん
22/04/19 16:13:18.16 Hbe28u0D0.net
小数点以下の計算は誤った結果が出ることも結構あるから、
・型はCurrencyにして小数点以下5桁までにする
・可能であれば整数に直してから計算させる
くらいはしておいた方がいいね
891:デフォルトの名無しさん
22/04/19 16:39:16.39 Cixyrkk96.net
Function WaveLength(Height1, Time1) As Double
Dim G As Double, PAI As Double
Dim WL0 As Currency, WL1 As Currency, WL2 As Currency
G = 9.80665
PAI = WorksheetFunction.Pi()
WL0 = G * Time1 * Time1 / (2# * PAI)
WL1 = WL0
WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)
Do
WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)
If Abs((WL2 - WL1) / WL1) < 0.001 Then Exit Do
WL1 = 0.5 * (WL1 + WL2)
Loop
WaveLength = WL2
End Function
とりあえずこういった感じで修正したものの実行するとオーバーフローするみたいです。
何が原因でしょうか?
892:デフォルトの名無しさん
22/04/19 16:41:24.14 Cixyrkk96.net
IF条件で抜け出せなくなってしまったとかでしょうか?
893:デフォルトの名無しさん
22/04/19 16:59:26.12 Hbe28u0D0.net
>>876
内容はあまりわかっていないが、できそうな対策から
お察しの通りLoopを抜ける判定が上手く行ってないと推測される
オーバーフロー対策に、書き換え可能であればDoじゃなくてForNextに書き換えたほうがいいかも
Function WaveLength(Height1, Time1) As Double
↑引数は接頭にByValかByRefかを書く 多分ByVal
そして引数の型も明記する 特にTime1はDate型かそれ以外か明記が必要
Dim G As Double, PAI As Double
↑どっちもCurrencyでいいかと
Dim WL0 As Currency, WL1 As Currency, WL2 As Currency
G = 9.80665
PAI = WorksheetFunction.Pi()
WL0 = G * Time1 * Time1 / (2# * PAI)
WL1 = WL0
'WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)
↑ここのWL2はいらない
Do
WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)
↑HeightはHeight1にする
'If Abs((WL2 - WL1) / WL1) < 0.001 Then Exit Do
'WL1 = 0.5 * (WL1 + WL2)
↑ここ2行は↓のように書き換える
If Abs((WL2 - WL1) / WL1) *1000< 1 Then
Exit Do
Else’上の条件を満たしていないときはこの値を代入して処理を続けますよの記載にする
WL1 = 0.5 * (WL1 + WL2)
End If
Loop
WaveLength = WL2
894:デフォルトの名無しさん
22/04/19 17:04:43.35 XaMNMP/i0.net
馬鹿だからCurrencyを使うのだな
895:デフォルトの名無しさん
22/04/19 17:07:08.59 3cTbAnobM.net
数値計算に固定小数点数のCurrecyは駄目
浮動小数点数のDlubleでないと直ぐにオーバーフローする
896:デフォルトの名無しさん
22/04/19 17:34:34.65 C02npA8w0.net
解決しました!!本当にありがとうございます!
897:デフォルトの名無しさん
22/04/19 17:35:09.38 C02npA8w0.net
めっちゃ興奮するw
898:デフォルトの名無しさん
22/04/19 17:37:09.90 C02npA8w0.net
>>878
ありがとうございます!
899:デフォルトの名無しさん
22/04/19 17:44:54.91 Hbe28u0D0.net
>>883
解決したみたいで何よりです
多分、0.001より小さいかの判定だけがネックだったんだと思う
もし1と比較している理由を教授に訊かれたら「VBAだと小数の計算が正確ではない事象があるため、回避できるように数式を書きました」と答えとき
900:デフォルトの名無しさん
22/04/19 17:56:52.80 C02npA8w0.net
>>884
わかりました!
今回は本当助かりました。本当にありがとうございました。
901:デフォルトの名無しさん
22/04/19 22:29:37.25 2A4xjXpz0.net
おー理解できたのなら大学の工機前頑張ってなー
902:デフォルトの名無しさん (ワッチョイ b717-73NO)
22/04/20 00:08:28 Tl7YCJ+60.net
double型を使って除算をすると小数点以下の誤差が出る場合があるのはどのように解決したら良いでしょうか
四捨五入では本来算出したい数値からズレてしまいます
currency型なら誤差が発生しない聞いたのですがどうやら馬鹿が使う物らしいので何か別の方法をご教示頂けませんでしょうか
903:デフォルトの名無しさん
22/04/20 00:24:45.89 TUC465n/0.net
>>887
馬鹿が悔しくて質問か?
除算で1÷3だったらどうなると思う?
904:デフォルトの名無しさん
22/04/20 00:37:19.89 EV0gbz680.net
>>887
除算した結果をどうしたいのかによる
結果を他の数値と比較したいのなら、比較したい数値に除数を掛けて比較する
905:デフォルトの名無しさん (ラクッペペ MM8f-/HVa)
22/04/20 02:03:14 HkpFcH5SM.net
実際のところ除算の丸め誤差が問題になることは少ない
数値計算では有効数字と桁数さえ把握していれば十分な精度で演算できる
というか浮動小数点だろうが固定小数点だろうが四捨五入すれば必ず丸め誤差は発生する
むしろ浮動小数点を扱う場合は桁数の差が大きい数値を加減算する時の情報落ちと、値が近い数値同士を減算する時の桁落ちの方が厄介
906:デフォルトの名無しさん (ワッチョイ b717-73NO)
22/04/20 02:16:34 Tl7YCJ+60.net
>>889
分かりにくかったらごめんなさい
・数十行(場合により数百行から千行弱)の作業計画表があってそれぞれ開始日、終了日、工数を作業担当者が決定し、それとは別に納期を設定します
・各行では作業日数を算出し、工数を日割り計算し、小数点第二位で四捨五入、最終日に余りを加算して進捗の計画とします
・作業担当者は日毎に各項目の進捗率を入力します
・作業担当者はこのファイルとは別に上位工程担当者との連絡シートを更新し、そこで発生する追加工数などをこのファイルで読み込みます
・上記データを元に様々な演算を行い、納期に対して進み見込みか遅れ見込みか、またそれが何日の見込みかを算出します
・結果を当初計画、進捗実績および予測、納期などをグラフで可視化
という仕様のツールなのですが2つ目のあたりで余計なズレが発生して演算が狂ってしまう場合があり、
currency型に値を放り込んで強引にズレが生じないようにしているのが現状です
100%発生するのではなく20物件に1件程度の発生率なので如何したものかと頭を悩ませております
907:デフォルトの名無しさん
22/04/20 04:15:00.17 i+5dFZiZM.net
>>891
算数わかる?
908:デフォルトの名無しさん
22/04/20 06:42:44.94 PPr2by3tM.net
>891
2つ目のあたりというのがよく分からないけど箇条書きの2段目の項目のことなら処理の仕方が間違ってる
最後に余りを足すなら途中経過はすべて切捨てで処理、途中経過を四捨五入するなら全ての累積値を最後に被除数から引いて加算値を求める
どちらかで処理しないとズレるのは当たり前
909:デフォルトの名無しさん (ワッチョイ 1701-hfAD)
22/04/20 07:19:32 Ls68Jrpy0.net
Currency型てのは誤差が出ないわけじゃなくて精度が固定されてるっていうことなんだけどな
そもそも工程表程度の精度で浮動小数点の誤差が問題になることなんてないだろうに
どうしても誤差が気になるなら割り算を商余で表現するとか演算順序の見直し(割り算を最後に)
910:デフォルトの名無しさん (ブーイモ MMcf-73NO)
22/04/20 07:23:24 uFaPvbC9M.net
>>893
余りは工数-日毎工数x作業日数で算出していましたが処理が違いますか?
勿論この場合余りが負の値になる状況もあるので正確には余りとは違う表現をするのが正しいのですが
これで算出した最終日の工数が3.5hになるべきところが3.49999hになるのは計算式の誤りですか?
911:デフォルトの名無しさん
22/04/20 07:34:26.59 lCHITGXH0.net
>>895
最後に小数点以下第二位で四捨五入すればいいじゃん
912:デフォルトの名無しさん
22/04/20 07:40:54.07 lCHITGXH0.net
>>895
どこでどれぐらい誤差が出るかは元データと計算式とデータ型によるから、その情報だけではどこが悪いか判断できない
工数は小数点以下第何位まで入力されてんの?
そもそもデータが1000行しかないんなら別にCurrencyのままでいいじゃん
仕事の目的はプログラミングじゃないんだから、結果がちゃんと出たんなら現時点ではそこで終わっとけ
誤差の処理をちゃんとやうとすると情報サイエンスの基礎をみっちりやらないと無理だから、今回の件とは別に自宅で時間かけて勉強しろ
913:デフォルトの名無しさん
22/04/20 07:47:48.41 uFaPvbC9M.net
>>896
四捨五入した値をdouble型に代入した際にもこの誤差が発生する場合もあったのですがその場合の対処はDoWhileで数値が丸められるまで四捨五入を繰り返す処理を噛ませれば良いですか?
それよりcurrency型に代入した方が処理を省略できるのではないでしょうか
担当者の癖や上位工程担当者の癖、物件の種類などを加味して分析して完了予測を出すためツール全体で2万弱のステップ数があり、可能な限り処理を早めたいです
まぁそんなの誤差の範囲じゃんとかもっと別に短縮出来る所あるだろって言われたらそれはそうってなるんですが
工数は小数点第一位までの入力です