Excel VBA 質問スレ Part54

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/05/26(土) 20:37:37.74ID:Lty78diJ
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK


最近プロによる書き込みが多々見うけられますが
彼らに絡むと話がこじれるので質問したい方は適当にスルーしてください


※前スレ
Excel VBA 質問スレ Part53
http://mevius.5ch.net/test/read.cgi/tech/1524823358/
2018/06/07(木) 21:50:54.59ID:G9c1fl5R
ForEachでWorksheetsコレクション回してコピー元のシート名と一致するか見れば済む話だろ
答える側のレベルも低すぎ
195デフォルトの名無しさん
垢版 |
2018/06/07(木) 22:29:02.37
For Each 回したりするくらいならこうだろ

Dim wks as Worksheet
On Error Resume Next
Set wks = Worksheets(sheetname)
On Error GoTo 0
If Not wks Is Nothing Then …(重複時の処理)…
2018/06/07(木) 22:31:47.53ID:l2af3llu
182です。
みなさんありがとうございます。
今の状況はこんなコードです。

Dim i As Long
i = Worksheets("マスタ").Range("B3").Value

Worksheets("鑑").Copy After:=Worksheets(Worksheets.Count)

Worksheets(Worksheets.Count).Name = i

というコードです。
197デフォルトの名無しさん
垢版 |
2018/06/07(木) 22:52:24.42ID:l2af3llu
こんな表を書きたいのですが、どのようにコードを書けばいいのでしょうか?
http://iup.2ch-library.com/i/i1912882-1528379316.png
198192
垢版 |
2018/06/07(木) 22:53:31.56ID:BzIZrc7A
>>196

これならcopyの前に、その名前のシートがあるか判定してアラート出せばいいでしょ。

Sub test()

Dim myShName As String
Dim myWS As Worksheet
Dim myFlag As Boolean

myShName = Worksheets("マスタ").Range("B3").Value

For Each myWS In Worksheets
If myWS.Name = myShName Then
myFlag = True
End If

Next myWS

If myFlag = True Then
MsgBox "すでにあるためコピーしません", vbInformation
Else
Worksheets("鑑").Copy after:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = myShName
End If


End Sub
2018/06/07(木) 22:53:51.61ID:l2af3llu
ごめんなさい。197はスレを間違えました。失礼しました。
200192
垢版 |
2018/06/07(木) 22:59:58.47ID:BzIZrc7A
>197

ふつうにマクロの記録でできると思います。
が、それをマクロでやる意味があるのかどうかは分かりません。
手作業でなくマクロを使いたいのはなぜ?
2018/06/07(木) 23:28:43.72ID:NUSkSgba
ID:l2af3llu
馬鹿過ぎ
2018/06/07(木) 23:43:46.34ID:DZn2zH5X
excelはめんどくせえなぁ
2018/06/08(金) 00:04:23.94ID:yxBs3du0
>>202
優しくしてねハート
2018/06/08(金) 01:15:25.48ID:4Sm8z/zL
>>196
flgを立てないパターン。
Dim sheet_name As String
Dim ws As Worksheet
sheet_name = Worksheets("Sheet1").Range("B3").Value
For Each ws In Worksheets
If ws.Name = sheet_name Then
MsgBox "alert", vbInformation
Exit For
Else
If ws.Name = Worksheets(Worksheets.count).Name Then
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.count)
Worksheets(Worksheets.count).Name = sheet_name
End If
End If
Next
2018/06/08(金) 01:45:24.10ID:r8MI6JEs
ファイルの上書き保存を禁止するマクロって組めるの?
それともファイルを開いたら自動的に複製が作られるようなのを組んだ方が楽かな
チームで1つのファイルを使ってて加筆することはあっても消す事は出来ないようにしたい
206192
垢版 |
2018/06/08(金) 02:24:44.07ID:gKLQw3te
>>205
before save イベントで、ある程度はできそうだけど、「上書き保存できないように」「加筆することはあっても消すことはできない」あたりが、ちょっと何をしたいのかよく分からないですね。
2018/06/08(金) 03:51:17.27ID:OuLpGoMA
>>205
svn導入したら?
208デフォルトの名無しさん
垢版 |
2018/06/08(金) 05:17:01.97ID:js+z/PTh
悪いこと言わないからWebアプリを覚えた方が良いって
共有も簡単
同時入力も出来る
端末も場所も選ばない
覚えるのはSQL C# html css JavaScript
たったこんだけで飛躍的に変わるんだから
2018/06/08(金) 06:50:16.72ID:YFpIx0sU
>>205
操作ミスを防ぎたいだけなら「読み取り専用を推奨する」を設定しておくのじゃダメかな
http://www.moug.net/tech/exopr/0060021.html
2018/06/08(金) 12:13:41.25ID:6N8w+kEg
>>205
エクセル上の上書き保存を禁止するだけなら、プロパティで読み取り専用にする方法と、Open時にパスとRead Onlyフラグを見て判定する方法と、before saved時にcancelする方法が考えられる。application.UserNameと組み合わせて自分以外は保存出来ないようにするとかね。
2018/06/08(金) 14:09:42.72ID:pgnN0/Vq
びふぉーせーぶきゃんせるしたらマクロほぞんできなくねて思って調べたらマクロ実行中にcancel trueにするとか書いてて目から鱗
使わんけど
212デフォルトの名無しさん
垢版 |
2018/06/10(日) 06:38:13.95ID:DGfRCW8U
>>205
>>207の言う通りファイルを複数人で共有して管理するなら
SVNとかTFSとかGITとかの導入を考えた方がいいかも
それなら間違って書いて上書きしてしまっても誰がいつ書き換えたかも分かるしすぐに直せる
もちろん何かしらでファイルが消されてしまってもすぐに復活出来る。

