Excel VBA 質問スレ Part74

■ このスレッドは過去ログ倉庫に格納されています
2021/12/20(月) 01:40:59.22ID:jnlr9GaR0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part73
https://mevius.5ch.net/test/read.cgi/tech/1631485799/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/01/15(土) 00:56:09.86ID:xF8zc0t/0
んー、セルはunicode対応で環境依存文字使えるけどエディタはsjisだから文字コード自体が違うだけかと思ってた
2022/01/15(土) 01:08:19.24ID:8e4JI6z40
>>397
詳しい説明ありがとうございました。とても複雑なんですね。
2022/01/15(土) 11:15:34.39ID:6domvLfM0
Range.Rangeプロパティ、イミディエイトウインドウ、ローカルウインドウ 便利
2022/01/15(土) 12:40:23.72ID:8e4JI6z40
>>387
文字コードについて詳しくないので教えて下さい。
ChrW(163)をセルに書き込むとポンドの半角通貨記号でした。
そのセルのcode()を見ると63でした。
2つの値が異なるのは163がユニコードの番号で63がANSIの番号だからですか?
どちらか一方だけ(例えばユニコード)に対応した関数で使用を統一する方法はあるのでしょうか。
2022/01/15(土) 13:37:09.72ID:Op2FQMu7M
>>401
状況よくわからんけど AscW(Cells(1,1).Value) とかじゃ駄目なの?
403デフォルトの名無しさん (ワッチョイ df68-VTvg)
垢版 |
2022/01/15(土) 13:37:27.88ID:w/VctcoP0
>>40
違う
code()の返り値が63は、2パターンある
一つは半角「?」。これは正真正銘の63
もう一つはshiftjisでもasciiでもない文字。絵文字など。それも63が返って来る
後者は出力の際に、ユーザーに対する応答として便宜上「?」を使っているだけだろう。

>>387の言ってる>SHIFT_JIS環境で想定がないんじゃないかって
これはそういう意味だと思う。多分

文字コードは難解な上に歴史的経緯が大きく影響から、あんまり深追いしないほうがいいよ。得るものも少ない。
ダメ文字知ってるぐらいで良い
404デフォルトの名無しさん (ワッチョイ df68-VTvg)
垢版 |
2022/01/15(土) 13:38:25.50ID:w/VctcoP0
それを考えると、変な文字でワークシートとvbaを行ったり来たりさせないほうが良いと思う
ってことぐらい注意しておけばいいんじゃないかな
2022/01/15(土) 17:07:04.41ID:m8G7GxvMM
クラスモジュール初めて使うんですが、
ひとつのクラスモジュールに、
マクロで使用するWsをまとめたクラスを作りたいんですが、
入力用Ws
 Ws1_入力用
 Ws2_入力用
一時計算用Ws
 Ws1_一時計算用
 Ws2_一時計算用

みたいに作ることはできるんですか?
入力用Ws(一時計算用Ws)まで入力して、ドットを打つと
インテリセンスでそれぞれのWsが選べるようになる・・・という構造をにしたいのですが。

例えば、標準モジュールから呼び出すときに
Dim ClassWs As ClassWs: Set ClassWs = New ClassWs
ClassWs.入力用Ws.Ws1_入力用
ClassWs.一時計算用Ws.Ws1_一時計算用
のような感じです。
できた場合でも、あまりこういった書き方はしないほうがよいですか?
2022/01/15(土) 18:42:53.07ID:XFuYRO140
>>401
まず、文字コードって言われているものには複数の種類があって、同じ文字であっても違う番号で表されることがある。
そして、文字コードを規定している体系によって、持っている文字の種類や数が決まってる。
これが文字コードの大前提

今回の問題は、Windows日本語版のANSIでは半角ポンド記号は定義されていないってこと

>2つの値が異なるのは163がユニコードの番号で63がANSIの番号だからですか?
ChrWはUnicodeを扱う関数
codeワークシート関数はANSIを扱う関数
同じ文字でも数値が違うのは当たり前
unicodeワークシート関数使えば当然同じ数値になる

ただしANSIでの63ってのは"?"文字のコード
codeワークシート関数の数値については、対応する文字がない場合は?のように扱うんじゃないかな
なので?の数値が帰ってきてると思われ

