Excel VBA 質問スレ Part59

レス数が950を超えています。1000を超えると書き込みができなくなります。
2019/02/09(土) 15:12:30.70ID:3lTArmdf0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part58
https://mevius.5ch.net/test/read.cgi/tech/1542577644/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/03/13(水) 06:45:04.68ID:JacIk+SfM
>>897
>>889
お前の周りのことなんか知らんよw
2019/03/13(水) 07:00:38.50ID:A37ahhw6a
>>898
このスレッドにもいましたよね
2019/03/13(水) 07:12:08.08ID:JacIk+SfM
何を言いたいのかさっぱりわからんw
2019/03/13(水) 08:04:29.56ID:A37ahhw6a
煽りか
902デフォルトの名無しさん (ワッチョイ 9290-uGU8)
垢版 |
2019/03/13(水) 10:36:45.92ID:4v7XhTis0
一体いつまで同じ話をぐだぐだ続けるつもり?
プログラマ板のどっか雑談スレでやれよ低能プログラマどもは
2019/03/13(水) 11:12:26.48ID:JQlBKVP4M
だってここ以外ではマウントとれないんだもの
2019/03/13(水) 15:18:57.45ID:6SLKDaoM0
セルA1に =aaa と書き込んで数式エラーを作っておきます

その上で
Dim ary() As Variant
ary = Activesheet.Range("A1:A10")

MsgBox ary(1, 1)

結果:
型が一致しません

ary(1, 1)をVariant型の変数に代入する場合は何も起きないので
MsgBoxに表示するときに内部的にString型に変換するため
エラーがおきるのだろうと思っています

それはともかく、ary(1, 1) からエラー値を削除したいのですが

ary(1, 1) = ""
MsgBox ary(1, 1)

とやってもダメでエラーが出ます
ary(1, 1) を何もない状態にするにはどうしたらいいですか?

ary(1, 1)はこの先いろいろな操作をすることになるため、そのたびに
どこに隠れているか分からない数式エラーをチェックするのは大変なのです
2019/03/13(水) 15:24:34.25ID:6SLKDaoM0
ごめんなさい
>>904は取り消します

何か他の要因がからんでエラーが起きていたようです
上の例だとエラーはおきませんでした

ごめんなさい
2019/03/13(水) 15:25:55.52ID:ril+FLd/0
とりあえず
Dim ary() As Variant
はエラーが出るので
Dim ary As Variant
に変更している
2019/03/13(水) 15:26:27.13ID:YE/558h40
あー、荒れてるところ申し訳ないのですが、
ちょっと、質問…いいですかね…
初心者なんでさっぱり文が思いつかないから
例文みたいなのを作ってほしいんですけど…

B3:F○○の表があります。

・B3:F10にそれぞれセルに名前を付けていきたい。
・B3を「_0」としてC3「_2」というように、+2ずつ、
F3「_8」までいったらB4「_10」と同じように+2して、
最後のF10までやりたい。

こんな感じのってできますか??

他のシートでも同様の作業を行ないたくて、
B3から、F列の表で、数字が入力されている部分だけ名前をつけたいから、
if文とかで、数字が入力されていなかったら名前をつけるのを終わるみたいなできたら嬉しいです。
2019/03/13(水) 15:27:20.71ID:ril+FLd/0
>>905
あ、はい。
2019/03/13(水) 15:38:57.02ID:ril+FLd/0
>>907
先に範囲選択してからマクロ実行
セルに何も入ってない場合に終了(数字かどうかは判定していない)

Sub Macro1()

番号 = 0
For Each セル In Selection
If セル.Value = "" Then
Exit Sub
Else
ActiveWorkbook.Names.Add Name:="_" & 番号, RefersTo:="=" & セル.Address
番号 = 番号 + 2
End If
Next

