Excel VBA 質問スレ Part57

■ このスレッドは過去ログ倉庫に格納されています
2018/09/10(月) 21:42:39.57ID:K1uuwFLt
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK


※前スレ
Excel VBA 質問スレ Part56
http://mevius.5ch.net/test/read.cgi/tech/1534976724/
2018/10/16(火) 22:01:20.92ID:QoFGLA2x
エクセルの鉄則:達人であることは隠せ
https://jp.wsj.com/articles/SB10750612626653313748604584520883598309574
「次々と人がやって来ては『エクセル...
2018/10/16(火) 23:49:27.99ID:LqxRfbs7
ここが面白く無いせいでPowerShellerがExcelスレまで荒らしに来てて困る。
2018/10/17(水) 13:34:37.11ID:i+REgo0L
カンマ区切りのcsvをデータインポートで読み込むと一部がズレます
csvを一度メモ帳に全部貼り付けて、それをexcelに貼ったあとデータ区切りでカンマを選ぶと上手く取り込めます
この挙動の違いがイマイチよく分からないんですがどうしてメモ帳に貼り付けることで上手く読み込めるようになるんでしょうか
2018/10/17(水) 13:46:32.94ID:tHw/Qu/E
そら貼り付けとデータインポートは別の機能だからだよ
Excelは既存の機能の動作がわずかでも変わったら必ずマクロが動かんようになったやないかどないしてくれんねんボケと山ほどの馬鹿が怒鳴り込んでくる
似た機能を追加したから共通化しますね〜と安易に仕様変更できず、大量の機能の重複を抱えながら昔のバグっぽい挙動も尊重して個別にメンテしてるの
このスレにいるような連中のせいでな
2018/10/17(水) 14:48:36.05ID:9GZlDgUm
>>690
データのせい
2018/10/17(水) 14:59:38.33ID:uJo2tnoC
>>692が正しい。 >>691は戯言なので無視していい。
メモ帳貼り付け保存後、と前とをバイナリー比較すれば理由は見えてくるはず
2018/10/17(水) 16:42:17.32ID:i+REgo0L
ありがとうございます
bomとかそういう感じですかね
また、うまく読み込めないのは一部utf8形式の文字コード?があり、それをsjisに変換出来ないのが原因のようでした
データインポートでutfを選択したら無事開けました
2018/10/17(水) 17:06:43.54ID:S++6iW66
>>694
一部だけUTF8?
混在してたってこと?
2018/10/17(水) 18:02:13.22ID:5pOkIjLu
半角と全角の混在で全角だけUTF-8とか
2018/10/17(水) 18:07:18.62ID:7Q2iPe/Z
ダブルクォーテーションとカンマのくくりが上手く行ってないとか
2018/10/17(水) 19:38:14.44ID:uJo2tnoC
>>696
あたりまえ、UTFもShiftJISも英数は同じ
2018/10/17(水) 23:31:27.45ID:SJQ0JWQn
英数だけが半角とは限らんがな
ココニカケルカナ
2018/10/18(木) 13:31:04.71ID:ks5As5t+
セル内改行でひっかかってるのかも
改行コードは何種類もあるし、読み込み方法によって正常に認識してくれないケースがあるから
2018/10/18(木) 13:46:30.50ID:B1wZDxhL
>>700
メモ帳経由だとうまくいくってのと整合しない
2018/10/18(木) 14:30:43.91ID:vpgDyIt0
>>694 で解決報告あるのに何をいつまで考えてるのw
2018/10/18(木) 19:04:18.15ID:ekkKNanr
自分でもしっかりと把握してないので書くつもり無かったんですが一応解決の詳細書きますね
まずダブルクォーテーションやカンマはないです
あと自分の理解と説明が足りてませんでした
一部utf8ではなく全部utf8で基本普通の英文字と数字なのでsjisでもぱっと見問題なく開けるけどクエリストリングのカラムにノーブレーキングスペース?やsjis対応してない文字列があり、そこで上手いこと処理出来てなかったみたいです
utf8をsjis指定でデータインポートしようとしたのが間違いの発端でしたスミマセン
2018/10/18(木) 19:33:45.83ID:vpgDyIt0
いやいやおつかれさま
2018/10/18(木) 23:12:45.91ID:wIeiUTi/
WorkSheet_Changeでセルの内容に変化があったときだけ文字色を赤にする処理を行おうとしています
対象が単体ならApplication.Undoで比較できますが、複数の場合1セルずつに対してUndoができないため
対象全体の内容を一時シートにコピー→For Eachで元データと1つずつ比較しているのですが、もっとスマートな方法はあるでしょうか?
2018/10/18(木) 23:38:51.56ID:fhgndB5P
>>705
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Font.Color = -16776961
End Sub

