X



Excel VBA 質問スレ Part78
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 5f2e-juJ7)
垢版 |
2022/10/30(日) 13:43:16.31ID:6yf2E1Gz0
!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
0905デフォルトの名無しさん (スプッッ Sd47-aTb4)
垢版 |
2023/01/26(木) 09:03:16.60ID:N0DN9EFmd
皆さんはお仕事何されてますか
事務をやって三年、仕事を楽にするために始めたExcelVBAは人並みに身についた気がしますが
ただの事務では給与が足りずプログラマに転向するには経験が浅いのです
0906デフォルトの名無しさん (ワッチョイ ff02-qYbV)
垢版 |
2023/01/26(木) 09:11:16.84ID:NYppQtUx0
エクセルのvbaエディタ?がすごくつかいずらくて、
vsCodeでvbaが記述できるxvbaというツールを利用しようと試みています。
ですが、
エクセルで書かれたvbaの日本語文字が、vsCodeで読み込むと文字化けしてしまいます。
おそらく、エクセルの方のエディタがUTF-8ではないのかと思いますが。
このあたり、経験されているかた。どのように対処されていますでしょうか?
どうぞアドバイスください。
0912デフォルトの名無しさん (ブーイモ MM7f-PvGG)
垢版 |
2023/01/26(木) 12:32:00.38ID:Y5eC8vQ8M
>>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関数を使いたかったんじゃね?
書き方間違えてるから謎の言語になってるけど。
0913デフォルトの名無しさん (ワッチョイ ff02-qYbV)
垢版 |
2023/01/26(木) 12:41:55.63ID:NYppQtUx0
Transposeで作る配列の
一番最初の要素の添字は0じゃなくて、1であってます?
0915デフォルトの名無しさん (JP 0Hff-88l+)
垢版 |
2023/01/26(木) 12:55:07.08ID:jr7Apji9H
>>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
0916デフォルトの名無しさん (オッペケ Src7-CBlj)
垢版 |
2023/01/26(木) 13:02:48.18ID:bIyafktir
>>915
それなら素直にlongで宣言するべきでしょ
変数名間違えた時の保険って、紛らわし変数名にするなって話だし
変数名間違えたときのための保険って言い出したら何も出来ないじゃん
じゃあその「変数名間違ってたときの確認のためのコードの」変数名が間違ってたらどうするの?
その確認のための変数名確認のためのコードをつけるのか?
それが間違ってたら?
確認のための変数名確認のための変数名確認のためのコードをやるの?
って話になる
0917デフォルトの名無しさん (JP 0Hff-88l+)
垢版 |
2023/01/26(木) 13:11:07.62ID:jr7Apji9H
>>916
逆で、文字列を数値として使ってしまった場合に検出したい
単にタイポ時の保険としてエラーが起こってほしいってだけだよ
vbaに無いなら仕方ない、そういう言語なんだなってだけで
別にそこには期待しないよ
0918デフォルトの名無しさん (スップ Sd1f-88l+)
垢版 |
2023/01/26(木) 13:21:15.99ID:UvNszdC2d
少し上にいた大量にレスしてた奴みたいなおかしな質問者もいるし
適当に質問しても回答者が頑張ってくれるだろみたいな考えの質問者が多すぎなんだよ
0921デフォルトの名無しさん (オッペケ Src7-CBlj)
垢版 |
2023/01/26(木) 13:35:53.75ID:bIyafktir
>>917
あのさぁ、自分の説明が下手くそなくせにできないのは他人のせい、言語のせいにするのはよくないぞ
単にタイプミスって言っても自分がコード書くときにミスしないようにしたいのか、使う際にinputBox等で入力させるときにミスをなくしたいのかで全然違うだろ
エスパーじゃないんだから質問するならもっと具体的にしろよ
0924デフォルトの名無しさん (スップ Sd1f-88l+)
垢版 |
2023/01/26(木) 14:50:16.50ID:UvNszdC2d
ExcelVBAは型に対する考慮が緩いから正直期待にそえる回答はないと思うよ
例えば変数名の先頭に型を付与するようなルール決めてもタイプミスって言葉で許されるなら破綻するだけだしね
0925デフォルトの名無しさん (オッペケ Src7-CBlj)
垢版 |
2023/01/26(木) 14:52:16.71ID:bIyafktir
>>923
だから、最後までちゃんとかけや
それはinputBoxを格納する変数の話だろ
そんな話はしてないわ
色々な具体例があって様々な解決策があるのに、なんにも具体的な話を出さずに抽象的に話しして、一部に対してだけ反論してお前は馬鹿か?
0927デフォルトの名無しさん (オッペケ Src7-CBlj)
垢版 |
2023/01/26(木) 14:58:44.32ID:bIyafktir
つーか
「単純にコードのミスを検出したいだけなんです
変数名を間違えた場合の保険程度のつもりなんです」
本当にこれだけだったら先頭にOption Explicitつけて似たような変数宣言するな、で終わる話だよな
さすがにOption Explicitをつけてない人はいないだろうからそんな超初歩的な事はありえないと思ってるけど
0933デフォルトの名無しさん (スプッッ Sd47-aTb4)
垢版 |
2023/01/26(木) 16:54:33.47ID:N0DN9EFmd
IF Not Isnumeric( a + b ) then c = a + b
とか
c = a & b
とかの雑魚コードでも教えておけばよかったのに
0939デフォルトの名無しさん (ワンミングク MM9f-gSeq)
垢版 |
2023/01/26(木) 19:12:37.90ID:CIVBTG9eM
零細企業のアホみたいな奴に答えてやろうなんて思うから荒れる
助けてで始まる質問する奴や、頭が悪いのに自分はできるみたいに思っておかしな質問をする奴は無視するのが一番
0943デフォルトの名無しさん (スッププ Sd1f-88l+)
垢版 |
2023/01/26(木) 20:00:51.10ID:BIrRkdsHd
相手にしたくないならほっておけばいいんだから無駄なレス書いて荒らすなよ