End Sub
2019/03/13(水) 16:22:51.30ID:kv9h9xOp0
以前、ifの条件に合わない時に実行したい時はthenに続けてelseと書いて実行したい内容を書くよりも、条件をnotで括った方が処理が速いと言われました
実際に計測したら確かに僅かな差が有ったのですが何故なのでしょうか
2019/03/13(水) 17:11:51.63ID:mnfDUUl9d
>>909
ありがとうございます!
やってみます!
2019/03/13(水) 20:59:56.96ID:p9thMYjCx
>>910
Ifブロックは先頭の条件から逐次Boolean評価していって、一度Trueと判定されるとそこで条件を満たす場合の処理を実行し、残りの条件は評価しない仕組み
Elseのケースでの処理を実行するとなると、If条件とそれ以降のElseIf条件全てにおいてTrueが成立しないという条件が必要になる
なので、同じ条件数のIfブロックで比較すると、Elseより前に置かれた条件で処理を行わせる方がElse以降で処理させる場合よりも条件評価を行う回数が少なくなる
913デフォルトの名無しさん (ワッチョイ 12e7-+lbj)
垢版 |
2019/03/13(水) 21:38:41.07ID:kv9h9xOp0
>>912
if not true then temp = 0
if true then else temp = 0
の二つのif文があった時、後者はtrueの評価の後にelseという評価をしてるという事でしょうか
914デフォルトの名無しさん (オッペケ Src7-t9Np)
垢版 |
2019/03/13(水) 21:39:18.39ID:hyG2utnjr
>>912
VBAはショートサーキットしないけどな
2019/03/13(水) 21:40:15.61ID:uWZ9EglX0
>>912
何か微妙に勘違いしてる?
Elseifは関係ないぞ
2019/03/13(水) 21:43:27.67ID:uWZ9EglX0
>>913
elseという評価はしていない
評価というのは、判定してると言っていると思うが、判定はifのとこで終わってる
2019/03/13(水) 21:53:50.43ID:Blqbf86O0
はっきりさせておきたい
VBAのとき、
if A and B and C then

ってなってるとき、A、B、C全部必ずチェックするのか、AがFALSEだったら、もうB、Cは無視するのか
どっち?
C言語みたいに、& と && みたいなandに2種類ないよね
2019/03/13(水) 21:54:09.23ID:mPSJoOjB0
ショートサーキットないおかげでどんどんネストしてゆく…
2019/03/13(水) 22:06:55.44ID:x7l49vOfa
ショートサーキットなんてねえよw
2019/03/13(水) 22:10:56.03ID:Blqbf86O0
>>919
A、B、C全部必ずチェックすんだね
2019/03/13(水) 22:39:10.74ID:BElBpZaB0
>>917
そういう場合は
Select Case False
Case A, B, C
' !( A && B && C)の場合の処理
Case Else
' A && B && C の場合の処理
End Select

と書けばショートサーキットになるよ。
直感的じゃないけどね。
2019/03/13(水) 22:41:50.24ID:MTZmUGDO0
不慣れな初心者ですみません

リストシートのボタンを押すと
リストに入力していたデータ行数分書類型シートが作られるのですが
その作られた書類型シートにもそれぞれボタンがあり
各ボタンを押すとデータ送信用シートが作られる二段構造?になっています

書類シートからデータ送信用シートを作るには
いちいち各シートのボタンを1つずつ押さねばならず大変です
選択したシートのボタンを一括で押すことのできるマクロはありませんでしょうか…?

本当はリストからボタン1つで書類シートとデータ送信用シートができれば最高なのですが
そこまでの改変は難しそうで…
2019/03/13(水) 22:46:46.17ID:TdaaOBVz0
>>922
それぞれのボタンに組まれたマクロを一つのボタンにまとめる
2019/03/13(水) 22:48:55.81ID:ril+FLd/0
作り直した方が遥かに楽なパターン
2019/03/13(水) 22:53:39.78ID:TdaaOBVz0
ごめん>>923は内容勘違いなので忘れて
一括で送信シート作るボタンを一つ作ってその中に、

forで選択した書類シート分回す
 その書類シート内の送信シートを作るボタンClickを呼ぶ
Next