これで良いのでは???
2018/10/18(木) 23:45:12.89ID:wIeiUTi/
書き方が不正確でした
「対象セルの値が変更される前と一致しない場合にのみ」文字色を変えたい、です
2018/10/18(木) 23:54:42.06ID:vpgDyIt0
赤くしなくても共有と変更履歴で代用可能だろ
2018/10/18(木) 23:58:11.74ID:fhgndB5P
>>707
あぁそういう事か、すまん
今「excel change before」で調べただけだけど、そうするしかなさそう
selectionchangeでselectionの内容を保存しておくみたいだねぇ
よー考えるわ
2018/10/18(木) 23:58:42.58ID:fhgndB5P
>>708
そうだねぇ
なんか赤にする以外の方法の方が良い気がする
2018/10/19(金) 14:49:27.87ID:2evJVEIF
くそう、↑のやり方以外が思いつかない。
セルにtagプロパティでもありゃ前値保持できるのに。。

赤字にしたい目的がわかれば、そもそも別の簡単な手とかあるかも?(逃げ)
2018/10/19(金) 21:19:57.26ID:acLDgyPd
>>711
Excelをフロントエンドにしたデータベース管理です
一度に複数のデータを弄ることが多いため、フォームではなくテーブルに直接データを読み込み、編集後に更新といった流れで、この更新部分の判定を文字色で行っています
作業者自身も更新前にどこを変更したかひと目でわかると考えてこの方法を取ってますが、もっとベターな方法があるなら全然乗り換えたいです
2018/10/19(金) 21:42:58.96ID:yGBPiuMh
編集後・更新
この間に変更する予定のセルに対して処理をかませることができそう、というか出来るだろう
2018/10/19(金) 23:04:57.15ID:MRFHlf9T
Vue.js などのウォッチャ・データバインド・リアクティブシステムだろ

データ更新前後のフックは、無いのか?
715デフォルトの名無しさん
垢版 |
2018/10/20(土) 02:32:55.91ID:ZiSB9nEL
Ifとforだけでとりあえず簡単な処理くらいはさせられるようになったんだけど、次は何を学べば順当にステップアップできる?
イベントプロシージャもダブルクリックだけは理解した
Constで柔軟なコード書くのも学んだ
配列はいまいち便利な使い道がわからない
2018/10/20(土) 06:58:16.21ID:JSzrZOTM
>>715
処理の制御自体は分岐と繰り返しを覚えれば大抵なんとかなる。
ロジックをよりスマートにしたい。処理時間を短縮したい等なら、配列やアルゴリズム等の効率的なやり方が必須になる。
特に、セルを使うならば配列は絶対使ったほうがいい。二次元配列と聞くとよくわからなそうだが、
(y軸,x軸) を指定するだけだから、一見難しそうに見えても簡単だよ。
あとは、何をやりたいかによるかな。それによって取得するべき技術が決まってくると思う。
2018/10/20(土) 07:07:20.99ID:JSzrZOTM
>>715
配列使った方がいい理由を補足すると、
配列変数を使えば、変数の数を大幅に減らすことができるかつ、ループ文を使って1から最大数までアクセスがしやすいから。例えば、人間という名前の違う変数を別々に100人定義するのは面倒。
だが、配列変数を使えば1行で定義できる。