>どちらか一方だけ(例えばユニコード)に対応した関数で使用を統一する方法はあるのでしょうか。
ANSIで使えない文字がある以上、ユニコードでやるしかない
2022/01/15(土) 18:52:54.92ID:XFuYRO140
>>405
Wsってなんだ?
そもそもの目的はなんだ?

一つのクラスに機能を集約するのはまあよくある
機能ごとにクラスやモジュールを分けるのもよくある
規模とか再利用性とかとの兼ね合い
408デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/15(土) 19:00:32.98ID:w/VctcoP0
>>405
名称が完全に二重になっているし、入力がめんどくさくなってるだけでは?
クラスはMeを使わないならあんまり使う意味は無いと思う。
事務の補助程度なら、その場面はほぼ無いと思う。ってか、vbaでクラス使った事ない。

ワークシートに別名を持たせてインテリセンスで使いたいだけなら、
関数+グローバル変数にして最初の一行で呼び出しきってしまえば良いと思う
https://i.imgur.com/2w8bUT8.png

ワークシートなら死ぬほど使うから、グローバル変数でも問題ない
2022/01/15(土) 19:19:41.65ID:m8G7GxvMM
>>407
>>408
ありがとうございます。
おっしゃる通り、今まで事務の補助程度で自分用としてしか使ったことなかったのですが、
今回初めて配布用のマクロを作っていて、膨大にモジュールが増えてしまい混乱していました。
クラスモジュールなら解決できるのかなと思いまして・・・
画像付きで解説までいただき、助かりました。
2022/01/15(土) 19:37:36.41ID:UMPZ1rN80
>>405
VBAではひとつのクラスはひとモジュールで書く制約があるからそのような記載は無理。
ただ、入力用と一時計算用のクラスを別に作ってWSクラスとやらの中で生成してそれをPublicのプロパティや変数にしまっておけば入れ子としての設定や読み取りは可能。

クラスを使用する前にそもそもクラスとはどういうものであってどういうときに使うと便利なのかを理解した方がいい。
411デフォルトの名無しさん (アウアウウー Sa05-wAYo)
垢版 |
2022/01/15(土) 20:07:58.86ID:FEpdyYa5a
>>409
混乱をふやしてどうする
2022/01/16(日) 00:51:21.02ID:rwDbh7Xz0
>>405
やっと理解したわ
入力用Wsと一時入力用Wsでインテリセンスを分けなくてもいいなら簡単にできる
コンストラクタでワークシートをセットするだけでいい
2022/01/16(日) 01:16:49.54ID:9svQYmXf0
>>406
詳しい説明ありがとうございました。
一つわからないことがあります。
> 今回の問題は、Windows日本語版のANSIでは半角ポンド記号は定義されていないってこと
とのことですが、そうしますと377さんの
serchChar = "£"
testfunc01 = InStr(StrConv(word, 10), StrConv(serchChar, 10))
のStrConv(serchChar, 10)によって全角のポンドの通貨記号は何に変換されるのですか?
414デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 01:18:43.61ID:JxOh46GE0
VBA・・・コンストラクタ・・・
2022/01/16(日) 06:52:16.37ID:rwDbh7Xz0
>>414
あるの知らんの?
416デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 09:31:02.87ID:JxOh46GE0
>>415
間違えてた、すまん
コンストラクタ自体はあるのね、無いと勘違いしてた
確かにこのケースなら使える
2022/01/16(日) 13:56:03.36ID:UA4PX5Jc0
OSのVer. やExcelのVer. 更には文字コードの変遷に依っては近い将来ですら読み取れなくなって「?」でしか
表されなくなるかも知れないものを、将来の資料として保存するためにExcelで残そう という企てが不可解
例えhtmlで保存するとしても文字コードの軛からは逃れられない 保存時にPDFにするのかも知らんけど 
テキストデータとして〇£〇シリング〇ペンス(ペニー) の資料が豊富にあって、それぞれから数値だけ抜き出したい
という要望だと信じていたが、そんなデータが遺されているのだろうか? シリング時代はPCすら無い時代
紙の資料がごまんと出てきた それをデジタル化してる とかなのだろうか
時代による金の含有量の変遷を遺したい とか書いていたが、ニッチな知的好奇心を満たそうとする人は
細かい事にも拘り続けるんだな、と    
文末脚注に Lはポンドの意味 のひと言で済むのに シリングだって記号s ペンスは記号pだろうに