ってのはどうですか
2019/03/13(水) 23:04:41.65ID:ril+FLd/0
>>922
見られちゃマズイデータ消してアップロードすれば誰かが作ってくれると思う
2019/03/13(水) 23:09:57.29ID:Blqbf86O0
>>921
そんな技があったのね。 ありがと
2019/03/13(水) 23:13:30.84ID:nm3P40mI0
Clickを呼んでも、クリックするわけじゃないが、
クリックされちゃいそうで怖い。
2019/03/14(木) 01:04:48.38ID:D/xLb5AQ0
ピボットテーブルの集計結果使いたい時って今まで計算用シートで作成→せる決め打ちで取得 てやってたんだけど稀にカラムずれる
こういうのvbaだけで計算する関数とかないよね?
2019/03/14(木) 01:36:50.73ID:lGFaI2Uva
ピボットテーブルはアドホックな集計や分析に使うもんだろ
やることが決まってるんなら要らん
2019/03/14(木) 04:24:36.89ID:ci+9chmP0
>>922
現物見てないからよくわからないんだけど、
リストシートや書類シートにボタンがついてるってのは
マクロ有効ブックの中にそれらのシートがあるってこと?

出来ればデータとマクロは別のブックに分離しといたほうが良いんじゃないかな。
そういう作りにしてれば改修も簡単になりそう。
2019/03/14(木) 08:13:54.22ID:YBKQY7Hwd
>>927
普通に
If A Then
If B Tnen
If C Then
A And B And Cの時の処理
EndIf
EndIf
EndIf
とするかな。

でも、これでの速度アップより、他に速度ダウン要因を減らした方が良さそう。
自分はIf A AndB And C Thenを気にせず使うな。
2019/03/14(木) 08:39:22.13ID:ssjF3MUN0
>>932
Aが成り立たないときBを評価するとエラーで止まってしまう場合とかが悩ましいんだ
2019/03/14(木) 09:04:59.36ID:Nl2IbJZtM
>>921
それ保証されてるんだっけ?
2019/03/14(木) 09:13:36.88ID:laeryNOTM
>>932
うん、他にやることありそうな気がするぞ
昔の俺みたいに実はコンパイルしてなかったとか笑
2019/03/14(木) 09:57:51.33ID:ssjF3MUN0
>>934
一応言語規格上保証されてるね
2019/03/14(木) 10:12:09.94ID:Nl2IbJZtM
>>936
どこかでドキュメント化されてる?
2019/03/14(木) 10:14:23.93ID:hUI7fwKe0
なんとなくだけど、VBAであまり離れ業を使わないほうが良いとは思う
2019/03/14(木) 10:34:24.95ID:ssjF3MUN0
>>937
https://docs.microsoft.com/en-us/openspecs/microsoft_general_purpose_programming_languages/ms-vbal/d5418146-0bd2-45eb-9c7a-fd9502722c74
にある Published Version の PDF の 5.4.2.10 Select Case Statement に書かれている。
82ページの一番下二行だね。
2019/03/14(木) 12:36:06.81ID:YBKQY7Hwd
>>933
それは別の問題だよ。
そういう場合は最初からIf A And B And C Thenなんてやらない。

Bの評価でエラーが出ない時でも必ずBの評価をすることで速度ダウンするのを防ぐために
If A Then
If B Then
EndIf
EndIf
とするかと言えば、普段はやらないということ。

それで得られる速度アップより他の修正をした方がよっぽど効果有るだろ。
2019/03/14(木) 12:53:41.51ID:CJd9O/FZd
アスペかよ
2019/03/14(木) 13:54:08.96ID:3EvgP48J0
>>939
なるほど、ちゃんと明記されてるんだな、ありがとう
2019/03/14(木) 13:57:37.28ID:3EvgP48J0
短絡評価の件で速度云々言ってるのはID:YBKQY7Hwdだけだし
2019/03/14(木) 14:46:00.52ID:zjiIQsBqM
いやいや、役に立った(参考になった)ボタン押してますから
2019/03/14(木) 15:13:23.25ID:ONwCUS8k0
ショートサーキットが活きてくるのは、Boolean型の関数を並べるときだな
If Func1() Or Func2() Then
みたいなケースだと実行時間がかなり違ってくることも起こりうる
2019/03/14(木) 15:21:32.05ID:Cgb2oqJn0
標準関数の戻り値に文字列"false"が返ってくる言語があるらしい
2019/03/14(木) 19:08:46.48ID:YBKQY7Hwd
>>943
伝わって無いようだな。