セルに関して言うと、VBAはセルにアクセスした際に大幅に時間を使う。値を編集するたびに毎回セルにアクセスするよりも、配列変数に格納をして、まるごとセルに代入するようにすれば、アクセスは1回で済む。
(それっぽく例えるなら、積み木を片付ける時に1つずつ摘まんで箱に入れるか、形を整えた後まとめて箱に入れるかの違い)
2018/10/20(土) 07:49:40.17ID:/P2yZ5ci
>>715
次は違う言語を学ぶといいよ
pythonとかがオススメ
2018/10/20(土) 08:15:19.11ID:A4xnc2/3
>>715
シートはセルの二次元配列
ブックはシートの一次元配列
合わせて三次元の配列

元々エクセル自体が配列の塊なので、
vba上だけで配列を持たなくてもなんとかできるようにはなっている

他のプログラムだと配列なしなんてありえないんだけどね

vbaで配列を扱う大きなメリットとしては、爆速にできる事

で、そこまで来たら何を覚えるかだけど
・objectの扱い。set foo = sheets("name")
・fso(filesystemobject)

この辺かね〜

他言語やるなら俺もpythonがオススメ
2018/10/20(土) 09:34:05.81ID:46UfR13B
>>719
>合わせて三次元の配列

「三次元配列」と書かないところが正確でイイ!
2018/10/20(土) 11:18:59.41ID:+OPbDxrw
あ・・・Application.Workbooks(3).Worksheets(1).Cells(1, 1).Characters(2, 2).Font.Color = vbRed
2018/10/20(土) 11:51:10.77ID:ZiSB9nEL
参考になります!説明がとても分かりやすいですね 尊敬します
配列を学ぶことでの処理の高速化も理解できました
setはサンプルコードでよく見かけるなとは思ってたけど、詳しく掘り下げてみます
fsoは初耳なのでじっくり学びます
Pythonも並行して学びたいと思ってたのでちょうどいいタイミングみたいですね
ありがとうございました。
2018/10/20(土) 12:18:11.17ID:4zkFVcA8
for each文かな
2018/10/20(土) 12:25:25.27ID:A4xnc2/3
あぁfor eachは必須だね
725デフォルトの名無しさん
垢版 |
2018/10/20(土) 13:40:10.36ID:fOofNO0j
>>715
余裕があるならアセンブリ言語をちょっと齧っとくのがいいと思う
2018/10/20(土) 14:06:53.02ID:9jkSTDWo
>>725
アセンブラとか環境とかはどう調達すればいいのでしょうか?
2018/10/20(土) 14:48:16.50ID:wrk6+Nbn
masm とか nasm とかのキーワードで調べる
っていうか、vbaの範囲外のことまでここで聞くなよ
2018/10/20(土) 17:52:59.67ID:b1m8oY5e
>>715
デバッグの方法(VBEの機能)
ユーザーフォーム
for next以外の繰り返し(do loop)
729デフォルトの名無しさん
垢版 |
2018/10/20(土) 18:35:11.69ID:fOofNO0j
>>726
齧るだけだからネットで調べてだいたいの仕組みが分かればそれでいいんだよ
「アセンブラ 入門 casl」でググって見つかったサイトで勉強してみるのがいいと思う
資格の勉強にもなるし

やる気あるなら機械語が使えるポケコンを買って実際に
ハンドアセンブルしてみるのもいいかも
2018/10/20(土) 19:32:33.10ID:9jkSTDWo
>>729
casl2 は気が進まなくって…だってハードがないんでしょう?
731デフォルトの名無しさん
垢版 |
2018/10/20(土) 19:45:41.44ID:fOofNO0j
>>730
うん、ハードはないな、仮想CPUだから
でもコンピューターの仕組みは分かるようになる
俺はアセンブリの知識のおかげでデバッグとかで役に立ってる
2018/10/21(日) 09:08:05.20ID:kG1rnb84
オデッセイのやってるvbaの試験受けてvbaスタンダードに合格したけど、
これ実際にvbaでプログラム作れって言われても絶対作れないな。