>>926
サンプル書けばわかると思うけど例えば下のようなコードは最後の数値型に数値以外の代入のみエラーとなるからコーディングミスしないように注意するしかないという話
Dim a As String
Dim b As Long
a = "a" '文字の"a"
a = 1 '文字の"1"
b = "1" '数字の1
b = "a" '変換エラー

>>928
そういう話じゃないと思うぞ
0944デフォルトの名無しさん (ワッチョイ 6f19-1gWY)
垢版 |
2023/01/26(木) 20:10:49.10ID:omfXV+oL0
キチンとString型を宣言しているなら確か
+は文字列連結の意味になるんじゃなかったっけ?
であれば前のレスで言ってた人がいたけど
- 0とか*0とかすればエラーになるんじゃないかな?

逆にSQLとかで文字列を数値で扱いたい場合は
*0とか-0とかにすると暗黙の変換で数値にしてくれる。

VBAでは型宣言は絶対だけど、
VBSみたいにスカラー変数を使う場合は
VBAみたいな型指定の型宣言が出来ないんで少し戸惑うかもね。

でもここはVBAのスレなので、
基本的に型宣言は絶対だと思っていいと思うよ。
0948デフォルトの名無しさん (ワッチョイ 332f-DmZS)
垢版 |
2023/01/27(金) 02:03:03.20ID:sVJGpHK80
>>944
> - 0とか*0とかすればエラーになるんじゃないかな?
暗黙の型変換がある以上、数値として認識できる文字列が入ってたらエラーになるとは限らん
VBAは型宣言はあるけど、Variant型と暗黙の変換があるから、絶対とまでは言えないのだよ

>>947
イミディエイトウィンドウの内容なんて書き換えできるからな
釣りじゃないってんならちゃんと詳しい環境かいてみ
0951デフォルトの名無しさん (ワッチョイ ff02-qYbV)
垢版 |
2023/01/27(金) 09:27:20.18ID:JeWwXD830
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
0953デフォルトの名無しさん (ワッチョイ d3ce-Jpma)
垢版 |
2023/01/27(金) 09:50:45.30ID:Gy/KHy720
>>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
0959デフォルトの名無しさん (アウアウウー Saa7-sGmE)
垢版 |
2023/01/27(金) 15:35:27.15ID:nAK+7/AUa
0から200だと201回繰り返すのも注意
0960デフォルトの名無しさん (ワッチョイ ff02-qYbV)
垢版 |
2023/01/27(金) 16:29:58.00ID:JeWwXD830
>>953
200個の要素数が確定されている場合ですかね。
将来配列の要素数が変わることがわかる場合、
どうなりますか。

うーん。
VBAで配列操作するより、セル関数でデータを加工していった方が早いし、
分かりやすい気がしてきた。
0961デフォルトの名無しさん (スッップ Sd1f-88l+)
垢版 |
2023/01/27(金) 17:27:12.70ID:HtuDNqBEd
>>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」が正しいんじゃない?
0962デフォルトの名無しさん (スプッッ Sd1f-aTb4)
垢版 |
2023/01/27(金) 17:38:42.59ID:EY8clDJJd
>>960
DimRedimは先に回答した人がいるから

>VBAで配列操作するより、セル関数でデータを加工していった方が早いし、
>分かりやすい気がしてきた。

用途にもよるが分かりやすさとしては間違いなくそう
VBA分からないやつでもどんな操作をしているか分かるのはでかいし
特異なケースのテストもわりと少ない手間で試せる