まず、>>910の速度の話から始まっている。
で、>>932は「俺は」速度を気にしないから普段はやらないけど、とにかくネストすりゃ良いって話。

>>927に速度が念頭に無かったとしても>>932は成立するんだよ。
2019/03/14(木) 19:08:54.68ID:YBKQY7Hwd
で、>>933は俺が普段やらないという所に反応したわけだ。
それに対して>>940はBのエラーが想定される時は普段もネストするって話。
こちらも成立してる。

あえて言えば>>933が少し外してる。
2019/03/14(木) 19:33:40.81ID:3EvgP48J0
>>947-948
速度の話(>>910)と短絡評価の話(>>917)は別な
混同してるのはお前だけだぞw
2019/03/14(木) 19:58:36.19ID:YBKQY7Hwd
>>949
バーカw

短絡評価云々についてはネストすると言ってる。
でも普段は速度を気にしないからネストしないと言ってる。

ここでの速度の話はついでの話だ。
ついでの話で速度を蒸し返したのは俺が最初で、別に>>917が速度のことを考えていなくても何も問題ない。
ついでを書かないと、どんな時も俺がネストしてると思われるから書いてるんだ。
>>917が速度のことを気にしてると俺が思ったからでは無い。

このついでに反応した>>933は「俺が最初に蒸し返した」のでは無く、「俺が>>917を勘違いした」と思ったんだろう。
2019/03/14(木) 20:19:12.86ID:RaCvNH3Xa
もっと争え
2019/03/14(木) 20:22:35.66ID:3EvgP48J0
何だこいつ
お前が常にネストするとかどうでもいいよw
953名無し (アウアウウー Sae7-9Z9t)
垢版 |
2019/03/14(木) 20:51:32.45ID:qOCswbNsa
のび太 ドラえもん、なんか道具出してよ
ドラえもん まーまー棒、 ――――◯
2019/03/14(木) 21:48:30.17ID:yFX6qcia0
ID:YBKQY7Hwd

こいつが一番バカっぽい w
2019/03/14(木) 22:26:04.50ID:aAmaHeQqr
マクロというものを知ったばかりです
■リストから単票を印刷する
http://www.aibsc.jp/nsj/03_07_it/090201_01/index.shtml
というマクロを使い注文書を作りたいと思っています
このマクロだとリストに同会社がある場合
同会社がある分だけ印刷されてしまいます
同会社の場合は注文をまとめたいのですが
どういうマクロを組めばいいのでしょうか?
お力を貸して頂きたいです

リスト
https://i.imgur.com/B7EAyhw.png

理想
印刷1枚目
https://i.imgur.com/s4Lbrxu.png
2枚目
https://i.imgur.com/zKOwgMq.png
2019/03/14(木) 22:54:56.95ID:ssjF3MUN0
ここで「データをExcelに置くのはやめてSQLSeverとかに格納しよう」って答えたら荒れるのかな?
2019/03/14(木) 23:06:23.27ID:3EvgP48J0
いや、ここはAccessの出番でしょ
って更に混乱に陥れるとか?
2019/03/14(木) 23:10:10.38ID:YBKQY7Hwd
>>952
頭に血が上ってるようだな。
別に>>932はこうしろだなんて言ってないんだが。

それを言うなら反応した方がずれてるだろ。
2019/03/14(木) 23:11:32.83ID:YBKQY7Hwd
日本語のやり取りが出来ない奴ばかりw
2019/03/14(木) 23:25:05.84ID:KDf9lyPv0
>>955
何だそれwwwww
印刷画面にIndex関数を埋め込んでおけば、
5行くらいで書けるんじゃないのwwwww

で、まとめる方法だけど、やっぱAccessを勧めるな。
Excelでも出来るけど、餅は餅屋だとわかる方がいい。
2019/03/14(木) 23:28:37.01ID:YBKQY7Hwd
勝手に人のことを推測して反応したら、推測の当てが外れて相手から否定的な意見をもらって怒り爆発って事態がこのところ続いているようだw
2019/03/14(木) 23:32:27.61ID:Cgb2oqJn0
>>955
accessって意見が多いけど、俺はvbaでやるかな