何が言いたいかって、お前らすげーわ。
2018/10/21(日) 11:55:37.97ID:ENQ8JUj5
>>730
ハートもないやつがなにいってる
2018/10/21(日) 12:30:29.51ID:jhIwJ9RB
vbaで色々ツール作ってるけど、自分しか使わないっていうので設計雑になっちゃう。
後の機能追加等考えるとクラスモジュール使って役割ハッキリさせた設計が良いんだろうけど、結局書くのが楽な手続き型チックになっちゃうのよね
2018/10/21(日) 14:12:47.07ID:895e0oJn
>>734
それは別に反省ポイントじゃない
2018/10/21(日) 14:42:48.38ID:3rYBWp0g
自分を省みるのは良いことだよ
2018/10/21(日) 17:38:59.00ID:PQvzxFzP
VBAはコードのスタイル云々以前に存在自体が基本的に悪なので、実務においてはいかに使用を最小限にとどめながら要件を満たすかが最も重要だよ
VBAがあるだけでメンテができる人が数十分の一になるんだから
2018/10/21(日) 18:02:16.30ID:97mpJlTr
VBA撲滅委員会でも作ってその会長にでもなれ
2018/10/21(日) 18:14:38.25ID:PQvzxFzP
>>738
別にVBAで飯食ってる人を批判するつもりはないよ。
プログラミングにおいて>>734の言ってるような適切なモジュール化(VBのModuleではなく広義のモジュールだぞ、念のため)を行う目的は、メンテナンス性を良くすることだ。
そして、Excelのメンテナンス性を高める最善の方法は、VBAのコードを綺麗に書くことではなく、VBAの使用を極力控えることだ。
VBAのメンテナンス性を高めようという発想は根本的に矛盾してるんだよ。
2018/10/21(日) 19:06:18.04ID:jhIwJ9RB
VBAの存在が基本的に悪という理由って何だ?
文面から見て、メンテできる人(使用者)が少ないからという風に捉えているんだが…
もしそれが理由ならば、職場によるのではないか?
2018/10/21(日) 19:13:25.11ID:jhIwJ9RB
ただ、以前にマクロを修正する案件をやった時
初めて他者の書いたコードをしっかり見ることになったが…まぁ見辛いし目的が捉えづらく苦労した。
ろくなドキュメントも残っていなかったしね。
でもそれは、コードの改善や仕様書をしっかり残せば解決する問題であって、決して言語そのもののせいではないと私は思っているよ。
2018/10/21(日) 19:36:36.64ID:MDetJiiM
言語や開発環境が悪いからユーザーが集まらない
言語や開発環境が悪いからユーザーが育たない
言語や開発環境が悪いから汚いコードが作られやすい

