1 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:24:32.62 ID:I0u44nFvd.net] !extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ↑2行に減ってるけど、同じ内容を3行に増やして貼り付けるナリ ExcelのVBAに関する質問スレナリ コード書き込みや作成依頼もOKナリ ※前スレ Excel VBA 質問スレ Part74 https://mevius.5ch.net/test/read.cgi/tech/1639932059/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
809 名前:デフォルトの名無しさん (ワッチョイ 6711-LXkm) mailto:sage [2022/04/13(水) 13:07:23 ID:zDnWB3YN0.net] >>795 https://mevius.5ch.net/test/read.cgi/bsoft/1647570025/342
810 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 13:09:58.08 ID:Wntan1Ql0.net] こういうの30分一万円無保証とかで稼げないかな
811 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 13:57:45.74 ID:+aMOkW0p0.net] >>795 もうその図からマクロ実行させちゃえばいいじゃん
812 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 14:00:17.02 ID:uBZa/q6E0.net] ■質問 サウンド再生は何通りかあるけど、 一番遅延が小さい方法は何ですか? winmmのPlaySound ?
813 名前:デフォルトの名無しさん [2022/04/13(水) 14:08:46.36 ID:6qNApkxLM.net] >>798 多分それ自体わからんのちゃう? Excel作った本人とかじゃなく事務員とかだろうし
814 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 15:42:21.02 ID:7cmYTCQn0.net] 3時間くらいかけてVBA作って、合間に別のエクセルファイル開いて、閉じようとしたら 「変更を保存しますか?」って出たので、保存せずに閉じたら。 VBAを作った方のファイルまで変更保存せずに閉じられてしまったーーー!! どうにかならない?
815 名前:デフォルトの名無しさん [2022/04/13(水) 15:45:55.22 ID:7IxClg8bd.net] とりあえず顧客に頭を下げてFAXでリスト送って頂いたのでしばらくはなんとかなりそうですがエクセルファイル自体のトラブルについては全員サッパリ意味不明なためどうしようも無さそうです… (エクセルファイル作った方自身が既に会社にいないのでどうしようもない) とりあえずエクセルファイルがどうする事もできないため私と社長ら数名は土日も休日出勤して1月から4月までの記録も全部紙ベースの資料に手書きで書き写す事になりそうです しばらくは紙とペンでのアナログなやり方で回すしかないですがアドバイスくださった方ありがとうございました
816 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 17:20:07.59 ID:SMVlXKyy0.net] >>801 3時間くらいなら今からやれよ
817 名前:デフォルトの名無しさん [2022/04/13(水) 17:28:47.62 ID:MldHjaMW0.net] >>802 あちこちマルチで書いて馬鹿かよ どこかに金を出して頼めよ ゆとりの馬鹿はこれだから
818 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 17:42:34.06 ID:Wmi1ga+iM.net] >>801 該当のファイルを開いた状態でファイルタブのどこかにある自動保存云々が書いてある場所を探せ 運が良ければ一時ファイルが残ってる 残ってなけりゃ諦めろ 次からは動作確認をする前に保存する癖をつけるようにするんだな
819 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 19:21:42.96 ID:9TA12m3K0.net] >>801 これがあるからコーティング中はOneDriveに置いとる
820 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 21:38:12.45 ID:wBIIYhTid.net] >>805 何で誰でも言える極々普通のアドバイスをこんなに上から目線で言えるんだろう
821 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 21:47:36.66 ID:MBul3VW80.net] 便所の落書きにいちいち目くじら立てて突っ掛かるなよ より一層老けて見えるぞ
822 名前:デフォルトの名無しさん mailto:sage [2022/04/13(水) 22:55:33.89 ID: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」の情報が残っていること。 https://i.imgur.com/BvkH6sr.png よく分からないけれど、VBAが扱えるインスタンス数を超過しているのか? これが残っていて良いのか、よくわかりません。 ・Set wb = Workbooks.Open で開いて ・wb.Close SaveChanges:=True で上書き保存して閉じているのですが、 ・For Next内で済んだ変数はできる限りNothingで開放 していますが、改善の余地はありますか?
823 名前:809 mailto:sage [2022/04/13(水) 23:53:53.55 ID:uonj2wEf0.net] >>809 タイポ訂正 誤) 訴求修正 正) 遡及修正
824 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 08:48:02.28 ID:jf4kHNax0.net] >>809
825 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 09:46:20.53 ID:EGNxXvqd0.net] >>809 マクロを1つの専用ブックにまとめてみたら
826 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 13:25:49.47 ID:E7ePXpuT0.net] VBAで他ブックのプロシージャを実行したいんだけど、実行まちをなくすことてできる? Application.Run "Book2!Test2" を実行したあと、"Book2!Test2"の処理終了を待たずに次の行に移りたいんだが。
827 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 13:53:36.44 ID:TZzbtw0W0.net] 非同期は無理 試してないけど、別のApplicationインスタンスを作成して そちらでファイルを読み込んで実行とか
828 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 18:58:30.99 ID:RElcaA4D0.net] メソッドを使い回したいときはクラスを別のクラスに参照渡ししてるんだけど、これってVBAに継承があれば機能的に処理できるのか
829 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 19:03:41.33 ID:sxqTZKvqM.net] クラスのメンバーに他のクラスを入れるのがマイルド
830 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 19:25:43.40 ID:RElcaA4D0.net] いいね それ試してみよう
831 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 20:26:12.03 ID:VI/N1Akx0.net] >>816 継承を委譲で置き換える、というだけですね…
832 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 21:25:22.08 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 21:40:59.88 ID:zMqJUzcEa.net] MsgBox は、End Sub の外に出して下さい。 このスレの流れ的に。
834 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 22:31:20.84 ID:Ep0kCh050.net] フィールド名 DATE は? 予約語では? 他には、day、month、table、text、user、when、where、year、zone とかも
835 名前:デフォルトの名無しさん (ワッチョイ e2da-EhK1) mailto:sage [2022/04/14(木) 22:55:38 ID:Ep0kCh050.net] すまん 読み間違いだった MEMOが多いような気がするが、それも多分外してるな すまん 居ないことにしといてくれ
836 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 23:23:47.63 ID:fL/YN0Wd0.net] 予約後はNote []で括れ
837 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 23:41:44.78 ID:kOhvUD5R0.net]
838 名前:解決しました。 感謝です! [] [ここ壊れてます]
839 名前:デフォルトの名無しさん mailto:sage [2022/04/15(金) 14:24:02.27 ID:TsNK8La+0.net] >>816 クラスになじめなかったくせに
840 名前:デフォルトの名無しさん mailto:sage [2022/04/15(金) 15:02:32.60 ID:m9CVWFGZ0.net] う、うるさい!
841 名前:デフォルトの名無しさん mailto:sage [2022/04/16(土) 10:04:25.26 ID:g0AA3ay0p.net] 無理してクラス使わんでもええんやで
842 名前:デフォルトの名無しさん mailto:sage [2022/04/16(土) 10:12:12.08 ID:94XVUrLP0.net] 保健室でいいってことか
843 名前:デフォルトの名無しさん mailto:sage [2022/04/16(土) 10:20:43.39 ID:Xjbe7mxod.net] 特別クラスにさえ入れてもらえないのk
844 名前:デフォルトの名無しさん (ワッチョイ 17da-UOua) mailto:sage [2022/04/16(土) 14:51:07 ID:gJCOre2S0.net] 今は特殊学級は廃止されつつあると聞いたわ 差別に繋がるからだとか
845 名前:デフォルトの名無しさん (ワッチョイ b768-fNw1) mailto:sage [2022/04/16(土) 14:55:23 ID:pYTE49690.net] >>830 それな ・ひまわり学級導入 差別だから廃止しろ! ・ひまわり学級撤廃 障がい者と一緒に授業できるわけねーだろ!分けろ! これを5年ぐらいの周期でず〜〜〜っと繰り返してる。少なくともここ30年はそう
846 名前:デフォルトの名無しさん mailto:sage [2022/04/16(土) 15:07:04.56 ID:rh08QZl8a.net] 1年目 ひまわり学級導入 6年目 ひまわり学級撤廃 11年目 ひまわり学級導入 16年目 ひまわり学級撤廃 21年目 ひまわり学級導入 26年目 ひまわり学級撤廃 30年目、ひまわり学級は撤廃された状態
847 名前:デフォルトの名無しさん (ワッチョイ d7da-dJ8g) mailto:sage [2022/04/16(土) 17:39:51 ID:aIa1oxEK0.net] コールバイネームしたいから無理にクラス使うというのはある。
848 名前:デフォルトの名無しさん (ワッチョイ 17da-UOua) mailto:sage [2022/04/16(土) 18:34:28 ID:gJCOre2S0.net] 自分が通っていた学校の特殊学級は8組て名称だった 6組まではノーマルで何故か7組が無くて8組が特殊だった。
849 名前:デフォルトの名無しさん mailto:sage [2022/04/16(土) 18:39:26.14 ID:vqf9SIAK0.net] >>833 何故無理にCallbyName使う必要があるの? 標準モジュールなら普通にApplication.Runじゃダメなの?
850 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 02:09:30.35 ID:BVP+DOJH0.net] >>835 コールバックのやり方調べた時に、 何か忘れたけど、他は面倒な制約があって、 コールバイネームしか使わなくなった。
851 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 03:28:38.26 ID:N2omx0Taa.net] たまーに出てくるオブジェクト指向の話。 もうオブジェクト指向なんて忘れたは。
852 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 07:38:47.19 ID:X2S+9pHC0.net] ワイのコードは素人指向
853 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 09:54:53.72 ID:c23oRZKe0.net] >>837 それでも知らんうちに使ってるんやで 使ってる奴に意識させないのがオブジェクト指向
854 名前:デフォルトの名無しさん [2022/04/17(日) 10:13:47.49 ID:a3I3T2VGM.net] excel vbaではオブジェクトを利用したプログラミングにはなるけど、 それだけでオブジェクト指向だとは言えないな
855 名前:デフォルトの名無しさん mailto:sage [2022/04/17(日) 10:56:37.84 ID:acUYvJMnd.net] 玄人志向が玄人向けだったのは最初だけ
856 名前:デフォルトの名無しさん [2022/04/18(月) 22:09:45.73 ID:dtBLR+IO0.net] どなたか相談に乗っていただきたいです。 現在、大学の講義で使用するため関数を作成しているのですが、最後に関数に戻り値を入れる際に「代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなけれななりません。」 とコンパイルエラーが出てしまいます。このエラーはどのように解決したらよいでしょうか?
857 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 22:14:18.56 ID:5XyRTXLN0.net] コード見ないとちょっときつい
858 名前:デフォルトの名無しさん [2022/04/18(月) 22:20:21.18 ID:JAMU3YD50.net] コード作成お願いします! 2つのcsvがあってどちらも1列目に主キーがあります。 B:15列目の対応するキーの値を A:3列目に代入 したいです。 できますかね?
859 名前:デフォルトの名無しさん [2022/04/18(月) 22:25:33.62 ID: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 名前:デフォルトの名無しさん [2022/04/18(月) 22:26:31.08 ID:dtBLR+IO0.net] >>845 こういった感じです
861 名前:デフォルトの名無しさん [2022/04/18(月) 22:27:22.86 ID:dtBLR+IO0.net] VBA自体初めてなので何からしたらいいのかわかっていない状況です。
862 名前:デフォルトの名無しさん (ワッチョイ b768-fNw1) mailto:sage [2022/04/18(月) 22:30:08 ID: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 名前:デフォルトの名無しさん [2022/04/18(月) 22:41:26.28 ID:dtBLR+IO0.net] >>848 できました。ありがとうございます。 すみません、もう少し相談させていただいてもよろしいですか? ループさせる際に値を変化させてDoにもどすことはできますか?
864 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 22:44:42.92 ID:kMWXV8yj0.net] >>847 本筋と関係ない話だけど、HightとTimeは変数名に使わない方がいいよ 同じ名前の関数が既に存在するからトラブルの原因になる 別の単語か略語を考えて
865 名前:デフォルトの名無しさん [2022/04/18(月) 22:46:49.95 ID:dtBLR+IO0.net] >>850 小文字一文字とかでも大丈夫ですか?
866 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 22:48:03.57 ID:tZvgKjwbd.net] それが出来るのがFunctionの良いところよ 戻り値は配列とかに入れておけばok
867 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 22:54:56.92 ID:kMWXV8yj0.net] >>851 1文字でも動くけど、誰が見ても意味のわかる言葉にするのがマナー どうしても別の単語を決められなかったら、Height1とかTime1とかにしとけばいい 1文字にするよりはマシ
868 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 23:00:04.07 ID:5XyRTXLN0.net] マナーってなんだよw あとで自分が見て分からなくなるのが問題 赤の他人が見てもわかるような名前にしておくと、自分のためになる
869 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 23:00:47.59 ID:5XyRTXLN0.net] >>849 >ループさせる際に値を変化させてDoにもどすことはできますか? 言ってる意味がよくわからんかった
870 名前:デフォルトの名無しさん [2022/04/18(月) 23:01:50.92 ID: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 名前:デフォルトの名無しさん [2022/04/18(月) 23:03:04.12 ID:dtBLR+IO0.net] ただ、まちがっているみたいです。
872 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 23:03:10.61 ID:wKhqv1yX0.net] >>850 Hight なんていう関数あったっけ?
873 名前:デフォルトの名無しさん [2022/04/18(月) 23:09:31.78 ID: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 名前:デフォルトの名無しさん [2022/04/18(月) 23:13:08.37 ID:dtBLR+IO0.net] すみません、わかりにくいですね。 WL1からなる計算式で求められるWL2とWL1の関係が条件に合わない場合、WL1をWL1とWL2の平均をとって再度WL2を求めたいです。
875 名前:デフォルトの名無しさん mailto:sage [2022/04/18(月) 23:55:22.83 ID: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 名前:デフォルトの名無しさん [2022/04/19(火) 05:01:48.08 ID:dRTEe6m5a.net] どうでもいいが GやPAIは定数として関数の外にだす方が好き
877 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 06:39:40.35 ID:UDMLP6tq0.net] >>858 cellsのプロパティにある 文脈的に予約後ってコトぐらいwかるだろ
878 名前:デフォルトの名無しさん (ワッチョイ 9f01-0UVf) mailto:sage [2022/04/19(火) 07:20:27 ID:KrqnU+fb0.net] >>863 Cells w それを言うなら Range だし、Range にあるのは Height な そもそも単なるプロパティ名で関数でも
879 名前:予約後でもないし [] [ここ壊れてます]
880 名前:デフォルトの名無しさん (ワッチョイ b768-fNw1) mailto:sage [2022/04/19(火) 07:25:56 ID:UDMLP6tq0.net] よく見たらhightかよクソがw
881 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 07:48:45.10 ID:muVDZfH30.net] >>860 ざっくり見た感じだけなので詳しく分からないけどその計算式って正しい? その計算式の内容と判定条件だと初期値の値によっては計算が収束せずに振動を繰り返すことになるので ループから脱出できなくなる気がする
882 名前:デフォルトの名無しさん (ワッチョイ bf14-4qoo) mailto:sage [2022/04/19(火) 12:03:50 ID:SIyX6JLR0.net] Do?Loopの例文見ると条件はWhileが多い気がする 自分はUntil派なんですが
883 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 12:41:24.95 ID:y80OoYXYM.net] でっていう
884 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 12:53:32.89 ID:Hbe28u0D0.net] Untilはコーディングミスで「なぜか抜けられない」状態が起きた時の解決がめんどくさいからあんま使いたくない Whileならコーディングミスっても、値が範囲内でループし続けてるくらいしか原因がないから突き止めやすい
885 名前:デフォルトの名無しさん [2022/04/19(火) 14:33:22.38 ID:XaMNMP/i0.net] >>869 無能自慢?
886 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 14:38:03.91 ID:Hbe28u0D0.net] >>870 リスクは減らしたいってだけの話 自分一人だけがマクロいじるとは限らないし
887 名前:デフォルトの名無しさん [2022/04/19(火) 15:06:19.06 ID:XaMNMP/i0.net] >>871 いや、お前が無能なだけ
888 名前:デフォルトの名無しさん [2022/04/19(火) 15:24:45.82 ID:Cixyrkk96.net] https://imgur.com/srNrR8t 一応、大学から共有されている理論式がこんな感じなのでおそらく会ってます
889 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 16:03:50.77 ID:NrfRvlTVr.net] どうでもいいけど、Excelってそういう計算やったほうがいいんだっけ 小数点以下になるようなものは避けたほうがいいって記憶がある
890 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 16:13:18.16 ID:Hbe28u0D0.net] 小数点以下の計算は誤った結果が出ることも結構あるから、 ・型はCurrencyにして小数点以下5桁までにする ・可能であれば整数に直してから計算させる くらいはしておいた方がいいね
891 名前:デフォルトの名無しさん [2022/04/19(火) 16:39:16.39 ID: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 名前:デフォルトの名無しさん [2022/04/19(火) 16:41:24.14 ID:Cixyrkk96.net] IF条件で抜け出せなくなってしまったとかでしょうか?
893 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 16:59:26.12 ID: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 名前:デフォルトの名無しさん [2022/04/19(火) 17:04:43.35 ID:XaMNMP/i0.net] 馬鹿だからCurrencyを使うのだな
895 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 17:07:08.59 ID:3cTbAnobM.net] 数値計算に固定小数点数のCurrecyは駄目 浮動小数点数のDlubleでないと直ぐにオーバーフローする
896 名前:デフォルトの名無しさん [2022/04/19(火) 17:34:34.65 ID:C02npA8w0.net] 解決しました!!本当にありがとうございます!
897 名前:デフォルトの名無しさん [2022/04/19(火) 17:35:09.38 ID:C02npA8w0.net] めっちゃ興奮するw
898 名前:デフォルトの名無しさん [2022/04/19(火) 17:37:09.90 ID:C02npA8w0.net] >>878 ありがとうございます!
899 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 17:44:54.91 ID:Hbe28u0D0.net] >>883 解決したみたいで何よりです 多分、0.001より小さいかの判定だけがネックだったんだと思う もし1と比較している理由を教授に訊かれたら「VBAだと小数の計算が正確ではない事象があるため、回避できるように数式を書きました」と答えとき
900 名前:デフォルトの名無しさん [2022/04/19(火) 17:56:52.80 ID:C02npA8w0.net] >>884 わかりました! 今回は本当助かりました。本当にありがとうございました。
901 名前:デフォルトの名無しさん mailto:sage [2022/04/19(火) 22:29:37.25 ID:2A4xjXpz0.net] おー理解できたのなら大学の工機前頑張ってなー
902 名前:デフォルトの名無しさん (ワッチョイ b717-73NO) mailto:sage [2022/04/20(水) 00:08:28 ID:Tl7YCJ+60.net] double型を使って除算をすると小数点以下の誤差が出る場合があるのはどのように解決したら良いでしょうか 四捨五入では本来算出したい数値からズレてしまいます currency型なら誤差が発生しない聞いたのですがどうやら馬鹿が使う物らしいので何か別の方法をご教示頂けませんでしょうか
903 名前:デフォルトの名無しさん [2022/04/20(水) 00:24:45.89 ID:TUC465n/0.net] >>887 馬鹿が悔しくて質問か? 除算で1÷3だったらどうなると思う?
904 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 00:37:19.89 ID:EV0gbz680.net] >>887 除算した結果をどうしたいのかによる 結果を他の数値と比較したいのなら、比較したい数値に除数を掛けて比較する
905 名前:デフォルトの名無しさん (ラクッペペ MM8f-/HVa) mailto:sage [2022/04/20(水) 02:03:14 ID:HkpFcH5SM.net] 実際のところ除算の丸め誤差が問題になることは少ない 数値計算では有効数字と桁数さえ把握していれば十分な精度で演算できる というか浮動小数点だろうが固定小数点だろうが四捨五入すれば必ず丸め誤差は発生する むしろ浮動小数点を扱う場合は桁数の差が大きい数値を加減算する時の情報落ちと、値が近い数値同士を減算する時の桁落ちの方が厄介
906 名前:デフォルトの名無しさん (ワッチョイ b717-73NO) mailto:sage [2022/04/20(水) 02:16:34 ID:Tl7YCJ+60.net] >>889 分かりにくかったらごめんなさい ・数十行(場合により数百行から千行弱)の作業計画表があってそれぞれ開始日、終了日、工数を作業担当者が決定し、それとは別に納期を設定します ・各行では作業日数を算出し、工数を日割り計算し、小数点第二位で四捨五入、最終日に余りを加算して進捗の計画とします ・作業担当者は日毎に各項目の進捗率を入力します ・作業担当者はこのファイルとは別に上位工程担当者との連絡シートを更新し、そこで発生する追加工数などをこのファイルで読み込みます ・上記データを元に様々な演算を行い、納期に対して進み見込みか遅れ見込みか、またそれが何日の見込みかを算出します ・結果を当初計画、進捗実績および予測、納期などをグラフで可視化 という仕様のツールなのですが2つ目のあたりで余計なズレが発生して演算が狂ってしまう場合があり、 currency型に値を放り込んで強引にズレが生じないようにしているのが現状です 100%発生するのではなく20物件に1件程度の発生率なので如何したものかと頭を悩ませております
907 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 04:15:00.17 ID:i+5dFZiZM.net] >>891 算数わかる?
908 名前:デフォルトの名無しさん mailto:sage [2022/04/20(水) 06:42:44.94 ID:PPr2by3tM.net] >891 2つ目のあたりというのがよく分からないけど箇条書きの2段目の項目のことなら処理の仕方が間違ってる 最後に余りを足すなら途中経過はすべて切捨てで処理、途中経過を四捨五入するなら全ての累積値を最後に被除数から引いて加算値を求める どちらかで処理しないとズレるのは当たり前
909 名前:デフォルトの名無しさん (ワッチョイ 1701-hfAD) mailto:sage [2022/04/20(水) 07:19:32 ID:Ls68Jrpy0.net] Currency型てのは誤差が出ないわけじゃなくて精度が固定されてるっていうことなんだけどな そもそも工程表程度の精度で浮動小数点の誤差が問題になることなんてないだろうに どうしても誤差が気になるなら割り算を商余で表現するとか演算順序の見直し(割り算を最後に)