・まずまとめるシートを新しく作る。一社一行
・それを今まで通り印刷していく
が主な流れと思う

作業自体は難しくないが、仕様が複雑怪奇である

・納期はどこからどこまでか?最短?最長?平均?
・数量もどうまとめるのか?
・品番はどう表記するの?
など、山程考える事がある
2019/03/14(木) 23:32:30.81ID:KDf9lyPv0
ていうか2009年って。
書いた本人も、内心消したいと思ってるんじゃないのそれ。
当時は良くても、10年後にActiveCell.Offset(1, 0).Selectとか見たら、
あちゃー(ノ∀`)だと思う。
2019/03/14(木) 23:34:16.79ID:Cgb2oqJn0
ActiveCellのoffsetでSelectとかなかなかやね
マクロの記録でもないだろうから、一生懸命頑張ったんかなって
2019/03/14(木) 23:41:27.79ID:S0hknHQca
>>955
ランサーズとかで依頼したら?
ゴミみたいな値段で誰か作ってくれるよ
2019/03/14(木) 23:43:49.65ID:UkRoSI4o0
>>955
馬鹿は死ねよ
2019/03/14(木) 23:50:37.23ID:KDf9lyPv0
ん、ちょっと待った。
注文書を印刷?
今時そんなことやったら、受け取る方は嫌がると思う。
どうしても紙にするなら、
見た目の格好良さなんか度外視で、
QRコード・品名・数量・納期を、ただ羅列するだけの方がいいよ。
パソコンなんか使ってないような、クソ田舎の店に注文出すわけじゃないんでしょ?
2019/03/14(木) 23:59:36.30ID:39aguKNH0
>>955
できるだけ単純な方法だと、
・リストにマクロ用の作業列を1列用意する
・マクロ開始時に作業列をクリア
・ループ内で印刷シートにデータを入れ込む前に、その行の作業列が空白かどうか見る
 空白なら印刷シートに社名とデータ入れて、作業列に1とか適当に入れる
 FindとFineNextで同じ社名全部検索して、1個目と同じように見つかった行の作業列に何か入れてデータを印刷シートに入れる
・印刷実行
2019/03/15(金) 00:00:20.90ID:cOSRxez60
FineNext→FindNextね
2019/03/15(金) 00:00:30.62ID:mu0sfa7H0
>>962
そこでさらに
Driver = {Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}
使えといって混乱させる
2019/03/15(金) 00:02:04.33ID:5fRBFExt0
批判とかする気持ちは分かるけど、だったらダイマ批判の覚悟でそれ相応のサービスを紹介してあげてはどうかな
さすがにそろそろvbaで請求関係は終焉させてあげたい。よく20年も頑張ったよ
2019/03/15(金) 00:04:22.44ID:5fRBFExt0
まぁ俺はgoogleanalyticsのマイレポートをctrl+aでコピー*3、EXCELに貼り付け
多様な角度からレポート生成
なんてシステム作ったけどな
役に立ってるかは知らん
2019/03/15(金) 00:04:59.41ID:BXhkH+980
>>955
Accessわかる人は、何も悩むところがない
わからなければ、Accessの勉強で苦労するか、ExcelVBAで苦労するか
好きな方選べばいい
2019/03/15(金) 08:35:06.36ID:8vQK+5mFd
>>955
業務の内容から考えるとAccessのが良いっぽいんだけど、規模によるかな。
注文する会社はどれくらいあって、この注文書ってどれくらい印刷するのか。

そもそもDBにするような話なら既にそうなってる気もするんだよな。
だからExcelでDBにもしなくて良いような気がする。

>>963
全く同意だけど、記事の内容を見ると初めてVBAを触る人向け第2回って感じだから、マクロ記録をちょっとだけ改変って感じなんじゃない?
2019/03/15(金) 08:37:29.81ID:7wpKi9ozH
馬鹿はスレタイが読めない
2019/03/15(金) 08:42:37.51ID:CgxPaElB0
馬鹿は頭が固い
2019/03/15(金) 08:53:15.07ID:mu0sfa7H0
>>970に書いたのは冗談じゃなくて、データは専用の別ブックに置くようにして、マクロ(と印刷用画面)と分けた方がいい。
データブックからの読み取りはSQLでやる。
こうすれば将来のDB化にも繋がるよ。
2019/03/15(金) 09:01:55.29ID:8vQK+5mFd
マクロというものを知ったばかりの人にSQLとか言い出すってどうなんだろう?

そういう所だよ。
2019/03/15(金) 09:30:17.24ID:7wpKi9ozH
>>977
じゃあ最初からDB使え
後で使うだろうと無駄な設計やコードを残していったアホの後任が不憫でならない
2019/03/15(金) 10:04:11.53ID:mu0sfa7H0
マジで?!
2019/03/15(金) 10:54:37.46ID:sIXN3DPHM
>>977
データを分けたらAccessのリンクテーブルにもできるだろうから、徐々に移行ってこともできるよね
2019/03/15(金) 11:44:43.49ID:pQ5gXJpBM
wordに差し込み印刷という……
2019/03/15(金) 13:49:10.01ID:07U/buSjM
データの保存はiniファイルと隠しシートどっち使うのがスタンダードなの?
2019/03/15(金) 13:54:39.91ID:/jMwhNVt0
普通に表示しているシート
後iniファイルって古い。今はxmlが主流だよ
2019/03/15(金) 14:53:36.22ID:BdW6uHhE0
iniファイルってデータの保存用とかじゃなくプログラムの設定用だろ?
まぁどちらにしろ古いけどさ。
2019/03/15(金) 18:22:20.40ID:jUtd0ALV0
この前、セルに _(数字)の名前を付けたものです。
(数字)は変数として定義してあるのですが、
アンダーバーが使えないため、_(数字)を参照できません。

なんで新たに、Sujl、みたいな変数の箱を作って

Suji = "_" & (数字)

っていうのにしてみたんですけど
セルにSujiを入力するようにすると、_2のように表示されるのですが
Range(Suji).Select
だとエラーが出てしまいます。

どうやったらその名前を付けたセルを参照できますか??
2019/03/15(金) 18:24:03.29ID:fZ/zfvrlM
君プログラミング向いてないからやめた方がいいよ
2019/03/15(金) 18:28:03.12ID:luJRKRBO0
>>986
論外
2019/03/15(金) 18:29:21.03ID:sIXN3DPHM
俺の脳みそだと翻訳できんわ
2019/03/15(金) 18:39:53.23ID:XS3ylKm2a
_2 って名前を付けたセルを
どうやったら呼び出せるのかなって

2の部分は入力によって変えたいから
どうしたもんやらって

分かりづらくて、センスなくてごめんね。
2019/03/15(金) 18:53:39.56ID:luJRKRBO0
Suji = “_2”
Range(“A1”)=Suji
はできたけど
Range(Suji).Select
はエラーになるのはなぜか
2019/03/15(金) 18:56:58.01ID:3iBx3zPfa
>>991
意味が全く違うからとしか言いようがない
まずはどういう結果を期待してて何故それでうまくいくと思ったのかを晒せ
2019/03/15(金) 18:58:53.06ID:luJRKRBO0
>>992
本人に聞け
ドジっ子かよ
2019/03/15(金) 19:43:27.31ID:cOSRxez60
>>986
その記述で参照できる
その呼び出したい名前の定義の「範囲」はブック?
2019/03/15(金) 19:58:09.38ID:KbM/PflUF
>>984
今のところ、次の主流はとくに決まってないよ
jsonもけっこう幅広く使われてるし、ほかにもいろいろなデータ記述法が登場してる
2019/03/15(金) 20:05:31.49ID:3iBx3zPfa
MSに忠誠を誓うなら今はJSONだね
最近のMSはXMLをどんどん排除してJSONに置き換えてる
2019/03/15(金) 20:42:29.36ID:ng8+eCdqM
>>983
データの量によるけど少量ならCustomDocumentPropertiesかな
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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