全てとは言わないが大きな影響力を持ってるのは否定できないな
2018/10/21(日) 19:54:07.49ID:y1r4bkf6
>>734
言うてもそんなに長くならないので、コメントさえしっかり書いておけば大丈夫だよ
2018/10/21(日) 20:57:14.28ID:Mf4U6jjq
Pythonを使える環境ならPythonでExcelを操作できるようになっといたほうが将来的に有意義なんですかね
2018/10/21(日) 21:27:31.42ID:y1r4bkf6
>>744
何を目指すかによる
プログラマーならexcelはまず触らない
事務職ならpythonを触らない
両方知っておくことは悪いことじゃないが、どっちっつかずになりそう
2018/10/21(日) 21:55:52.80ID:Df7SvDdo
知恵遅れに毎日60以上ののVBA低レベ質問が恒常的に続くのは、商業科がExcelを教科に入れてるせいか?
VBA、大学教養のC課題、ネトゲーマーのUWSC自動化の三馬鹿うんざりトリオをなんとかして欲しい
2018/10/21(日) 22:00:53.93ID:y1r4bkf6
無視したら
2018/10/24(水) 20:08:02.64ID:VKzyLxGu
どうせ半年後は.jsになってるんだし
2018/10/24(水) 21:19:25.29ID:I9F6CV18
昔アセンブラやってたけど
今はアセンブラの知識なんて
まず糞の役にもたたない
悪いことは言わないから
IL止まりにしておいて
残りの時間を他の言語の学習に回した方がいい
2018/10/24(水) 23:52:56.26ID:PFCPc8y/
VBAってWinAPI 使えるんだな
入力もエクセルのシート利用できるし使いがっていいなこれ
自分だけ使うものはこれで十分な気がしてきた
2018/10/25(木) 00:03:26.58ID:lvTxqVIL
二次元配列に入力できるってかなり神がかってると思う
2018/10/25(木) 08:52:35.61ID:VGA0KlB2
何を二次元配列に入力できる事が神がかってるの?
2018/10/25(木) 09:32:39.27ID:r31i+JfI
人間が抽象化なしで無理なく扱えるデータは二次元の表までなのは確かだな
特別な技能を持たない人間の能力的限界がExcel
2018/10/25(木) 11:20:28.64ID:Poeqy0yu
行(列)をベクトルだとみなすと何次元にでもなるでしょ
テンソル入れ物にするメリットってあるか?
レベル上がると有益になるのかな
2018/10/25(木) 18:41:01.78ID:lvTxqVIL
>752
文字列と数値。ってかこれ以外セルには入れられないでしょ。オブジェクトは入れられないし
2018/10/26(金) 00:13:09.54ID:Inq2or/E
何を〜に入力できる?
って質問に対して間違っちゃいないが...
2018/10/26(金) 01:08:48.00ID:SUBF4wRe
>>755
変数型のことじゃなくて、どんな
データかって意味じゃね?
2018/10/26(金) 07:12:48.70ID:xKW3LLWl
セルって単語が後出しだからこうなるんだよ
2018/10/26(金) 08:36:50.37ID:QS/Z6hlA
わかるなら聞くなよハゲども
なんでハゲてるか自問してろ
2018/10/26(金) 10:34:09.86ID:FHu9JUdN
>>750
当然だがWinAPIだけじゃなくVB呼び出しに適う任意のAPIが呼べるから、自分だけの環境なら何だって可能
2018/10/26(金) 10:45:47.31ID:REmVcuAB
解凍・圧縮用のdllであるunlha32やらunzip32なんかもちゃんと用意されていて、vbaから利用できるしな
2018/10/26(金) 12:00:29.68ID:FHu9JUdN
>>761
え、ないでしょ?
あるんだっけ?
2018/10/26(金) 13:41:39.22ID:FXq8Nzbn
「自分だけの環境」の話だろw
2018/10/26(金) 20:18:33.42ID:7acxRmxq
それ言い出すとシェル呼び出してそこから外部プログラムの実行でなんでもできるわな
2018/10/27(土) 00:10:36.89ID:64tA3ZzD
それだと最早Excel VBAを起点にする意味がないんだよなぁ
2018/10/27(土) 09:39:45.10ID:z1SsyyeN
戻り値主体の関数的な使い方がしにくいのでは?
767デフォルトの名無しさん
垢版 |
2018/10/27(土) 12:17:32.77ID:nqyfF+/M
なんで何でもできたら悪いみたいな言い方やねん
2018/10/27(土) 15:13:38.94ID:gKMunlkh
彼女の作り方がわからない
2018/10/27(土) 17:08:31.91ID:arx5iKp2
事務の女性をお得意のVBAで助けてやるんだ
2018/10/27(土) 20:08:09.98ID:9XazvJsa
助けてあげても一瞬感謝されるだけで何も起こらないぞ
下手すると感謝すらされない
2018/10/27(土) 21:27:07.52ID:EQmtOnig
>>770
そう、気づかないんだよな・・・
2018/10/27(土) 23:46:47.86ID:bYiR1b6u
助けても後出しで本当はこうしたいのにできてないだの文句言われる
773デフォルトの名無しさん
垢版 |
2018/10/28(日) 06:55:12.79ID:xmv6f/Y+
全然助けれとらんやんwプロさんあわれwww
2018/10/28(日) 09:41:11.55ID:U+AZbxUR
ちょっとしたことでいいからピンポイントで教えてあげる。
食いついてこなかったら諦める。
2018/10/28(日) 10:40:54.72ID:o08My3f7
ExcelVBAで、女にもてるようになる方法スレ w
2018/10/28(日) 11:02:16.86ID:eT9vyE0h
ランダムアクセスファイルでデータ管理をしています。
いままで動いていたものが GET PUT で 「レコード長が一致しない」となります。