例えば沈没船の積み荷の目録が出てきた そこには〇£〇シリング〇ペンスの記載がずらずら
これ引き揚げて通貨を溶解して金にしたらインゴット〇〇本分の量だぞ! 金の総重量をExcelで集計しろ! 
とかいう要望ならまだ判るんだが
2022/01/16(日) 14:34:44.43ID:9svQYmXf0
>>417
> テキストデータとして〇£〇シリング〇ペンス(ペニー) の資料が豊富にあって、それぞれから数値だけ抜き出したい
> という要望だと信じていたが、そんなデータが遺されているのだろうか? シリング時代はPCすら無い時代
> 紙の資料がごまんと出てきた それをデジタル化してる とかなのだろうか

「ポンド・スターリング―イギリス貨幣史 (1984年)」を読んでいる。計数上の特性を正確に理解しないと内容を追えないから。


> 文末脚注に Lはポンドの意味 のひと言で済むのに シリングだって記号s ペンスは記号pだろうに

ペンスの記号はdね。pでなくてdなのは歴史的な経緯がある。
正しく記述しておけば後から苦労しない。

それにコードとして本来期待した動きをしない時に疑問を持つのは当然。
その結果、文字コードが原因ということ、および解決法も判明した。
今後の欲に立つ。
原因不明のまま安直にLで凌ぐのは、一時対応を除いて、よくない。
2022/01/16(日) 14:54:09.16ID:EoUder1l0
>>405です。

>>410
>>412
ありがとうございます。クラス全然理解できていなくてすみません。

メンバ変数
Public ws1 As Worksheet
Public ws2 As Worksheet

にして、コンストラクタで
Private Sub Class_Initialize()
Set ws1 = Sheet1
Set ws2 = Sheet2
End Sub
を読み込ませる、という認識であってますか?
以下のように、ゲッターで各wsのプロパティを作っていくのはやめたほうがいいでしょうか。

Property Get ws1() As Worksheet
Set ws1 = Sheet1
End Property
Property Get ws2() As Worksheet
Set ws2 = Sheet2
End Property
2022/01/16(日) 15:26:39.86ID:0L8LiCPu0
Windows 10, Excel 2019

hyperlink関数を使ったリンクからブラウザを起動する時に
特定のURLのみ応答が60秒ほど遅い
クリック後すぐにEscを押すと60秒ほどの待ち時間が無くなりすんなり接続できます

遅い
= hyperlink("https://www.yodobashi.com/";, "yodo")
遅くない
= hyperlink("https://www.アマゾン.co.jp/", "ama")

ちなみにExcelを介さずアクセスするとすんなり表示されます
他に60秒ほどの待ち時間を無くす方法があれば教えて下さい
2022/01/16(日) 15:44:15.55ID:y1CvsdF30
>>413
それぐらい自分で試せよ

U+FFE1の半角ポンド記号になるっぽい
普通に正しい動作だな
2022/01/16(日) 16:10:07.63ID:9svQYmXf0
>>421
そういう意味の質問じゃなくって、「Windows日本語版のANSIでは半角ポンド記号は定義されていない」と書いていたので、StrConv(serchChar, 10)では半角ポンド記号に変換できないのじゃないかと思ったわけです。でも正しく処理しているんで、VBA 上では表示はできないけど計算処理はできるということですかね。
2022/01/16(日) 16:12:28.73ID:y1CvsdF30
>>419
クラスもモジュールの一つなんだが
まず処理の内容とモジュールの役割分担を考え直せ
インテリセンスに出したいからとか、本末転倒だ

インテリセンスに出したいだけなら、>>405の例ならクラス三つつくって
ClassWsクラスに
Public Property Get 入力用Ws() As 入力用Ws
Public Property Get 一時計算用Ws() As 一時計算用Ws
入力用Wsクラスに
Public Property Get Ws1_入力用() As Worksheet
Public Property Get Ws2_入力用() As Worksheet
一時計算用Wsクラスに
Public Property Get Ws1_一時計算用() As Worksheet
Public Property Get Ws2_一時計算用() As Worksheet
をそれぞれ定義すればできる
中身は自分で考えろ
2022/01/16(日) 16:19:51.33ID:y1CvsdF30
>>422
VBAの内部文字コードはユニコード
ユニコード表示できないのはVBEと言われている、VBAのエディター