個人や会社の研修に使う程度の小規模のものなら
これをONE DRIVE、GOOGLE DRIVE、DROP BOX等と併用して使えば
インターネットに繋がる端末であればどこからでも
参照することが出来るようになる。
ただしセキュリティ面に関しては自己責任で。
2018/06/10(日) 11:36:18.83ID:c2C6yQT0
と、無職が書いてます
2018/06/10(日) 11:43:27.28ID:kZ6+r7gZ
ビジネスマンは認証なしファイルサーバーでエクセル共有が常識
徹底的に無駄をそぎ落とせ
215デフォルトの名無しさん
垢版 |
2018/06/10(日) 12:53:16.88ID:tSaaEFeX
>>214
共有ってもエクセルって同時に開けないでしょ?
2018/06/10(日) 13:05:50.36ID:Fn8GdORp
>>215
エクセルを共有し、複数人で同時に書き込むの面白いよ

会議とかでエクセルで議事録を書き、それを共有する
(同時にプロジェクターで映し出すのもいい)
それを各自が見ながら発言し、適宜各自が修正などを加えていく…
4〜5人のお馴染みのメンバーによる会議なら、議事録作成はこれが一番手間いらずだったな
2018/06/10(日) 13:08:10.31ID:4Fo/ClCp
共有ってのは情報を共有するってこと
ファイルがみんなの目に触れられるところにあればそれは共有してると言える
同時に開けるか否かは関係ない
社長のスケジュールを社員全員が共有する、みたいな
218デフォルトの名無しさん
垢版 |
2018/06/10(日) 13:21:16.74ID:kZ6+r7gZ
入力しにくい、同時作業しにくい、検索しにくい
エクセルは情報共有ツールじゃないということだ
実は表計算ツールなんだよね
219デフォルトの名無しさん
垢版 |
2018/06/10(日) 14:24:40.68
ExcelはDTPソフトにもデータベースソフトにも統合開発環境にもなる

