Excel VBA 質問スレ Part78
レス数が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 文字列の演算をエラーにする方法は無いでしょうか
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 全ての行に「Debug.Print TypeName(arrs)」を入れてみると何でダメかわかってくるかもね >>951
Variant型は便利だけどVBAでは取り扱いが初心者には難しい方だと思う
昨日も変数の型のことで荒れてたけど、できるだけ適切な型を指定した方がバグになりにくい
そのまま動くようにするなら
Sub test()
Dim arrs() As Variant
ReDim arrs(200)
Dim i As Long
For i = 0 To 200
arrs(i) = i
Next i
End Sub
俺が推奨したい書き方は
Const arr_max = 200
Sub test()
Dim arrs(arr_max) As Long
Dim i As Long
For i = 0 To arr_max
arrs(i) = i
Next i
End Sub ありがとうございます。
>>954
JSなら。こんな感じ。
var arrs = [];
for (var i=0; i<200; i++) {
arrs[i] = i;
} >>952,>>953
ありがとうございました。VBAの配列は癖が強いねえ。 >>955のコードはarrsは配列として宣言するような代入してるけど
>>951は配列の宣言がどこにもないからね
癖というよりも単なる勘違いでしょ >>953
200個の要素数が確定されている場合ですかね。
将来配列の要素数が変わることがわかる場合、
どうなりますか。
うーん。
VBAで配列操作するより、セル関数でデータを加工していった方が早いし、
分かりやすい気がしてきた。 >>960
VB(VBA)の場合は配列の再定義するためのRedimというのが用意されている
Dim a(0 to 200) as long
Redim Preserve a(0 to 1000)
とすることで0から200までの値を保証して0から1000までの配列に拡張ができる
まあ正解なんて1つじゃないんだから自分にしっくりくる作り方でいいと思うけどね
あと細かいようだけど>>955の「for (var i=0; i<200; i++) {」は
VBの質問に合わせるなら「i<=200」が正しいんじゃない? >>960
DimRedimは先に回答した人がいるから
>VBAで配列操作するより、セル関数でデータを加工していった方が早いし、
>分かりやすい気がしてきた。
用途にもよるが分かりやすさとしては間違いなくそう
VBA分からないやつでもどんな操作をしているか分かるのはでかいし
特異なケースのテストもわりと少ない手間で試せる
データの成形入れ替え並び替えは全部関数でやって
そうすると関数の参照先シートを変更する度に重くなるから
マクロでは関数が入ったブックの呼び出しと
操作するデータを参照先シートにコピペする作業を任せる
こんなやり方もあり
一応配列格納のほうがいちいちセルの読み取りしない分速いことは速いが
VBAで書き出す手間とエラーチェックの手間と
仕事ならそれを誰かに引き継ぐことを考えると…って感じ ありがとうございます。
そうですね。「i<=200」が正しいです。
要素数をいちいち定義したり再定義しないといけないのは
ちょっと不便ですね。自分でも他の方法ないか調べてみます。
データとして直接見えるというのが、セル関数の良さですね。
VBAの配列だと中のデータ見るのに手間かかる。
参考になりました。みなさんありがとうございました。 別に要素数が不確定ならそれなりの組み方があるけどな わかった気で勘違いしている馬鹿の間違いや馬鹿さ加減を指摘したら泥沼になるだけだから相手にしたらいかんということだよ
零細企業のアレとか つまり、>>965を相手にしてはならんということすね。
ありがとう。 >>963
まぁScripting.DictionaryかCollectionでも使えば?
二次元配列的な使い方をしたいならついでにクラスのお勉強もしておけばいい。
他にもRecordsetを使うという手もある。 >>967
結構、俺のこと好き?
匿名掲示板において個人を認識してもらえるのは書込み冥利に尽きるよ
愛情の反対は無関心だからな 愛される零細おじさんでつ
自分の業務をEXCELでメニュー作ってボタン一つで飛ぶようにしてるんですが
例えばEXCELにみずほ銀行のアイコンを貼り付けて押せばみずほ銀行のEB画面に飛んだり
売掛金回収ならボタン押せば売掛金管理のファイルを読み込んだり
流石に他のソフトを起ち上げたりはVBAでも無理ですよね?
おっPythonとかなら出来るんですか? >>971
EB画面は知らんがスクレイピングじゃだめなのか?
売掛金のファイルがcsvならパワークエリで取り込めばいいと思う ハイパーリンクを調べても、それじゃ無い って結論に至って質問してンのか? あ、書き方が悪かったか
愛される零細おじさんでつ
自分の業務をEXCELでメニュー作ってボタン一つで飛ぶようにしてるんですが
例えばEXCELにみずほ銀行のアイコンを貼り付けて押せばみずほ銀行のEB画面に飛んだり
売掛金回収ならボタン押せば売掛金管理のファイルを読み込んだり
以上はハイパーリンクやマクロ記録を使って実現出来てる
売掛金管理ファイルを呼び出した後は、更新ボタンを押すことでパワークエリを使った集計も実現出来てる(更新ボタンを押さたくても更新させる事は出来るがあえて更新前の数値を確認するためにそのようにしてる)
流石に他のソフトを起ち上げたりはVBAでも無理ですよね?
おっPythonとかなら出来るんですか? 要するに販売管理のパッケージソフトや会計のパッケージソフトを起動させて全自動を追求したくなったという質問です
例えばEPSONの会計ソフトなら定番の資料は自動的に出力出来るのは知ってるが、今使ってるのは毎回、手作業でボタン押さないと出力出来ないんだよね ファイルの意味判ってンのか? 基本のキが欠落してるような
そして、そんな奴が改悪し続けてるExcel Book 数年後に後任に引き継がれて「なんだよ、これ」に成り果てる
そもそも、上司に了解得ているのか?社内のコンプラどうなってんだ おれがコンプラか 社内規定の意味でのコンプラだが >>980
お前は毎回理解力が無いな
既に先人が中途半端な仕組みを作ってるからそこに出力を合わせる事を考えてる
このやり方は後任には引き継がない
前任者の手作業を教えるq >>977
この時点で読み違いしてるやん
会社でお荷物だろw いけね、ついうっかり980踏んでた
無理だから安価指定しないけど、誰かお願いします >>982
お前は他のソフトを立ち上げることとそのソフトのボタンを押すことの区別もついてない時点で>>977以上のお荷物だろ
就職してるかどうかは知らんがw >>986
は?
ボタンはEXCEL上で作った奴の話だぞ?
ソフトのアイコンクリックじゃないぞ? あ、ハイパーリンクでソフトの起動まで出来るのか
それは失礼しますた >>987
EPSONの会計ソフトの話だろ
> 例えばEPSONの会計ソフトなら定番の資料は自動的に出力出来るのは知ってるが、今使ってるのは毎回、手作業でボタン押さないと出力出来ないんだよね
そもそもExcelのボタンの話ならそのボタンに紐づいてるルーチン呼び出せばいいだけだし となると、そのソフトでダイレクトに帳票印刷のEXEファイルがあるならそれをリンクさせれば良いのか
分かったありがと >>989
いやEPSONは前職で使ってた奴
でも今のもその実行ファイルを直接起ち上げれば行けるね >>991
お前の前職なんて知らんがな
とにかくそう言うことをやりたかったんだろ
としか受け取れないわ でも一般のアプリケーションてその実行ファイルがどれか公開してる?
あ、アプリの動作を監視してるファイルを見れば良いのか? To: 各位
無能の働き者がワッチョイ無しで次スレ立てちまったんだがどうする?
ワッチョイありで立て直す? >>995
> でも一般のアプリケーションてその実行ファイルがどれか公開してる?
そんなことも調べられないならすっぱり諦めるなり人に頼むなりしなよ レス数が1000を超えています。これ以上書き込みはできません。