なのでVBAでユニコードの処理はできる。VBEで文字を直接入力できない(ものがある)だけ
だから>>378でCHRW使えって書いてる
2022/01/16(日) 16:33:04.70ID:9svQYmXf0
>>424
よくわかりました。ありがとうございました。
2022/01/16(日) 19:01:50.46ID:EoUder1l0
>>423
ありがとうございます。
もう一度、役割分担を考えてみます。
2022/01/16(日) 19:41:57.72ID:rwDbh7Xz0
まあたしかにインテリセンス出したいだけならオブジェクト名を変更するだけでもいいかもしれんな
428デフォルトの名無しさん (アウアウウー Sa05-wAYo)
垢版 |
2022/01/16(日) 20:05:03.64ID:xYtP7RFCa
次の担当になる人がかわいそうだな
2022/01/16(日) 20:18:31.11ID:RSDKT1580
>>362
コードは他のシートと同じだったので省きます。
画像は消しても変わりませんでした。コードを消してもセルをクリックしたときにたまに読み込みが入るので何かが動いてそうなのですがどこ見ればいいでしょうか…。
430デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 20:31:17.59ID:JxOh46GE0
>>426
431デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 20:31:53.39ID:JxOh46GE0
>>426
色々聞いてみるといいかもね
恐らくインテリセンスも、みんな使わない
432デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 20:35:43.37ID:JxOh46GE0
>>429
>>363の通り、どこで時間が書かているかを突き止める必要がある
2022/01/16(日) 20:53:15.31ID:RSDKT1580
>>432

初心者なのでDebug式をどこに代入すればいいかわからないので教えてください。

https://i.imgur.com/dzwx5GC.jpg

(コード書くと改行多すぎで弾かれます)
434デフォルトの名無しさん (ワッチョイ 6e8e-SRyr)
垢版 |
2022/01/16(日) 21:09:10.46ID:KEj0DMHt0
>>433

>>2を読め
435デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 21:13:53.65ID:JxOh46GE0
>>433
>>434は頭おかしい
ちょっと待て
436デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 21:14:52.42ID:JxOh46GE0
っって思ったけどせめてデータで出せ
メモ帳にコピペしてdotupとかそのへん
437デフォルトの名無しさん (ワンミングク MM52-/2yr)
垢版 |
2022/01/16(日) 21:22:18.03ID:lhZQvquHM
馬鹿を相手にすんな
438デフォルトの名無しさん (ワッチョイ d168-e0vW)
垢版 |
2022/01/16(日) 21:26:17.91ID:JxOh46GE0
>>437
専門板にいると、自分が万能な気になる
そうじゃないんだよ
みんな、一長一短なんだ
2022/01/16(日) 22:33:39.20ID:uTGjF8kU0
>中身は自分で考えろ