何か一つしかアプリをインストールできないとなれば間違いなくExcelを選ぶ
2018/06/10(日) 15:03:32.84ID:kZ6+r7gZ
何かひとつならdotnetインストールするわ
2018/06/10(日) 15:26:15.87ID:0BrTvT6v
単にエクセルしか使えないだけ
222デフォルトの名無しさん
垢版 |
2018/06/10(日) 15:32:22.56ID:5Z7WXmtC
単に向上心がないだけ
223デフォルトの名無しさん
垢版 |
2018/06/10(日) 16:32:55.66ID:31HL9wlr
>>215
一応あるぞ
https://support.office.com/ja-jp/article/%E5%85%B1%E6%9C%89%E3%83%96%E3%83%83%E3%82%AF%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-49b833c0-873b-48d8-8bf2-c1c59a628534
2018/06/10(日) 18:16:45.90ID:stgWZmbr
共有はオブジェクトが扱えないのがなぁ
225デフォルトの名無しさん
垢版 |
2018/06/11(月) 01:50:54.91ID:z84MX3Hd
じゃあなんでexcelがこんなに普及してんの?
ここであれこれ名前が上がるけど、マイオナにしか聞こえん
226デフォルトの名無しさん
垢版 |
2018/06/11(月) 02:28:17.34ID:kgcyA64B
普及してるのは最初から入ってるから
でも今では会社じゃほとんど使わないですよ
使ってもメモ替わり程度
それ以上の用途はそれぞれの専用アプリを使います
なければWebアプリを中心に作ります
エクセルメインって弱小零細企業なんだろうけどテクノロジーは恐ろしいスピードで変化してますよ
227デフォルトの名無しさん
垢版 |
2018/06/11(月) 03:08:00.26ID:UR89H75b
日本の過半数は中小で政府の提供ファイルもExcelやぞ
http://www.chusho.meti.go.jp/pamflet/hakusyo/H27/h27/shoukibodeta/h27/html/b1_1_1_2.html
228デフォルトの名無しさん
垢版 |
2018/06/11(月) 03:19:33.44ID:kgcyA64B
今はPDFが多いだろ
エクセルとかワードファイルなんて必要項目以外も編集出来ちゃってもとファイルの意味ないじゃん
いつの時代の話をしてるの?
2018/06/11(月) 03:28:33.20ID:Yoq0VGap
俺は派遣でかなり大きな会社(SONYとかと同レベル)で働いているけどExcelめいいっぱい使ってるぞ。
VBAも使いまくってる。
というかVBAの仕事なんだけどね。
2018/06/11(月) 03:35:25.80ID:Yoq0VGap
現実と願望の区別が出来ない人がいるみたいだね。
それが進むとコンピュータ使うのなんて中小ぐらいしかないなどとなる。
231デフォルトの名無しさん
垢版 |
2018/06/11(月) 03:56:13.19ID:vx8oiu6e
派遣の人にさせる雑用事務仕事ならエクセルくらいしか使えないだろうから仕方ないかな
232デフォルトの名無しさん
垢版 |
2018/06/11(月) 07:19:30.73ID:z84MX3Hd
>>228
まさにこういう人の意見なんだけど、何をもってほとんど使わないと言ってるんだろう?
そんなにたくさんの会社を見てるの?
2018/06/11(月) 07:39:59.32ID:fIKXCmX7
入力装置としては悪くないプラットフォームだと思う
もちろん神エクセルは論外だけど
小規模のテーブルデータをサクッと作るには便利
ただエクセルのままデータや文書として交換するのはやめてほしいね
2018/06/11(月) 07:56:19.19ID:Yoq0VGap
>>231
お前より給料貰ってるけどな。

言い訳ばかりじゃたかが知れてる。
何を言っても零細は間違いというわけだ。
235デフォルトの名無しさん
垢版 |
2018/06/11(月) 08:03:09.89ID:z84MX3Hd
>>234
急に給料の話持ち出してどうしたの
2018/06/11(月) 08:41:00.99ID:Yoq0VGap
雑用事務じゃないってことだろ。
2018/06/11(月) 09:03:51.14ID:3FHBrWqi
ID:kgcyA64B

