VBAなんでも質問スレ Part2 [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2015/05/21(木) 10:52:44.71ID:KLv0vQmm
VBAを使った質問ならなんでもござれ
本来の対象であるオフィスアプリを操作する以外の話もOK

ゲーム作り、Webアクセス、外部アプリの操作
COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど
VBAで実行するものであればなんでも質問してください

VBAを開発環境としていろいろ作っちゃいましょう

前スレ

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/

関連スレ

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/

Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/

VBプログラマ質問スレ(Ver.6.0 まで) part64
http://peace.2ch.net/test/read.cgi/tech/1393069842/

Excel総合相談所 118 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1430352555/
2015/05/21(木) 10:55:03.32ID:KLv0vQmm
前スレ埋まってたから立てた
2015/05/22(金) 20:11:01.96ID:HMp/+WyD
バカはレスしないでくれる?
個人の主張として批判せず、いたずらにある類として扱うのは極めて恣意的かおバカの批判にあらざる攻撃の特徴。
まあ、その軽蔑すべき発想で返した俺も反省はしてもよいが
はっきり言って精神病とバカの特徴でしかない論法でレスするなよ。
俺はバカと精神病きらいだからな。
おまえら、マジで精神病と思われる宣言的絶対主義の形而上学バカの一味は人類の公的な敵だとおもっているからな。
さしあたりお前らが馬鹿にされていることは科学的認識の健全性をそれなりに示すから喜ばしいがな。

それにしても、単なる知識を披露しあっているだけの時は頭良さそうなふりはできるが、
いよいよ自身の認識を問われる事態になるとここにいる連中、そこの浅さを露呈するやつ多すぎ
所詮、2chだな
2015/05/26(火) 09:57:20.64ID:98AIg8rM
ここまでテンプレ
2015/05/26(火) 11:15:15.08ID:IGUKy8Mq
>>3
むしろ自分が歯が立たない相手だと分かったら「精神病と馬鹿」というレッテルを相手に貼って
逃げるお前の方がヘタレだけどな

精神病で馬鹿なのはお前の方だよ
6デフォルトの名無しさん
垢版 |
2015/05/28(木) 19:23:08.79ID:S82MiYOL
どこかわからんのでココで。
WordVBAで質問です。

あらかじめスタイルを本文内に設定しておき、
マクロで指定したスタイルが設定されている箇所を検索→
そのスタイルが指定されている場所の文章の置き換え

ということがしたいですが可能でしょうか。
スタイル名を指定して本文内を検索する、という例が見つからず困っております。
2015/06/10(水) 12:51:41.97ID:Eg5H5jgh
outlook2010でHTML形式メール本文の
Enter改行をShiftEnter改行に一括置換、
のVBAをさがしています。
下記のVBAでWordは動くのだけど、
そのままではoutlookで動かない

Sub ShiftEnterConvert()
'
' Enter改行をShiftEnter改行に変換
'
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^13"
.Replacement.Text = "^11"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=ReplaceAll

End Sub
2015/06/10(水) 12:51:59.79ID:Eg5H5jgh
↓ここが参考になりそうなんですが、ほぼ素人の自分には無理でした…わかる方教えてください。
https://outlooklab.wordpress.com/2009/08/08/outlook-object-model-%E3%81%A7%E6%9C%AC%E6%96%87%E3%81%AE%E7%B7%A8%E9%9B%86%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB-word-%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E5%91%BC%E3%81%B3%E3%81%A0%E3%81%99%E3%83%9E/
2015/06/15(月) 17:19:16.55ID:pR/1zNa6
>>7
受信したメールを置換ってできないのでは?
置換したファイルをエクスポートするのですか?
2015/06/16(火) 22:15:42.00ID:x8vn2cko
すみません、受信メールではなく、作成中のメールです。
PCからガラケーに送ると、Enter改行だと無視されてしまうので、送る前にボタンを押してShiftEnter改行に変えたいのです。
リンク付きでPCの人にも送るので、HTMLメールのまま送りたいので。
2015/06/17(水) 02:45:22.84ID:WySeJcTb
>>10
リボンの編集→置換で(ワイルドカードを使用する)^13と^11を指定すればウィンドウからはできましたが、
この機能に該当するメソッドがどうにも探せないですね。
参考にされたコードはワードのものなんですけど、OUTLOOKで使うにはちょっと無理そうです。
12デフォルトの名無しさん
垢版 |
2015/06/30(火) 10:29:12.58ID:ewTLWEfL
初心者から始め、2年ほど1人でVBA業務をしていたのですが
そろそろ引き継ぎ等も考え、コーディング規約のようなものを作成しようと考えています。
各プログラムで命名規則も違うため、統一したいのですが今ひとつ可読性の高い命名というのがわかりません。
修正前の変数宣言のコードを記載しますので、ぜひ添削していただけないでしょうか。
なお、グローバル変数宣言しているのは当時、この方法が一番良いと思ったためです。
13デフォルトの名無しさん
垢版 |
2015/06/30(火) 10:41:30.91ID:ewTLWEfL
'ワークシート名宣言
Public Const Input_WS As String = "入力" '注文書テン
プレートのワークシート名
Public Const Setting_WS As String = "設定" '注文書設定
のワークシート名

'ワークシート[入力]のセル番地宣言
Public Const Order_No As String = "AO1" '注文書番号
Public Const Order_Title As String = "Q2" '注文書種類
Public Const Deta_Issue As String = "S5" '発行日
Public Const Company_Name As String = "B8" '外注業者名
Public Const Company_Code As String = "U8" '取引先
コード
Public Const Cash_Ratio As String = "AE14" '現金割合
Public Const Bill_Sight As String = "AO14" '手形サイト
Public Const Con_Name As String = "F14" '工事名称

Public Const Con_Add As String = "F16" '工事名称
Public Const Con_Start As String = "F17" '工期始
Public Const Con_End As String = "O17" '工期終
Public Const Con_Payment As String = "F19" '工事金額
Public Const Amount_Tax As String = "L19" '税額
Public Const Amount_Total As String = "Q19" '合計金額

'ワークシート[設定]のセル番地宣言
Public Const Set_ConName As String = "B4" '工事名称
Public Const Set_ConNo As String = "B5" '工事コード
Public Const Set_Start As String = "B7" '工期始
Public Const Set_End As String = "B8" '工期終
Public Const Set_Tax1 As String = "B10" '基本税率
Public Const Set_Tax2 As String = "B11" '変動税率
2015/06/30(火) 16:19:51.35ID:GcuTOY9X
>>13
工事をConと省略せずにconstruction_xxxと書くべきだと思うが、それよりもワークシートのセル番地を固定文字列で定義するのはまずいだろう。
一行ずらしましょう、とかするときどうするの?不自由この上ない。
2015/06/30(火) 16:46:45.95ID:ybpzKx4V
Detaが気になる・・・
16デフォルトの名無しさん
垢版 |
2015/06/30(火) 18:04:04.25ID:RGb3IB+F
>>14
セル番地の固定文字列については改めて見るとすごくおかしいと思いました。
修正したいですが、皆さんワークシートやセル番地の定数はどのようにされているのでしょうか。
検索はするものの、なかなか見つけられず困っています。
>>15
気づきませんでした、すみませんありがとうございます。
2015/06/30(火) 19:44:23.68ID:4fqzjiG2
セル番地はセルに名前を付ける
列番号はenumにまとめる
シート名はconst
基本適当
18デフォルトの名無しさん
垢版 |
2015/07/01(水) 22:28:04.95ID:DXkWToqb
一日20項目ほどの数値データが入力されている月報の表を
月末にデータを全て消去して、同じWS上で次月の日付、曜日
の書き込まれた新しいフォームに更新したいのですが、
マクロで実現可能でしょうか?
2015/07/01(水) 22:31:39.26ID:jU+pvdKi
手動でやれることはたいがいマクロ化できる。
20デフォルトの名無しさん
垢版 |
2015/07/01(水) 23:04:39.40ID:DXkWToqb
やってみたけど30日までの月や31までの月などがあって
上手く行かないのです。
21デフォルトの名無しさん
垢版 |
2015/07/01(水) 23:05:37.19ID:DXkWToqb
どこかにサンプルコードでも落ちてないでしょうか?
2015/07/02(木) 02:39:59.24ID:9jOibGQm
翌日の日付が「1」だったらコードを実行するようにしたらいいんでない?
2015/07/02(木) 11:43:59.86ID:mBr3NkR3
>>18
年と月が指定されればその月の日数は求められるよ
(月だけだとうるう年があるから2月に対応出来ない)

具体的やり方は複数あるだろうけど
例えばDateserial関数で指定月の翌月のゼロ日(ツイタチの前日)を求めれば出る

2015年7月の日数を求めたらこんな感じ

Sub Test()
Dim 年指定 As Long
Dim 月指定 As Long
Dim 日数 As Long
年指定 = 2015
月指定 = 7
日数 = Day(DateSerial(年指定, 月指定 + 1, 0))
End Sub
2015/07/02(木) 13:00:55.32ID:ww5oQ+GG
>>18
フォーム更新のタイミングは?
ファイルを開いたときに自動で更新するの?
25デフォルトの名無しさん
垢版 |
2015/07/02(木) 14:46:01.74ID:AbwDTtrn
年月は、ボックスからプルダウンリストで指定
するだけです。ただ、指定年月の1〜月末までの日付、曜日を月報の1.2行目に縦に列記するコードが出来ないのです。
2015/07/02(木) 16:13:54.40ID:mBr3NkR3
>>25
こんなんでどう?
対象のワークシートと年、月、を引数に指定してコールすれば
対象のシートのA列に日付、B列に曜日を書き込むよ
年と月は省略可能で、省略すると当日の年・月を指定したとみなして処理を実行するよ

Sub test(sh As Worksheet, Optional ByVal yr As Long = 0, Optional ByVal mo As Long = 0)
Dim i As Long
Dim cnt As Long
If yr = 0 Or mo = 0 Then
yr = Year(Date)
mo = Month(Date)
End If
cnt = Day(DateSerial(yr, mo + 1, 0))
With sh
 .Cells.ClearContents
 .Columns(2).NumberFormatLocal = "aaa"
For i = 1 To cnt
.Cells(i, 1) = i
.Cells(i, 2) = Weekday(DateSerial(yr, mo, i))
Next i
End With
End Sub
27デフォルトの名無しさん
垢版 |
2015/07/02(木) 19:18:37.45ID:zxCnKqA7
何とかできそうです。ありがとうございました。
2015/07/02(木) 20:29:21.19ID:Mdba4OI7
>>14
なんやわからん英語で書かれている方がよっぽど分かりずらいので、
あくまでもEXCELマクロで使用するスクリプトなのでコメントに書いている
そのコードを外人に見せるなら英語が望ましいけど、
漢字をそのまま使えばいいかと。
工事名称等は重複してるので、設定_工事名称とかになるんでしょうかねー。

セル番地の固定値を変数で持っているのが引っかかっているみたいですけど、
メンテするときはコードのメンテも込みになるでしょうから、
変数に代入して整理してるし良いのでは?
というか、そういう風にルールを敷けばいいとおもうの。
2015/07/03(金) 08:49:41.34ID:IELcwsmr
>>28
全体を一行下にずらす、とかするとき数十個ある変数を個々にメンテするの?
工事_A = "AO1" → 工事_A = "AO2"
工事_B = "AP1" → 工事_B = "AP2"
・・・
2015/07/03(金) 14:52:04.92ID:aFtg1Cyl
>>29
それでいいと思うよ
どうやろうとしてるのか知らんけど、この手の奴は分かりやすいのが一番だと思う
2015/07/03(金) 16:20:33.62ID:L435uo00
分りやすいっていうか、直接的だから理解はしやすいけど
修正が面倒で間違いも起きやすいね
レイアウト自体の変更ではなく、全体を一気に動かすなら
最初の一要素だけ絶対アドレスで指定して
あとはそこからの相対参照(要するにオフセット)にしておくというのもひとつの手だと思う
それなら1個いじれば全部まとめて直せる
2015/07/06(月) 05:20:54.03ID:UMBaWGrv
>>31
数十行にわたるコードのメンテぐらいで不満がある程度なら、
プログラム書くのは向いていないので、長いコードは書かないほうがいいと思う。
あと、ただ一つ変えれば全部まとめて直せるコードでも、
そのコードを知らない他人から見れば、結局全部見ることになると思うよ。
本当にそれでいいのかという部分も含めてテストすることになるから。
で、結局のところ別にどっちでもいいとなる。
2015/07/06(月) 08:42:45.53ID:fhp0P+BJ
>>31
項目増えて、途中に一行追加されたら似たようなことになるでしょ
2015/07/06(月) 13:55:10.74ID:henE3y4I
向き不向きに関する思い込みだな
2015/07/06(月) 17:53:09.90ID:J6N5PkHq
>>32
数十行だろうと数万行だろうと
ひとつの変更で複数の変更箇所が出てくる構造自体のほうが問題だと思うよ

>そのコードを知らない他人から見れば、結局全部見ることになる

云々はベタに一個ずつ指定していても同じ確認コストを要するわけで
適切なコメントをつけとくなりなんなりで対応しないとしょうがないんじゃないの?

>>33
いや、だから

>レイアウト自体の変更ではなく、全体を一気に動かすなら

という前提条件をつけた上での話をしてるんだけど
2015/07/06(月) 18:38:29.56ID:fhp0P+BJ
>>35
> という前提条件をつけた上での話をしてるんだけど
そう言うケースがどれだけあるんだ?
って話でしょ
滅多にないケースに対応するために分かりにくい方法をとる必要はないよね
2015/07/06(月) 21:37:27.39ID:J6N5PkHq
>>36

表の頭にあとから表題を付け加えるとかで
全体を動かすケースってのはそれなりにあると思うよ、
仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。

それに、全体をずらすってのは>>29の発案であって俺が言い出した話じゃないんで
俺はあくまで他人から与えられた前提条件で考えただけの話
2015/07/06(月) 22:43:31.22ID:fhp0P+BJ
>>37
> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。
普通はそうでしょ?

> 俺はあくまで他人から与えられた前提条件で考えただけの話
あまりない条件だけ考えることになんか意味があるのか?
2015/07/06(月) 23:03:55.23ID:J6N5PkHq
>>38
そっちのが多いとは言ったが、全体を動かすのもそれなりにあるって言ってるじゃん
滅多にないとかありえないとかいうほどのレアケースではないよ
2015/07/06(月) 23:42:36.40ID:QbnSMTRw
>>39
> ありえないとかいう

誰もそんなことは言ってないだろ?
お前さんも認めてるように

> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多い

なら、そっちの対応を優先して設計した方がいいんじゃね?

って話
2015/07/06(月) 23:52:37.58ID:UMBaWGrv
>>37
別にセルのアドレスを固定で持ってようが、一つのアドレスに対して
相対で持ってようがどっちでもいいだろ
ケースバイケースで使い分けようとは思わないのか?

俺が言ったのは数十個(行)程度の修正から避けるために
相対座標で組んだ方が良いと思っているならプログラム組むのは
向いてないってことだよ
だから、お前は長いソースを組むような仕事は向いてないよって言ったんだよ。
せいぜい短く済むようなのを探しとけw

分かりやすいソースのほうが、修正工程の見積もりだって立てやすい
お前のいう相対座標は、その一つの絶対座標に対して成り立っているんだから
見出しが追加されてずれる程度ならいいが、途中の箇所に複数追加変更されたら
むしろ修正面倒なんじゃね?
数万も入力させるセルがあるなんてシートの設計のがおかしいと思うが
数万のセルがあちらこちら変更になるのなら簡単で見やすい定義を切っている
ほうが引き継ぎもしやすいし、修正もしやすいってわからんのか?
2015/07/07(火) 05:36:44.07ID:PlDHyacp
>>40
ああ、ごめん
「ありえない」じゃなくて「あまりない」だったか
どっちにせよレアケースではないのでそこが重要とは思わんけど

>>41
おれも「ひとつの手」だといってますよね?
ということはそれが絶対ということではないですよ。

まぁ、全部直値で指定する場合の変更コストとOffsetで記述した場合の変更コストが
それほど変わるとも思えませんが。

>>29のっぽい例で言えば
工事_A = "AO1" → 工事_A = "AO2"
工事_B = "AP1" → 工事_B = "AP2"
工事_C = "AQ1" → 工事_C = "AQ2"
・・・

というのが

工事_A = "AO1" → 工事_A = "AO2"
工事_B = Range(工事_A).Offset(0,1) → 工事_B = Range(工事_A).Offset(1,1)
工事_C = Range(工事_A).Offset(0,2) → 工事_C = Range(工事_A).Offset(1,2)
・・・

になる程度の話でしょ?

んでもって、何もわからない誰かに保守を引き継ぐのであれば表のレイアウトについてはコメントに書いておくべき物じゃないですかね?

後任の人があらかじめ何の予備知識もないなら全部の要素を直接指定しているのかそうでないか自体、
少なくともコードを全部読まなきゃ判断できないわけで、それなら相対指定で書いてもおなじことです。
2015/07/07(火) 05:42:25.10ID:PlDHyacp
やべ、工事_AだけRangeで指定してなかったし、全体をずらすだけなら
工事_B以降には変更ないわ

工事_A = Range("AO1") → 工事_A = Range("AO2")
工事_B = Range(工事_A).Offset(0,1) → 工事_B = Range(工事_A).Offset(0,1)
工事_C = Range(工事_A).Offset(0,2) → 工事_C = Range(工事_A).Offset(0,2)
・・・
2015/07/07(火) 05:48:03.16ID:PlDHyacp
さらに間違ってた
工事_AがRange型ならそれ以降にRange(工事_A)なんて書く必要なかった

まぁ、何も知らずにコードを読んで表のレイアウトを理解できるかどうかとか
表の変更にかかるコストとかには大して影響ない話だけど
2015/07/07(火) 07:47:40.19ID:yxtOW/kO
>>42
> どっちにせよレアケースではない

いや、レアケースかどうかじゃなくて

> 仕様変更で項目順の変更とか途中に項目追加とか

と比較しての話なんだが...
ひょっとして論理的な思考ができない人なの?

> 少なくともコードを全部読まなきゃ判断できないわけで、それなら相対指定で書いてもおなじことです。

セルアドレスなら一目でどこを指してるのかわかるけど、Offset( ) だとちょっと面倒でしょ?
そもそも、自分で間違えてるようじゃ説得力 0 だしね w
2015/07/07(火) 08:33:01.57ID:PlDHyacp
>>45
とにかく、コストがさほど変わらん以上、そういうことは重要ではないよね、
って言ってるんだけどそれが論理的に理解できない人なの?

んで、Offsetで(R1C1形式で)書くのがいやなら
RangeでA1形式で書けばいいじゃん
そんなの瑣末なことでしょ

あと、間違えたのは夜中にトイレで起きたときに書き込んだからで
たぶんあのときだとどっちで書いても間違えてる
(普段からR1C1形式で書くのでどっちかってーと俺はA1形式のほうが間違える)
2015/07/07(火) 08:34:48.94ID:xJTxnmtV
相対座標がどうたらというのは>>31が言い出したことにすぎないし、"AY0"とかいう文字列で指定すること自体がけしからんという意見。
2015/07/07(火) 12:53:11.67ID:yxtOW/kO
>>46
> とにかく、コストがさほど変わらん以上、そういうことは重要ではないよね

どう書いてもたいして変わらんから、ごちゃごちゃ言い出した >>29 とか >>31 がバカと言う主張なら納得

> RangeでA1形式で書けばいいじゃん

そう言う問題じゃない
Range("E3").Range("G4")
ってどこ?
ってすぐわからんでしょって話

まあ君にとってはどうでもいい話だったな w
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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