一部こんな感じです。
Const MONTH_SIZE As Long = 60
Type M_Rec
S_code As Long
Stock As Long
byCode As String * 8
M_id_Cre(MONTH_SIZE) As Integer
End Type
Public S_MAIN_REC As M_Rec

Open FileName For Random As #SmainNO Len = Len(S_MAIN_REC)
Get #SmainNO, indexNo, S_MAIN_REC

この標準モジュールを破棄して同じモジュールをインポートすると
正常に動きますがワークブックを保存して再起動し同じ処理をすると
エラーになります。
Public S_MAIN_REC As M_Rec の 記述場所を移動させると正常に
動きましたがモジュール内に新規プロシージャを追加したらまた
エラーが出るようになりました。
モジュールが壊れていると思い新しく作成しても同じでした。
ご意見お願いします。
現在ユーザ定義 の M_id_Cre(MONTH_SIZE) As Integer の配列を
61に変更し正常動作中です。
2018/10/28(日) 11:41:59.08ID:THaxkhg7
さすがに時代遅れにも程がある
そんな黴の生えたゴミカスは今すぐ捨てて普通にワークシートで管理するかDBにしろ
2018/10/28(日) 15:41:48.78ID:9UvKiQNH
言い過ぎ。しかしランダムアクセスファイルとは懐かしい
779776
垢版 |
2018/10/28(日) 16:59:37.36ID:eT9vyE0h
すみません
もともとはワークシートで管理していたのですがファイルのほうが
都合が良いので変更しました。
2018/10/28(日) 17:01:07.70ID:ISWax1Kh
で、今まさにその前提が間違っていたことが判明したんだろ?
直ちに戻しなさい
781デフォルトの名無しさん
垢版 |
2018/10/28(日) 20:08:41.54ID:4pkRNiip
馬鹿の特徴

動きません
エラーが起きます

決して具体的なエラーメッセージを書かない
2018/10/28(日) 21:40:15.40ID:uzLWPyey
バカの特徴
書いてあるエラーメッセージを理解できずに自爆 w

> GET PUT で 「レコード長が一致しない」となります。
2018/10/28(日) 23:30:32.75ID:9UvKiQNH
ここの住人回答者は居丈高だからteratailにでも質問なさい。
ただコード具体例とエラー詳細はいずれにせよ求められるけど
784デフォルトの名無しさん
垢版 |
2018/10/29(月) 00:30:55.69ID:4Xu2UR6y
>>782
馬鹿は表面的なことしか見えない
2018/10/29(月) 04:51:38.42ID:xpZzwKyb
>>784
表面的なことすら見えてないバカの自爆乙 w
2018/10/29(月) 09:45:00.02ID:uMisuGYK
初心者には環境とかエラーの詳細な条件を明記することへの心理的な障壁があります
その心理の正体は一体何でしょう?
2018/10/29(月) 10:53:33.28ID:VYDzXbvz
慣れの問題かと
・自信ないのでミス指摘されたくないなどの自尊心問題
・コンプライアンスリスクとの取り違え
・個人情報リスクとの取り違え
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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