いつものフリーターの妄想です
2018/06/11(月) 12:38:18.86ID:l6P//bWH
表計算するのに使ってる
2018/06/11(月) 17:42:17.84ID:FzOvR6AO
↑それには気付かなかった!
2018/06/11(月) 18:01:59.04ID:uMLVNrv/
フォームを使っていろいろ勉強しながら遊んでるんですが、コードが長ったらしくなるときはcallで別に書いてるんですが、functionの使いどころというかこういうときは絶対functionだ!ってあるんですか?
引数やら戻り値やらネットでみたりするけど使いどころがいまいちで...
2018/06/11(月) 18:49:21.09ID:reMFgRN5
>>240
何度も呼び出す機能はfunction
同じ処理をコピペであちこちに書くと
直すとき大変ですし
スコープが狭くなると把握しやすくなるよね
2018/06/11(月) 19:01:52.91ID:ga7441Wg
>>240
むしろ関数の方が基本
ここぞというところだけプロシージャ
2018/06/11(月) 20:23:25.35ID:Jd6lebUg
>>242
戻りが必要なときがFunctionだと思ってた。
「ここぞ」ってどんなとき?
2018/06/11(月) 20:38:01.83ID:MCKH0IFJ
プロシャージャから呼ばれるものは原則ファンクション。とりあえずブーリアン型にしてtrueを返してるわ
プロシャージャはイベントハンドラと、ファンクションのデバッグ用くらいかなー
2018/06/11(月) 21:11:25.77ID:Jd6lebUg
>>244
ProcからSubProcを呼ぶのは邪道ってこと?
2018/06/11(月) 21:29:44.32ID:WRNhFr5s
ほとんど哲学の話だから気にしなくていいよ
2018/06/11(月) 23:00:51.68ID:IkuRhDJZ
>>240
馬鹿は死ねよ
248デフォルトの名無しさん
垢版 |
2018/06/11(月) 23:00:58.03
値の戻し方だって
関数の戻り値か、ByRef引数か、グローバル変数か、セルか、テキストファイルかは自由自在
2018/06/11(月) 23:08:19.54ID:VLKc0T55
>何度も呼び出す機能はfunction
さすがプロは違うなあ
2018/06/11(月) 23:20:37.50ID:ToxnEFH5
>>248
Document Properyもね。
2018/06/11(月) 23:21:58.92ID:ToxnEFH5
>>248
Document Properyもね。
>>250
あちゃ、Properyってなんだ?
2018/06/11(月) 23:43:56.97ID:ga7441Wg
関数のありがたみがわからない初心者のみんなは副作用、参照透過性、例外安全という観点で関数とプロシージャを比較してみよう
それだけでスキルアップだ
コードがグンと洗練されるぞ
やったね!
2018/06/12(火) 05:17:47.61ID:UBgzW1A3
> 副作用、参照透過性、例外安全
最近覚えたので使いたくてしょうがないんだろうな w
頓珍漢過ぎて笑うしかないけど
254デフォルトの名無しさん
垢版 |
2018/06/12(火) 05:37:01.98ID:bL9bvKzR
いつも行と列がわからなくなるんだがいい覚え方ある?
列方向とか言われると頭が混乱する
2018/06/12(火) 06:10:19.11ID:08LecQze
>>253
初心者くん
お勉強は大事だぞ
2018/06/12(火) 06:30:13.12ID:ujVgl+Aq
>>254
Row
Column
それぞれの先頭文字見たら
2018/06/12(火) 06:33:02.24ID:ujVgl+Aq
>>254
途中で書き込んでしまった

https://lambdalisue.hatenablog.com/entry/2013/07/18/134507

見ろ
2018/06/12(火) 06:37:59.94ID:rsKFgPQp
>>254
今時ほとんど横書きだから「行」と言えば横方向でしょ
一行目って言われて縦読みする奴はあまりいないし w
2018/06/12(火) 06:39:41.54ID:rsKFgPQp
頓珍漢なお勉強した結果 ⇒ >>255 w
260デフォルトの名無しさん
垢版 |
2018/06/12(火) 07:06:59.16ID:bL9bvKzR
ありがとうございます
これで行列を判別できそうです
2018/06/12(火) 08:05:50.28ID:08LecQze
>>259
そのうち君にもわかる時が来る
めげずに勉強しよう
今はわからなくても大丈夫だ
2018/06/12(火) 08:19:29.16ID:DCDELge2
constがないから効果半減だぞ
2018/06/12(火) 12:25:55.59ID:rsKFgPQp
>>261
ごめんねー、頓珍漢な勉強なんてしたくないから w
2018/06/12(火) 16:53:42.24ID:uqGpbG9r
>>254
長文は3行にまとめろ
この時「3列に」とは言わない
これが行と列の違い
2018/06/12(火) 19:32:41.56ID:DCDELge2
まあ自分もほとんどがFunctionでSubは数えるほどだな。
Subを使うのは求める値を直接値として返すのはデカすぎるときとか。
2018/06/13(水) 02:55:36.27ID:63Q03/Wf
値を戻す必要のある手続きならFunction
その必要がない手続きならSub