おー!!カッコいいねー!!
熱血トレーナーみたいだね〜
2022/01/16(日) 22:35:56.49ID:YgWToIcEd
VBAで更新したパワークエリーが更新完了まで待機するコードありますか?
2022/01/16(日) 23:13:05.80ID:RSDKT1580
Private Sub Worksheet Before DoubleClick(ByVal Target As Range, Cancel As Boolean)
Const Hani = "N4 N1000
Const Iro. As Variant 15
Dim Rng As Range
Set Rng = Intersect(Range(Hani), Target)
If Intersect(Target, Range("N4 N1000')) Is Nothing Then Exit Sub
With Target
Select Case Value
Case
Value = "2000"
Case "2000
Value =""
End Select
End With
If Not Rng Is
Nothing Then
Cancel = True
If Rnginterior Colorindex = xINbre Then
Eng Interior Colorindex = Iro
Else
Prg Interior Colorindex = xiNbre
End IfEnd If
Set Rng = Nothing
End Sub
2022/01/16(日) 23:18:31.80ID:ranDxh1Nr
Googleレンズで読み込んだやつなので正確ではないけど流れは一緒です。
ネットにあった色つけコードに数字も入力するようにしています。
↑で言っていたように使用しているAシートとBシートに違いはほぼないです。というか新規シートにBをコピーしても読み込み遅くなるので全く理由がわからないです。フォントは一緒、セルの使用数は読み込み遅いシートのほうが少なく、画像も関係ないので何がなんだか…
2022/01/16(日) 23:50:40.30ID:ranDxh1Nr
ごめんなさい
https://hoimins.com/uncategorized/excel-page-break-preview-slow/
多分これです。印刷範囲を設定したら読み込みがなくなりました。
2022/01/17(月) 12:48:25.06ID:RtDdCZiGM
ほれ、タイプミスだけ直しといてやったぞ

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Const Hani = "N4:N1000"
  Const Iro As Variant = 15
  Dim Rng As Range
  Set Rng = Intersect(Range(Hani), Target)
  If Intersect(Target, Range("N4:N1000")) Is Nothing Then Exit Sub
  With Target
    Select Case .Value
      Case ""
        .Value = "2000"
      Case "2000"
        .Value = ""
    End Select
  End With
  If Not Rng Is Nothing Then
    Cancel = True
    If Rng.Interior.ColorIndex = xlNone Then
      Rng.Interior.ColorIndex = Iro
    Else
      Rng.Interior.ColorIndex = xlNone
    End If
  End If
  Set Rng = Nothing
End Sub
2022/01/18(火) 15:16:34.47ID:TQ7V1ae50
前スレの298,303なのだが、
msgboxでウィンドウを表示させるとExcelがクラッシュしないことがわかった。
だから
'マクロがクラッシュしないための措置
i = MessageBoxTimeoutA(0&, "マクロを開始します", "通知", vbMsgBoxSetForeground, 0&, 100)
自動的に閉じるmsgboxを表示させることで回避策としたわ。

msgboxがある/なしでクラッシュするなんて言うバグてきいたことあります?
446デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/18(火) 15:40:58.30ID:CJu6lFHP0
>>445
聞いたことはないけど、合ってもおかしくないと思う
OSや別アプリと並行処理させ、並行処理が終わってないままvbaだけ処理すすめる・・・ことで落ちていると思う
DoEventsで解決するはずなんだけど、DoEvents自体も挙動がどこかおかしい。

多分だけど、
applicaion.calcurate=false
とか高速化入れてない?あれを設定しなければ落ちなくなる可能性があると思う
447デフォルトの名無しさん (ワッチョイ aeda-wAYo)
垢版 |
2022/01/18(火) 18:06:02.41ID:2NZPk0PK0
フォーカスがなくなって裏で動いているのに気づかなかったってだけじゃね
2022/01/19(水) 02:44:48.77ID:J6vWAZC60
>>94
自己レスだけど検証してる動画があった
https://youtu.be/FSS94HnW3Dk
2022/01/19(水) 08:14:43.10ID:SKsqr1XrM
>>448
見たけど画面描画してるからその分遅くなってることを考慮してない、やり直し、と言いたい。
まあそれでも結論は変わらんと思うが。

というか、たぶん結論有りきで動いてるよなこの人。
2022/01/19(水) 12:40:48.58ID:U3XJgxPOM
>>449
画面更新止めるコマンドもあるので別に気にはしてないですが、エクセルの関数が実数になるまでそれなりに、時間かかりますよね

まぁ、でもAの方法(外部リンク参照)で作り変えて行こうかと思います。
2022/01/19(水) 16:06:12.24ID:wLv0/dLh0
取得したデータをどう使いたいのかにもよるけど
参照するExcelブックの数が増減する場合はVBA使って特定のフォルダにぶち込まれたExcelブックを全部取得するようにすると楽
個人で使う分にはこれでいいが、仕事などで自分以外の社員が触る機会がある場合は、周りのスキルを考えてVBAを使わず数式で参照させて済ますのも良いと思う
だが、環境にもよるが、外部参照を含む数式を書いたExcelブックを開いたまま参照先のExcelブックを開くと参照エラー(#REF!)になる場合があるので注意
452デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/19(水) 16:34:49.01ID:x+9vZ6k00
MSGBOXが表示された時、必ず最前面にする方法ってありますか?
alt+tabでタスクを切り替えないとMSGBOXが表示されない事があります
処理が止まっているのか進んでるのか分からなくて、困ってしまう
2022/01/19(水) 17:15:49.65ID:O8ktC4tSM
>>452
VBAのMsgBoxでは不可能
Win32APIのMessageBoxAをTopMost=Trueに設定して呼び出すしかない
VBAからMessageBoxAを呼び出す方法はぐぐればすぐ出てくる
454デフォルトの名無しさん (ラクッペペ MM66-Dw/N)
垢版 |
2022/01/19(水) 17:21:36.62ID:ZRK6Alb6M
そんなフラグ効果あんのか?
455デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/19(水) 17:56:37.68ID:x+9vZ6k00
>>453
ありがとうございます、そういう方法があったのですね。
処理完了のメッセージボックス、そちらにしていきます。助かりました。
2022/01/19(水) 18:35:22.31ID:DmIv8IzU0
いちおうMsgBoxでシステムモーダルの指定があるにはあるんだけどな
期待通りに動かんことが多い

いちアプリケーションがシステム全体にかかわる動作をするなって風潮だからな
2022/01/19(水) 18:45:15.60ID:F2K8Y8lc0
>>451
他ブックへの参照はgotoより使いたくないかも
2022/01/19(水) 19:04:03.23ID:DmIv8IzU0
>>457
複数のブックで構成されてるような資料だとまあなくはないかと

しかしリンクとコピーが比較対象になるのが理解できん
速度とかで選択するようなものじゃないだろ
2022/01/19(水) 19:59:02.99ID:wLv0/dLh0
>>457
わかるけど、それはプログラミングの知識がある人が職場に当たり前にいるという前提の話
まったくVBAを知らない社員に一から教え込むよりまし
ていうか個人的には、Excelブックを100個も参照させるようなのが仕事上の事情なら、まずはその運用を見直した方がいいと思うけど
2022/01/19(水) 20:45:45.55ID:U3XJgxPOM
他ブックの参照がなぜ駄目なのかさっぱりわからないです。。教えて下さい。

参照後の処理の内容になにか前提条件があるのですか?
自分の前提は、Excelブックを参照、みんな同じExcelバージョン、同じフォーマットを使うです
2022/01/19(水) 20:58:42.62ID:B4PAoBE9M
リンク切れで機能しないゴミとなったブックをお目にかかったことがないなら幸せなことだな
2022/01/19(水) 22:01:47.23ID:K9C4LDWb0
エクセルは詳しくないけど、「存在しない可能性すらある
グローバル変数」ってこと?

ちょっと学んで、「どこからでもセルの書き換え効くの?
グローバル変数地獄じゃない?」と思ったけど、もっと
大規模に起こり得るってこと?
2022/01/19(水) 22:31:45.36ID:wLv0/dLh0
>>460
フォルダ名(参照・被参照のExcelブックが別々のフォルダにある場合)、ファイル名、シート名、(使用しているなら)テーブル名、あとセルの配置
どれか一つでも変えるとリンク切れになるので、できればあまり使いたくない
ただ、先にも書いたけど状況次第ではやむを得ないこともあるし、もしそのあたりのリスクを払拭できるなら選択肢としてはあるかなと思って書いたけど、
もし、そういうことをそれほど把握する必要がない程度に重要性が高くなく、かつパフォーマンス(速度)重視の話なのであれば、あまり気にしなくていい

でも、これが仕事で何度も使用するような類のものの話だとすれば、パフォーマンスを考える前に運用をよく考えた方がいい
例えば、ファイル数(100個)や参照セル数(ブック1つにつき60セル)が固定で、シートやブックなんかはパス付で保護かけて構造を弄れないようにして、できたらファイル名なんかもアクセス権を設定して変更できないようにするか、ファイルを扱う人に絶対変えないようにしっかり申し送りするとか
もしくは構造を弄られたとしてもすぐ元どおりにできるぐらいのシンプルな作り、あるいは壊されてもすぐ復元できるようにしておくとか
どんな状況なのかは分からないけど、何を優先すべきなのかをよく整理した方がいい、という話になると思う
2022/01/19(水) 22:43:22.55ID:zGHKrub60
>>460
親からひ孫世代まで参照が繋がってるファイル群なんてものが存在した
2022/01/19(水) 22:52:36.39ID:TxiQul+S0
>>464
参照繫ぐくらいなら、ファイルパスもセルに記入して上書きさせるように実装するわ。それくらいリンクは嫌だわ。
2022/01/19(水) 23:01:56.42ID:J6vWAZC60
なるほど。理解出来ました。
ありがとうございます。

運用的には
VBAでファイル名算出する
シート名が違っていたり、フォーマットズレしていたら検出したいチェックツールにしたいので問題なさそうです。
参照エラーがでたら壊した人のところに殴り込みに行くシステムですね。
2022/01/20(木) 00:15:58.14ID:gV+Fwxtn0
まあ、まともに作ったファイルサーバなら
shadow copy くらいは残ってるだろうがね。
468デフォルトの名無しさん (アウアウウー Sa05-wAYo)
垢版 |
2022/01/20(木) 06:56:43.44ID:AmtKyR6La
無理して変な機能追加するから
後で見返した時にワケわからなくなる
2022/01/20(木) 08:28:58.94ID:mCK9tQrM0
>>468
それはみんなそう
なので少しでもわかりやすいように書いておくことが必要
慣れてないうちはコメント付けまくるのもありだと思う
これは何の変数かとか、大きく何をしているか、この行は何をしているか書いとけばリファクタリングするのにも楽になる
470デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 08:52:11.33ID:aoz8cIff0
>>466
毎日カチコミになるのが目に見えているゾ
2022/01/20(木) 09:39:15.12ID:+AoyW20h0
どうしても100個のファイルに分けなければならないのか
一つのブックに100シート突っ込むことはできないのか
とか考えたりはするかも
472デフォルトの名無しさん (オッペケ Srd1-2j/7)
垢版 |
2022/01/20(木) 12:41:49.38ID:NS2MNDvFr
ファイルコピーか、シートのコピーで
バックアップ取っておくとかは考えるかも。
473デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 12:47:52.34ID:aoz8cIff0
取引先一件につき、ファイル一つ
それをマクロで集計

最初30個ぐらいだったファイルが、
会社が成長して、100ファイルになったことはあったな
フォーマットやファイルは全て自分で管理してたから問題なかったけど、
今も大丈夫かなぁ
あれ手で計算するのは大変すぎ
2022/01/20(木) 13:46:34.45ID:BPf7HX0l0
1ファイル45個のクエリーを含む同様のファイルが
13地点×6ヶ年分=78個あって、
これをシーケンシャルに1つずつ、For Nextで更新するよう組んだ。

最初の2ヶ月目くらいまでは7時間くらいで更新出来てたが、
3ヶ月目以降は毎回どこかの、
 Set tblQ = ThisWorkbook.Worksheets(ws).ListObjects(q)
と、ワークシート名とクエリー名を変数に代入するところでコケる・・・

その都度、コードを削除していったん保存、
再度貼り付けてデバッグし続行させる
沼にはまった。
475デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 13:49:08.24ID:aoz8cIff0
>>474
そういう時は、ファイル保存を挟むと良い
エクセルは立ち上げっぱなしだと、どんどんテンポラリファイルが巨大化する
保存すると、それが一旦整理される
2022/01/20(木) 13:57:12.27ID:BPf7HX0l0
>>475
アドバイス、ありがとう。

一応、開く78個のファイルは1個ずつ保存して閉じているけど、
大元のVBAを持つbookをその都度保存せよ
ということかしら?

そういや、プロジェクトエクスプローラーに
既に処理が終わって閉じたbookのファイル名が残って
どんどん増えて行ったような・・・

こっちは1ファイル処理後ごとに上書き保存とかの処理は入れてなかった。
2022/01/20(木) 13:57:52.65ID:HwD0Q83s0
なんで全部Excelでやろうとするかね ボリューム見て将来鑑みて、どっかの時点で「これはパンクする」
ってぇ判断をしなかったツケだろ 経費抑制? むしろ無駄な経費が膨大に掛かってるのには目を瞑るんだ へー
478デフォルトの名無しさん (ワッチョイ bd5f-2j/7)
垢版 |
2022/01/20(木) 14:17:24.56ID:gV+Fwxtn0
>>474
変数は毎処理ごとに開放してる?
2022/01/20(木) 14:28:11.68ID:mCK9tQrM0
>>477
本人はやれる中で頑張ってるんだと思う、きっと
でも確かにそれはAccessのほうがってことはあるよね
VBAできる人なら覚えるのも簡単だと思うし
2022/01/20(木) 14:32:45.01ID:bfB7zVPYM
kintoneとかでいいでしょ
481デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 14:40:11.29ID:aoz8cIff0
>>476
>一応、開く78個のファイルは1個ずつ保存して閉じているけど、
もし、
set foo = workbook.open~~~)
みたいにしてたら、最後に
set foo = nothing
を挟まないと、ずっとメモリ残り続けることになると思う。>478さんの指摘がこれ

>大元のVBAを持つbookをその都度保存せよ
これはかなりオススメ。
コードの内容がわかって無くても、エクセルファイルを保存すると大体うまくいく
※保存時に色々とうまくやってくれてるっぽい

>>477
それ言い出すと全企業が大企業並の設備を整える必要がある
ある程度拡張性を備えた上で、「5年後は別システムに移行しているだろう」のような判断ができればいいね
基本、要素(営業や取引先)がドカドカ増えないなあ、システムは特に移行しなくていいと思う。
多少使いにくくても、ノウハウが切り捨てられる方が惜しい
482デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 14:41:43.21ID:aoz8cIff0
>>480
使ってから言えよ
あれ柔軟性が全くない

柔軟性の必要がない、タピオカ屋さん、ワッフル屋さんなんかにはドンピシャだろうね
2022/01/20(木) 14:41:48.98ID:BPf7HX0l0
>>478
してなくて、ぼんやり「まずはこのあたりをやらなきゃアカンのかなぁ・・・」とは思ってた。
次に更新する月初めまでにやりまする。

大元のbookで、
"For i To k" より後の、
"Next i" までに使った変数全てについて
 Set 変数名 = Nothing
を "Next i" の直前に入れる感じで?
2022/01/20(木) 14:48:42.80ID:bfB7zVPYM
>>482
本当にその柔軟性必要?勝手にそう思い込んでるだけじゃない?
方眼紙に自由自在にレイアウトできなくても情報は伝わるんだぞ
485デフォルトの名無しさん (ワッチョイ bd5f-2j/7)
垢版 |
2022/01/20(木) 14:49:07.12ID:gV+Fwxtn0
一つのプロシージャで全処理するより

Class とか、Function 使う方が良いかもね。
486デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 15:07:43.50ID:aoz8cIff0
>>484
必要
もちろん100社で100通りじゃない。100社で10通りぐらい。今後も増えるだろう
この柔軟性は、エクセルだとかなり受け入れやすい

>>485
正直、なるだけ1プロシージャは維持したほうが良いと思う
エクセルVBAは他の言語と違って、あまりにファイルへの依存性が強すぎる
487デフォルトの名無しさん (ワッチョイ bd5f-2j/7)
垢版 |
2022/01/20(木) 15:16:04.35ID:gV+Fwxtn0
ふーん。

オレなら処理毎にFunction プロシージャに引数で渡してあげて
ループ処理終わったら、変数開放するけどな。

変に長ったらしいのより、そっちの方が解読性がよくなる。
488デフォルトの名無しさん (ワッチョイ 6e8e-SRyr)
垢版 |
2022/01/20(木) 15:19:27.67ID:n5KSDES60
>>481
お前みたいな奴がメンテできないシステムを作り出すのだぞ
2022/01/20(木) 15:20:13.56ID:gV+Fwxtn0
まあ、オレはAccess VBA専門なので
Excel VBA は遠い記憶ですが…

シンプル・イズ・ベスト。
490デフォルトの名無しさん (ラクッペペ MM66-Dw/N)
垢版 |
2022/01/20(木) 15:20:30.61ID:/dOetE+CM
バカがやると引数地獄かグローバル地獄になんだよ
491デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 15:21:57.99ID:aoz8cIff0
>>488
言いたい事は分かるんだけど、エクセルはOSの依存が妙に強くて
OSの機能借りないとキツイ部分が多々ある
未だにMSGBOXがどうしようもなかった
492デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 15:22:53.50ID:aoz8cIff0
>>490
なるほどw
2022/01/20(木) 15:24:46.85ID:gV+Fwxtn0
>>490

初心者はね。

最近は設計工程ばかりで、コーディングもしてないから
下流ビギナーの思考はわからんけど。
2022/01/20(木) 15:38:37.39ID:gV+Fwxtn0
確かにグローバル変数は使わない方が良い。

ホーム・プロシージャからFunction へ飛ばして
処理させてあげて
戻り値を次のFunctionへ…

って感じで作ると、テスト工程の時に楽になる。

デッカいシステムを組むとそっちの方が絶対楽だし
改修の時も、解読に困らないからね。
495デフォルトの名無しさん (ワッチョイ 6e8e-SRyr)
垢版 |
2022/01/20(木) 15:56:22.20ID:n5KSDES60
>>491
いや、お前の能力が足りないだけだぞ
496デフォルトの名無しさん (ワッチョイ 8d68-e0vW)
垢版 |
2022/01/20(木) 16:21:54.83ID:aoz8cIff0
エクセルの場合は、エクセルという超グローバルオブジェクトがある
それをメインに据えれば良いと思うけどな
2022/01/20(木) 17:01:00.66ID:ovHTHlPT0
ホント、マクロは組む人によってその人のカラーや癖が出るとは言ったもんだね。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況