Excel VBA 質問スレ Part78
レス数が950を超えています。1000を超えると書き込みができなくなります。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
ExcelのVBAに関する質問スレ
コード書き込みや作成依頼もOK
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
Excel VBA 質問スレ Part77
https://mevius.5ch.net/test/read.cgi/tech/1658009255/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured >>846
ところで会社で嫌われてない?
その方が心配だわ >>848
別の話だろ
Excelと販管ソフトに個々に入力してるから安心とか言うならそれは単に二重入力してミスを見つけてるだけの話
>>851
まあこんなことを言い出すやつなんだろうけどw >>849
だから何をやりたいのかいまいちよくわからんけど100個コピー作りたいならループで回せばいいだけ
新規のDictionaryはループ中で確保する
timeline.Add Yukkuri
Dim N As Long
Dim Yukkuri1 As Dictionary
Dim Key As Variant
For N = 1 To 100
Set Yukkuri1 = New Dictionary
For Each Key In Yukkuri.Keys
Yukkuri1.Add Key, Yukkuri(Key)
Next
timeline.Add Yukkuri1
Next >>853
2つにそれぞれ意味があるから良いだろ
ソフトは客先に納品書や請求書をプリントしたり、EXCELは社内の全ての管理をしやすいように情報付与、そしてその2つが在る事でどちらのかの入力ミスを防げる
この仕組みで会社が儲かってるんだからケチ付けられんわ俺も >>814は恐らく連想配列が欲しいわけではなく、
javascriptやpowershellにあるような動的なプロパティが欲しいんだろう
VBAではそういう便利なものはないので基本ノードデータにジャグ配列を使って
ノードの先頭にプロパティ名に相当するタグを付けていった方が記述量的にも混乱が少ないと思われる >>814の意図を汲んだデータをジャグ配列のノードで表記すると恐らく以下の様になる
dim timeline_root
timeline_root = array("timeline" _
,array("Yukkuri", array("Name", "霊夢"), array("serif", "霊夢です")) _
,array("Yukkuri", array("Name", "魔理沙"), array("serif", "魔理沙だぜ")) _
)
配列の要素0に必ずタグ名が入るようにすれば、HTMLのDOMツリーのように一環した探索ロジックが組める >>857
やろうとしてることは、ゆっくりムービーメーカー4の定義ファイルをVBAで編集すること。
ゆっくりムービーメーカー4の定義ファイルはJSONになってて、
VBAではJSONが使えないから、誰かが組んだVBA-JSONを使うと
JSONがVBAのコレクションやディクショナリー(連想配列)で作られたデータになる。
そこなかで、セリフが定義されてるを連想配列を複製してセリフ書き換えてくてことをやってるんだけど、
VBAのSETて参照するだけで、その参照したものを上位の配列にaddしても、
参照先情報みたいなものがaddされるだけで、別メモリーの情報がaddされるわけじゃない。
ただ、試行錯誤していたら
一旦同じ連想配列をaddしたものを作って、
それをjsonにして、またそのjsonを連想配列に戻してやれば、
別メモリが割り当てられた連想配列が出来上がった。
そのあとは個別に要素を書き換えられる。
javascriptとかは
.配列.push({...Yukkuri[0]})
とかやれば行けたんだが、VBAは無理なのか。 >>858
処理対象がjsonなら最初からそう書けばいいのに
いくつか手段はあるけどVBAでやろうとすると結局面倒だし特に理由が無いなら他を検討してみては
VBA-JSONの使い方の話なら俺は知らん >Excelと販管ソフトに、個々に入力してるから安心
もし、この2つが異なった値なら、システムが破綻しているw
オリジナルは1つのみ!
そして、バックアップ用のコピーを持つべき! 例えば、銀行のシステムでも、2つのオリジナルを持たない。
3人が同時入力して、多数決でオリジナルを決める
サーバーでもそう。偶数個のノードにしない。
1:1, 2:2 などの分断が起きて、どちらがオリジナルか判断できなくなる
必ず、奇数個で判断して、オリジナルを決める。
そして、オリジナルのバックアップ用のコピーを持つ
そうしないと、システムが破綻する >>861
知らんがな
システムの良い悪いの判定なんてお前らに求めて無い事を察しなさい
俺以外の社員含めて理不尽な事をやってるなと思いながら仕事をしてるんだから
70歳の引退予定の上司に言ってくれ
そいつがいなくなればスッキリさせる >>862
例えば3人で販管ソフトに入力したとして
その販管ソフトの仕様により、会社の必要とする情報を持てない場合はどうするんですか?
そもそも一人しか人的資源が無い場合はどうするんですか? >>872さんはキーワードで所望の範囲指定はできたのでしょうか? >>865
変数を定義して範囲の右下のキーワードを拾って
ActiveSheet.PageSetup.PrintArea =
のところにその定義した変数を入れてやるという理屈で合ってますよね?
後はフサフサでも分かるEXCEL VBAの本が到着してから勉強します >>858
> VBAのSETて参照するだけで、その参照したものを上位の配列にaddしても、
> 参照先情報みたいなものがaddされるだけで、別メモリーの情報がaddされるわけじゃない。
だから新規に作ってコピーしなよって書いたのに...
コードまで書いたのに無視するんならもうさじ投げるわ >>869
新規に作るていっても、複雑な連想配列の塊をどうやって作る?
サンプルはたかだなNameとserifしかキーがないけど、
キーがいっぱいある構造のデーターをコード内でコピーするロジックを書くのは無理だと考える。
しかもその構造が動的だったらお手上げ。 質問スレに回答してくる人は善意でやってるだけで最終的に自分で解決できないならあきらめろって話 >>870
> キーがいっぱいある構造のデーターをコード内でコピーするロジックを書くのは無理だと考える。
> しかもその構造が動的だったらお手上げ。
お前にはお手上げなだけだろw
>>854 に "Name" とか "serif" なんて書いてない、キーを動的に取得してコピーしてることすら読み取れないレベルなら諦めたほうがいいと思うよ マクロでやりたいなら行数が最大になるパターンで書式作っておいて、そこにデータ入力、不要な行の削除でそのまま印刷すればよくね? >>872
すまんできたわ。
ありがとう。
Set Yukkuri1 = New Dictionary
を書く位置を間違えてた またVBAが壊れた。
プロシージャの中でオブジェクト変数に割り当てる
ワークシート名やクエリー・テーブル名を
日本語にしているのはマズい? vbaが壊れるという表現が分からない
プログラムは組んだようにしか動かない 先週までは問題なく動いていたブックを開くと、
すぐExcelが落ちて回復が入ってしまい、
回復ブックを開くと、プロシージャがモジュールごと丸々なくなっていた。
ワークシートのクエリーやテーブル、計算式やグラフは壊れていなさそうで、
新たにモジュールを作り直して
バックアップを取っていたプロシージャの記述をそのまま貼り付けたら、
一応、VBAも動くようになった。
過去には新たなモジュールすら作れなくなったことも。 過去に学んでこの際だからぜんぶ変えてしまおう またいつアプデ地獄に巻き込まれるか知れたもんじゃ無いし
https://qiita.com/Q11Q/items/7a9d4c89726cfaa7abd6 「VBAが消えてしまった!マクロが壊れて動かない!」
ってな感じで検索してみたら? ACCESSで、NLSの問題でカナ含むVBAモジュールが開けなくなるってのはあったな >>881
ああ、そういえばIMAGE関数が家庭向けサブスクにも配布されたからと、
日曜日にExcelをバージョン2301に更新したんだった・・・ これが原因かどうかはまだ分からないけど。
https://i.imgur.com/49fEgC7.png
Office Insiderには参加していない。 >>886
10年ぐらい前、変数を日本語名にしてると一切動かなくなるってバグがあったな
確かACCESSだった
変数を日本語名にしても、あまりいい事はないと思う
>>878
あと、この方法はあまり良くない
一度壊れたブックは、内部的にゴミデータが残っている可能性がある
使いまわすと、そことバッティングする可能性がある
新規ファイルを作り、シートを一つずつコピー、vbaもテキスト単位でコピー、
といった感じで作り直した方が良い
めんどくさいけど、やっておいた方がいいよとは言っておく >>887
> といった感じで作り直した方が良い
やっぱり・・・orz ドイツのプログラマーが、Selenium、WebDriverを使わずにEdgeを直接制御するクラスを作ってるのを見つけた
試したらとりあえず動いたんで報告
https://www.codeproject.com/Tips/5307593/Automate-Chrome-Edge-using-VBA
動作テスト中にはまった点を書いておくと、裏でEdgeのアップデートチェックが走ってるとエラーが出て止まる
これだけ殺せば動く
taskkill /f /im msedge.exe
taskkill /f /im MicrosoftEdgeUpdate.exe
あと、Edgeの起動オプションを
--remote-debugging-pipe --disable-automation
に変えるとコマンドラインウィンドウが出なくなる Dim a As Long
Dim b As Short Dim a As Single
Dim b As Double
Dim c As Triple フサVBAの本が届いた~
分からないとこはよろしく >>889
どうしてわざわざEdgeをチョイスするのかと Edgeと言いながらプロトコル的にchronium系共通だし
OSに元から入ってるEdgeならIE難民にはちょうどいいんじゃね 他社との業務連携用途とかだと他の選択肢が無かったりする 質問です
VBAを使ってこのスレの人にアンケートを取りたい
皆さんは文系ですか?理系ですか?
もともとプログラミング出来る人ですか?
それとも経理とか必要に迫られて覚えた方ですか? 文字列の演算をエラーにする方法は無いでしょうか
Sub foo()
Str a
Str b
Str c
a = 1
b = 2
c = a + b
Debug.Print c
End Sub >>903
お、マイナスだとエラーになるんですね!
・・・ならんやないかーい 皆さんはお仕事何されてますか
事務をやって三年、仕事を楽にするために始めたExcelVBAは人並みに身についた気がしますが
ただの事務では給与が足りずプログラマに転向するには経験が浅いのです エクセルのvbaエディタ?がすごくつかいずらくて、
vsCodeでvbaが記述できるxvbaというツールを利用しようと試みています。
ですが、
エクセルで書かれたvbaの日本語文字が、vsCodeで読み込むと文字化けしてしまいます。
おそらく、エクセルの方のエディタがUTF-8ではないのかと思いますが。
このあたり、経験されているかた。どのように対処されていますでしょうか?
どうぞアドバイスください。 >>906
よく分からんけど逆にVSCでCP932使えば良いのでは? >>902
質問の意味が分からんけどそもそもabcをStringにしてるのはなぜ?
c = a + bに3と戻したいならc = Val(a) + Val(b)とでもすれば > Str a
> Str b
> Str c
なんていう謎の言語はスレ違いかと >>905
転職なら早い方がいい、年齢が若ければ新しい職場にもすぐ慣れるだろうから >>902
エラーにするってのがよくわからんが
個人的にはc=a+b以降をしたのようにする。
If vartype(a) = vbstring or vartype(b) = vbstring Then
Debug.print "エラー"
Else
c= a + b
Debug.print c
End If
End Sub
>>908
a=1 と直接書いてるけど本当は
a=どっかのセルの値にしたいんじゃね?
で、そのセルには数値以外が入ってる可能性があるから
文字列ならエラーにしたいんじゃないかと。
>>909
文字列に変換するstr関数を使いたかったんじゃね?
書き方間違えてるから謎の言語になってるけど。 Transposeで作る配列の
一番最初の要素の添字は0じゃなくて、1であってます? >>902
(1)たとえセルの書式が文字列でも
(2)数字っぽい内容だと
(3)勝手に数値型に変換されてしまう
https://i.imgur.com/0xrxf44.png
何がやりたいのか、ぼかさずに具体的に説明してくれないと無理 >>908
単純にコードのミスを検出したいだけなんです
変数名を間違えた場合の保険程度のつもりなんです
>>909
すいません
別言語触ってて何もかも間違えました
変数宣言dim a as stringのつもりでした
Sub foo()
Dim a As String
Dim b As String
Dim c As String
a = 1
b = 2
c = a + b
End Sub >>915
それなら素直にlongで宣言するべきでしょ
変数名間違えた時の保険って、紛らわし変数名にするなって話だし
変数名間違えたときのための保険って言い出したら何も出来ないじゃん
じゃあその「変数名間違ってたときの確認のためのコードの」変数名が間違ってたらどうするの?
その確認のための変数名確認のためのコードをつけるのか?
それが間違ってたら?
確認のための変数名確認のための変数名確認のためのコードをやるの?
って話になる >>916
逆で、文字列を数値として使ってしまった場合に検出したい
単にタイポ時の保険としてエラーが起こってほしいってだけだよ
vbaに無いなら仕方ない、そういう言語なんだなってだけで
別にそこには期待しないよ 少し上にいた大量にレスしてた奴みたいなおかしな質問者もいるし
適当に質問しても回答者が頑張ってくれるだろみたいな考えの質問者が多すぎなんだよ >>915
とりまOption Explicitは入れとけ
それ以上はVBA単独ではどうにもならん
型安全な処理系と組み合わせろ >>917
あのさぁ、自分の説明が下手くそなくせにできないのは他人のせい、言語のせいにするのはよくないぞ
単にタイプミスって言っても自分がコード書くときにミスしないようにしたいのか、使う際にinputBox等で入力させるときにミスをなくしたいのかで全然違うだろ
エスパーじゃないんだから質問するならもっと具体的にしろよ >>921
いやinputboxなら全部文字列だろ ExcelVBAは型に対する考慮が緩いから正直期待にそえる回答はないと思うよ
例えば変数名の先頭に型を付与するようなルール決めてもタイプミスって言葉で許されるなら破綻するだけだしね >>923
だから、最後までちゃんとかけや
それはinputBoxを格納する変数の話だろ
そんな話はしてないわ
色々な具体例があって様々な解決策があるのに、なんにも具体的な話を出さずに抽象的に話しして、一部に対してだけ反論してお前は馬鹿か? >>924
ですよね
ありがとうございました
>>925
質問を理解できないアホw つーか
「単純にコードのミスを検出したいだけなんです
変数名を間違えた場合の保険程度のつもりなんです」
本当にこれだけだったら先頭にOption Explicitつけて似たような変数宣言するな、で終わる話だよな
さすがにOption Explicitをつけてない人はいないだろうからそんな超初歩的な事はありえないと思ってるけど >>926
え、>>924で解決したのか?
ってことはマジでOption Explicitをつけてなかっただけ?
そこまで超ド初心者だとは思わんかったわ やっぱり
こういうのを相手にするのがそもそもの間違い IF Not Isnumeric( a + b ) then c = a + b
とか
c = a & b
とかの雑魚コードでも教えておけばよかったのに a = 1 の暗黙の型変換でエラーにしたいならそう言えよ >>928
なれると初心者の質問だって見抜けるようになるよ 質問が雑だと回答する側は色々考えるからこういう感じになるんだよ
だから質問する側もちゃんと回答しやすいようにすればいいだけ そんなの期待するだけ無駄
そっとスレを閉じればいいのよ 零細企業のアホみたいな奴に答えてやろうなんて思うから荒れる
助けてで始まる質問する奴や、頭が悪いのに自分はできるみたいに思っておかしな質問をする奴は無視するのが一番 てゆーかそんな事を言うやつがわざわざこんなとこ見るなよ
教えてやってるみたいな立ち位置でさw そもそも
> Str a
> Str b
> Str c
の時点で実際に動かしてないんだから相手する価値なし 相手にしたくないならほっておけばいいんだから無駄なレス書いて荒らすなよ
>>926
サンプル書けばわかると思うけど例えば下のようなコードは最後の数値型に数値以外の代入のみエラーとなるからコーディングミスしないように注意するしかないという話
Dim a As String
Dim b As Long
a = "a" '文字の"a"
a = 1 '文字の"1"
b = "1" '数字の1
b = "a" '変換エラー
>>928
そういう話じゃないと思うぞ キチンとString型を宣言しているなら確か
+は文字列連結の意味になるんじゃなかったっけ?
であれば前のレスで言ってた人がいたけど
- 0とか*0とかすればエラーになるんじゃないかな?
逆にSQLとかで文字列を数値で扱いたい場合は
*0とか-0とかにすると暗黙の変換で数値にしてくれる。
VBAでは型宣言は絶対だけど、
VBSみたいにスカラー変数を使う場合は
VBAみたいな型指定の型宣言が出来ないんで少し戸惑うかもね。
でもここはVBAのスレなので、
基本的に型宣言は絶対だと思っていいと思うよ。 >>944
>+は文字列連結の意味になるんじゃなかったっけ?
ならないよ >>944
> - 0とか*0とかすればエラーになるんじゃないかな?
暗黙の型変換がある以上、数値として認識できる文字列が入ってたらエラーになるとは限らん
VBAは型宣言はあるけど、Variant型と暗黙の変換があるから、絶対とまでは言えないのだよ
>>947
イミディエイトウィンドウの内容なんて書き換えできるからな
釣りじゃないってんならちゃんと詳しい環境かいてみ >>944
>+は文字列連結の意味になるんじゃなかったっけ?
JavascriptやRubyの話だね 演算子一覧表
https://support.microsoft.com/ja-jp/office/e1bc04d5-8b76-429f-a252-e9223117d6bd
連結演算子
& 2 つの文字列を組み合わせて、1 つの文字列を作成します。
+ 2 つの文字列を組み合わせて、1 つの文字列を作成し、Null 値を伝達します (一方の値が Null の場合、式全体が Null と評価されます)。 VBAはあまり書かなくて理解足らないのは承知しているが、
配列に0から200の値を書き込むサンプル
これは、型があわないとアラートが返ってきます。
ダメな理由を教えてください。
Sub test()
Dim arrs As Variant
Dim i As Long
For i = 0 To 200
arrs(i) = i
Next i
End Sub レス数が950を超えています。1000を超えると書き込みができなくなります。