原則的にはこれしかないわけだが
Functionの戻り値以外で値を返す手続きは例外的なものに限るべき

>>252
お前はVBAで、何と何を比較してるの?
2018/06/13(水) 03:53:54.39ID:g5iHfrqr
>>266
あぁ、それなら認識通りだわ。邪道なのかと思った。
268デフォルトの名無しさん
垢版 |
2018/06/13(水) 06:41:50.05ID:AbU9Bfwe
>>254
2018/06/13(水) 06:45:07.28ID:a6LcHevh
>>268
横だが、それいいね。今目に焼き付いたわ
2018/06/13(水) 07:47:19.69ID:xCQwBm/v
>>266
> 値を戻す必要のある手続きならFunction
> その必要がない手続きならSub
複数の値を返したい時は?

> Functionの戻り値以外で値を返す手続きは例外的なものに限るべき
C# の TryParse() 系の奴は例外的だと言う主張ですか?

> お前はVBAで、何と何を比較してるの?
そいつには触れない方がいいかと
2018/06/13(水) 08:03:40.57ID:rWAWAyN4
配列かユーザー定義、あとは引数を参照にして引数で返すとか。
そのプロシージャの内容で変える。

クラスにするとか場合によっちゃコレクションに複数のクラスを入れて返すとか配列を配列に入れて返すとかする場合も。

複数かどうかではなくそのプロシージャにとってどうあるべきかが重要。
272デフォルトの名無しさん
垢版 |
2018/06/13(水) 08:25:56.30
>>271
結局FunctionとSubの使い分けは値を返すかどうかなんかとは関係ないってことだよね
2018/06/13(水) 08:33:38.51ID:P6ISw7WJ
例外もあるってだけで原則は>>266じゃないのか
2018/06/13(水) 09:00:39.02ID:Dklmt2kz
>>242,>>244,>>252
sub も function も両方ともプロシージャです
2018/06/13(水) 09:44:34.86ID:aJvJT0ED
副作用あるならsubでないならfunction
2018/06/13(水) 09:59:08.35ID:bw/iOSvB
副作用が一切ないSub
2018/06/13(水) 10:20:33.97ID:IL7yIAnv
functionにした事で起こる副作用って何?
可読性とか、解析とかに影響が出るだけで、動作自体はfunctionが完全上位互換だと思ってたんだけど。
2018/06/13(水) 10:34:42.38ID:U79y3YwB
どうせグローバル変数弄るんだから、どっちも同じだろ?
279デフォルトの名無しさん
垢版 |
2018/06/13(水) 11:59:36.53
SubにしろFunctionにしろ、あんまり分割しすぎるのはBASIC的ではないので、可能な限りGoSubを使いましょう
2018/06/13(水) 19:45:28.16ID:MfFyOg3y
>>270
>>266
>> 値を戻す必要のある手続きならFunction
>> その必要がない手続きならSub
>複数の値を返したい時は?
関係ないものを複数返したいなら多くの場合は設計ミス
関数の責務が複数あると考えていい
関係のあるものを複数返したい場合はそれらを含む別のクラスが隠れているのかもね
何れにせよ複数返したいと思った時点で冷静に考えを整理すべき


>> Functionの戻り値以外で値を返す手続きは例外的なものに限るべき
>C# の TryParse() 系の奴は例外的だと言う主張ですか?
いいとおもうよ
あれはパフォーマンス追求するときと並列処理、相互運用ぐらいにしか使わん
実際にref/outを使う標準ライブラリはほとんどない
ParseやTryGetValueは使用頻度が高く、例外でエラー通知するのはオーバーヘッドがあるからoutにするメリットの方が大きいと考えられて例外的に導入されたもの