データの成形入れ替え並び替えは全部関数でやって
そうすると関数の参照先シートを変更する度に重くなるから
マクロでは関数が入ったブックの呼び出しと
操作するデータを参照先シートにコピペする作業を任せる

こんなやり方もあり
一応配列格納のほうがいちいちセルの読み取りしない分速いことは速いが
VBAで書き出す手間とエラーチェックの手間と
仕事ならそれを誰かに引き継ぐことを考えると…って感じ
0963デフォルトの名無しさん (ワッチョイ ff02-qYbV)
垢版 |
2023/01/27(金) 17:55:20.59ID:JeWwXD830
ありがとうございます。
そうですね。「i<=200」が正しいです。

要素数をいちいち定義したり再定義しないといけないのは
ちょっと不便ですね。自分でも他の方法ないか調べてみます。



データとして直接見えるというのが、セル関数の良さですね。
VBAの配列だと中のデータ見るのに手間かかる。


参考になりました。みなさんありがとうございました。
0969デフォルトの名無しさん (ワッチョイ 3619-GWjr)
垢版 |
2023/01/28(土) 06:32:52.50ID:hxz/by/q0
>>963
まぁScripting.DictionaryかCollectionでも使えば?
二次元配列的な使い方をしたいならついでにクラスのお勉強もしておけばいい。
他にもRecordsetを使うという手もある。
0971デフォルトの名無しさん (オッペケ Sr3b-O9ZV)
垢版 |
2023/01/28(土) 07:56:23.07ID:mBQ16TA8r
愛される零細おじさんでつ

自分の業務をEXCELでメニュー作ってボタン一つで飛ぶようにしてるんですが
例えばEXCELにみずほ銀行のアイコンを貼り付けて押せばみずほ銀行のEB画面に飛んだり
売掛金回収ならボタン押せば売掛金管理のファイルを読み込んだり
流石に他のソフトを起ち上げたりはVBAでも無理ですよね?
おっPythonとかなら出来るんですか?
0973デフォルトの名無しさん (ワッチョイ 3619-GWjr)
垢版 |
2023/01/28(土) 08:01:55.27ID:hxz/by/q0
まーた
RUBY信者の成りすましか・・・
0978デフォルトの名無しさん (オッペケ Sr3b-O9ZV)
垢版 |
2023/01/28(土) 10:37:54.23ID:mBQ16TA8r
あ、書き方が悪かったか

愛される零細おじさんでつ

自分の業務をEXCELでメニュー作ってボタン一つで飛ぶようにしてるんですが
例えばEXCELにみずほ銀行のアイコンを貼り付けて押せばみずほ銀行のEB画面に飛んだり
売掛金回収ならボタン押せば売掛金管理のファイルを読み込んだり

以上はハイパーリンクやマクロ記録を使って実現出来てる
売掛金管理ファイルを呼び出した後は、更新ボタンを押すことでパワークエリを使った集計も実現出来てる(更新ボタンを押さたくても更新させる事は出来るがあえて更新前の数値を確認するためにそのようにしてる)

流石に他のソフトを起ち上げたりはVBAでも無理ですよね?
おっPythonとかなら出来るんですか?
0979デフォルトの名無しさん (オッペケ Sr3b-O9ZV)
垢版 |
2023/01/28(土) 10:41:20.97ID:mBQ16TA8r
要するに販売管理のパッケージソフトや会計のパッケージソフトを起動させて全自動を追求したくなったという質問です

例えばEPSONの会計ソフトなら定番の資料は自動的に出力出来るのは知ってるが、今使ってるのは毎回、手作業でボタン押さないと出力出来ないんだよね
0980デフォルトの名無しさん (ワッチョイ 5fda-2biX)
垢版 |
2023/01/28(土) 10:57:57.78ID:/lutP43W0
ファイルの意味判ってンのか? 基本のキが欠落してるような
そして、そんな奴が改悪し続けてるExcel Book 数年後に後任に引き継がれて「なんだよ、これ」に成り果てる
そもそも、上司に了解得ているのか?社内のコンプラどうなってんだ おれがコンプラか 社内規定の意味でのコンプラだが
0989デフォルトの名無しさん (ワッチョイ 0b01-hj3w)
垢版 |
2023/01/28(土) 12:03:14.15ID:NqcfPhRT0
>>987
EPSONの会計ソフトの話だろ
> 例えばEPSONの会計ソフトなら定番の資料は自動的に出力出来るのは知ってるが、今使ってるのは毎回、手作業でボタン押さないと出力出来ないんだよね
そもそもExcelのボタンの話ならそのボタンに紐づいてるルーチン呼び出せばいいだけだし
レス数が1000を超えています。これ以上書き込みはできません。

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