>> お前はVBAで、何と何を比較してるの?
>そいつには触れない方がいいかと
2018/06/13(水) 20:25:33.06ID:xCQwBm/v
>>280
> 何れにせよ複数返したいと思った時点で冷静に考えを整理すべき
で、結局どうするのさ?

> あれはパフォーマンス追求するときと並列処理、相互運用ぐらいにしか使わん


> ParseやTryGetValueは使用頻度が高く
結局よく使うのか使わないのかはっきりしろよ w
無理矢理反論してるのがバレバレだぞ
2018/06/13(水) 21:02:10.70ID:0T3bSaKS
入れる穴が複数あるのに出す穴が1つってのが間違ってるんだよ
だから入れる穴から出す
283デフォルトの名無しさん
垢版 |
2018/06/13(水) 21:10:06.85ID:qak7HNFr
もはやプロさんによるプログラミング脱初心者講座
エクセルマクロはどこいったんや
ほんま役に立たんプロさんばかりやなw
2018/06/13(水) 22:26:11.41ID:OXky9+iL
>>281
もう少し理解力つけよう
285デフォルトの名無しさん
垢版 |
2018/06/13(水) 22:29:45.50ID:IQOPO94p
もう全部参照渡しやっとけば?
2018/06/13(水) 22:35:46.81ID:63Q03/Wf
>>270
あれはあくまでもVBAでのSubとFunctionの使い分けの指針な

>複数の値を返したい時は?
複数の値を返したい時点で例外的な処理だと思った方がいい
複数の値が必要なら、複数の値をまとめた「何か」を一つ返すのが原則
まあ実際はそうガチガチにはやらんけどな

>C# の TryParse() 系の奴は例外的だと言う主張ですか?
まあ、例外的
あれは、変換が可能かどうかと、変換した値という二つの処理をまとめてるから

>>274
おれもそう思ってはいるが
VBAにはいまでもGoSub Return ってのがあるからなぁ
2018/06/13(水) 22:44:58.50ID:fGM4jS90
>>284
説明も反論もできないなら黙ってろよ w

>>286
> あれは、変換が可能かどうかと、変換した値という二つの処理をまとめてるから
どうみてもその処理はまとめるべきだろ
別々にやれと言うならちょっと頭おかしい
2018/06/13(水) 22:45:26.77ID:p7d4mVR0
Sub 色の付いたセルの値をクリア()
Dim C As Range
For Each C In ActiveSheet.Range("A1:J25")
If C.Interior.ColorIndex = 15 Then
C.ClearContents
End If
Next
End Sub

で色の付いたセルの値をクリアしたいのですが、結合したセルからは値を消せない的なメッセージが出るのですが、結合しているセルに入っている値を消すにはどのようにすればよいかどなたか教えていただけませんでしょうか?
2018/06/13(水) 22:51:21.44ID:QpS6R6sw
セルが結合されているかどうか調べて、結合していたら解除すれば?
290デフォルトの名無しさん
垢版 |
2018/06/14(木) 03:03:05.09
>>288
C.MergeArea(1).ClearContents
2018/06/14(木) 06:45:04.65ID:6PgoTBhO
結合セルはバグの温床
2018/06/14(木) 07:28:41.46ID:/1DDiwrg
神エクセルへの反逆は許されない
事務員さんに信仰を捧げよ
2018/06/15(金) 20:24:29.69ID:Z5uPnQ18
はじめまして
最近vbaでマクロ書くようになりました

Dim lastcol
Dim kokyaku

lastcol = Cells(2, Columns.Count).End(xlToLeft).Column
Set kokyaku = Range(Cells(2, 4), Cells(2, lastcol)).Find(顧客コード).Column

上記はマクロの一部分なのですがこれのColumnでオブジェクトが必要ですというエラーでるのですがどうしたらいいでしょうか。
ちなみにSetをとるとオブジェクト変数およびwithブロックが、、というエラーが代わりにでてきてしまいます。
2018/06/15(金) 21:03:09.72ID:duszHly5
>>293
これならエラーが出ないと思うけど
Set kokyaku = Range(Cells(2, 4), Cells(2, lastcol))
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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