VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
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/ バカはレスしないでくれる?
個人の主張として批判せず、いたずらにある類として扱うのは極めて恣意的かおバカの批判にあらざる攻撃の特徴。
まあ、その軽蔑すべき発想で返した俺も反省はしてもよいが
はっきり言って精神病とバカの特徴でしかない論法でレスするなよ。
俺はバカと精神病きらいだからな。
おまえら、マジで精神病と思われる宣言的絶対主義の形而上学バカの一味は人類の公的な敵だとおもっているからな。
さしあたりお前らが馬鹿にされていることは科学的認識の健全性をそれなりに示すから喜ばしいがな。
それにしても、単なる知識を披露しあっているだけの時は頭良さそうなふりはできるが、
いよいよ自身の認識を問われる事態になるとここにいる連中、そこの浅さを露呈するやつ多すぎ
所詮、2chだな >>3
むしろ自分が歯が立たない相手だと分かったら「精神病と馬鹿」というレッテルを相手に貼って
逃げるお前の方がヘタレだけどな
精神病で馬鹿なのはお前の方だよ どこかわからんのでココで。
WordVBAで質問です。
あらかじめスタイルを本文内に設定しておき、
マクロで指定したスタイルが設定されている箇所を検索→
そのスタイルが指定されている場所の文章の置き換え
ということがしたいですが可能でしょうか。
スタイル名を指定して本文内を検索する、という例が見つからず困っております。 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 >>7
受信したメールを置換ってできないのでは?
置換したファイルをエクスポートするのですか? すみません、受信メールではなく、作成中のメールです。
PCからガラケーに送ると、Enter改行だと無視されてしまうので、送る前にボタンを押してShiftEnter改行に変えたいのです。
リンク付きでPCの人にも送るので、HTMLメールのまま送りたいので。 >>10
リボンの編集→置換で(ワイルドカードを使用する)^13と^11を指定すればウィンドウからはできましたが、
この機能に該当するメソッドがどうにも探せないですね。
参考にされたコードはワードのものなんですけど、OUTLOOKで使うにはちょっと無理そうです。 初心者から始め、2年ほど1人でVBA業務をしていたのですが
そろそろ引き継ぎ等も考え、コーディング規約のようなものを作成しようと考えています。
各プログラムで命名規則も違うため、統一したいのですが今ひとつ可読性の高い命名というのがわかりません。
修正前の変数宣言のコードを記載しますので、ぜひ添削していただけないでしょうか。
なお、グローバル変数宣言しているのは当時、この方法が一番良いと思ったためです。 'ワークシート名宣言
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" '変動税率 >>13
工事をConと省略せずにconstruction_xxxと書くべきだと思うが、それよりもワークシートのセル番地を固定文字列で定義するのはまずいだろう。
一行ずらしましょう、とかするときどうするの?不自由この上ない。 >>14
セル番地の固定文字列については改めて見るとすごくおかしいと思いました。
修正したいですが、皆さんワークシートやセル番地の定数はどのようにされているのでしょうか。
検索はするものの、なかなか見つけられず困っています。
>>15
気づきませんでした、すみませんありがとうございます。 セル番地はセルに名前を付ける
列番号はenumにまとめる
シート名はconst
基本適当 一日20項目ほどの数値データが入力されている月報の表を
月末にデータを全て消去して、同じWS上で次月の日付、曜日
の書き込まれた新しいフォームに更新したいのですが、
マクロで実現可能でしょうか? やってみたけど30日までの月や31までの月などがあって
上手く行かないのです。 翌日の日付が「1」だったらコードを実行するようにしたらいいんでない? >>18
年と月が指定されればその月の日数は求められるよ
(月だけだとうるう年があるから2月に対応出来ない)
具体的やり方は複数あるだろうけど
例えばDateserial関数で指定月の翌月のゼロ日(ツイタチの前日)を求めれば出る
2015年7月の日数を求めたらこんな感じ
Sub Test()
Dim 年指定 As Long
Dim 月指定 As Long
Dim 日数 As Long
年指定 = 2015
月指定 = 7
日数 = Day(DateSerial(年指定, 月指定 + 1, 0))
End Sub >>18
フォーム更新のタイミングは?
ファイルを開いたときに自動で更新するの? 年月は、ボックスからプルダウンリストで指定
するだけです。ただ、指定年月の1〜月末までの日付、曜日を月報の1.2行目に縦に列記するコードが出来ないのです。 >>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 >>14
なんやわからん英語で書かれている方がよっぽど分かりずらいので、
あくまでもEXCELマクロで使用するスクリプトなのでコメントに書いている
そのコードを外人に見せるなら英語が望ましいけど、
漢字をそのまま使えばいいかと。
工事名称等は重複してるので、設定_工事名称とかになるんでしょうかねー。
セル番地の固定値を変数で持っているのが引っかかっているみたいですけど、
メンテするときはコードのメンテも込みになるでしょうから、
変数に代入して整理してるし良いのでは?
というか、そういう風にルールを敷けばいいとおもうの。 >>28
全体を一行下にずらす、とかするとき数十個ある変数を個々にメンテするの?
工事_A = "AO1" → 工事_A = "AO2"
工事_B = "AP1" → 工事_B = "AP2"
・・・ >>29
それでいいと思うよ
どうやろうとしてるのか知らんけど、この手の奴は分かりやすいのが一番だと思う 分りやすいっていうか、直接的だから理解はしやすいけど
修正が面倒で間違いも起きやすいね
レイアウト自体の変更ではなく、全体を一気に動かすなら
最初の一要素だけ絶対アドレスで指定して
あとはそこからの相対参照(要するにオフセット)にしておくというのもひとつの手だと思う
それなら1個いじれば全部まとめて直せる >>31
数十行にわたるコードのメンテぐらいで不満がある程度なら、
プログラム書くのは向いていないので、長いコードは書かないほうがいいと思う。
あと、ただ一つ変えれば全部まとめて直せるコードでも、
そのコードを知らない他人から見れば、結局全部見ることになると思うよ。
本当にそれでいいのかという部分も含めてテストすることになるから。
で、結局のところ別にどっちでもいいとなる。 >>31
項目増えて、途中に一行追加されたら似たようなことになるでしょ >>32
数十行だろうと数万行だろうと
ひとつの変更で複数の変更箇所が出てくる構造自体のほうが問題だと思うよ
>そのコードを知らない他人から見れば、結局全部見ることになる
云々はベタに一個ずつ指定していても同じ確認コストを要するわけで
適切なコメントをつけとくなりなんなりで対応しないとしょうがないんじゃないの?
>>33
いや、だから
>レイアウト自体の変更ではなく、全体を一気に動かすなら
という前提条件をつけた上での話をしてるんだけど >>35
> という前提条件をつけた上での話をしてるんだけど
そう言うケースがどれだけあるんだ?
って話でしょ
滅多にないケースに対応するために分かりにくい方法をとる必要はないよね >>36
表の頭にあとから表題を付け加えるとかで
全体を動かすケースってのはそれなりにあると思うよ、
仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。
それに、全体をずらすってのは>>29の発案であって俺が言い出した話じゃないんで
俺はあくまで他人から与えられた前提条件で考えただけの話 >>37
> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。
普通はそうでしょ?
> 俺はあくまで他人から与えられた前提条件で考えただけの話
あまりない条件だけ考えることになんか意味があるのか? >>38
そっちのが多いとは言ったが、全体を動かすのもそれなりにあるって言ってるじゃん
滅多にないとかありえないとかいうほどのレアケースではないよ >>39
> ありえないとかいう
誰もそんなことは言ってないだろ?
お前さんも認めてるように
> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多い
なら、そっちの対応を優先して設計した方がいいんじゃね?
って話 >>37
別にセルのアドレスを固定で持ってようが、一つのアドレスに対して
相対で持ってようがどっちでもいいだろ
ケースバイケースで使い分けようとは思わないのか?
俺が言ったのは数十個(行)程度の修正から避けるために
相対座標で組んだ方が良いと思っているならプログラム組むのは
向いてないってことだよ
だから、お前は長いソースを組むような仕事は向いてないよって言ったんだよ。
せいぜい短く済むようなのを探しとけw
分かりやすいソースのほうが、修正工程の見積もりだって立てやすい
お前のいう相対座標は、その一つの絶対座標に対して成り立っているんだから
見出しが追加されてずれる程度ならいいが、途中の箇所に複数追加変更されたら
むしろ修正面倒なんじゃね?
数万も入力させるセルがあるなんてシートの設計のがおかしいと思うが
数万のセルがあちらこちら変更になるのなら簡単で見やすい定義を切っている
ほうが引き継ぎもしやすいし、修正もしやすいってわからんのか? >>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)
・・・
になる程度の話でしょ?
んでもって、何もわからない誰かに保守を引き継ぐのであれば表のレイアウトについてはコメントに書いておくべき物じゃないですかね?
後任の人があらかじめ何の予備知識もないなら全部の要素を直接指定しているのかそうでないか自体、
少なくともコードを全部読まなきゃ判断できないわけで、それなら相対指定で書いてもおなじことです。 やべ、工事_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)
・・・ さらに間違ってた
工事_AがRange型ならそれ以降にRange(工事_A)なんて書く必要なかった
まぁ、何も知らずにコードを読んで表のレイアウトを理解できるかどうかとか
表の変更にかかるコストとかには大して影響ない話だけど >>42
> どっちにせよレアケースではない
いや、レアケースかどうかじゃなくて
> 仕様変更で項目順の変更とか途中に項目追加とか
と比較しての話なんだが...
ひょっとして論理的な思考ができない人なの?
> 少なくともコードを全部読まなきゃ判断できないわけで、それなら相対指定で書いてもおなじことです。
セルアドレスなら一目でどこを指してるのかわかるけど、Offset( ) だとちょっと面倒でしょ?
そもそも、自分で間違えてるようじゃ説得力 0 だしね w >>45
とにかく、コストがさほど変わらん以上、そういうことは重要ではないよね、
って言ってるんだけどそれが論理的に理解できない人なの?
んで、Offsetで(R1C1形式で)書くのがいやなら
RangeでA1形式で書けばいいじゃん
そんなの瑣末なことでしょ
あと、間違えたのは夜中にトイレで起きたときに書き込んだからで
たぶんあのときだとどっちで書いても間違えてる
(普段からR1C1形式で書くのでどっちかってーと俺はA1形式のほうが間違える) 相対座標がどうたらというのは>>31が言い出したことにすぎないし、"AY0"とかいう文字列で指定すること自体がけしからんという意見。 >>46
> とにかく、コストがさほど変わらん以上、そういうことは重要ではないよね
どう書いてもたいして変わらんから、ごちゃごちゃ言い出した >>29 とか >>31 がバカと言う主張なら納得
> RangeでA1形式で書けばいいじゃん
そう言う問題じゃない
Range("E3").Range("G4")
ってどこ?
ってすぐわからんでしょって話
まあ君にとってはどうでもいい話だったな w >>48
全体を動かす際のコストは明らかに相対参照のほうが上で、
レイアウト変更ならどっちもどっち、って話だよ。
俺個人としては表の各要素の絶対座標よりも表のレイアウト内での相対位置のほうが
重要だと思うんで可読性は相対表記のほうが上だと思う。
もちろん、range("E3").Range("G4")とは書かないよ
だからこそのOffset表記なんであって
仮に書くなら
工事_A = Range("G4")
工事_B = 工事_A.Offset(0,1)
みたいに書けば表の中での位置関係が分りやすい(、と思うってだけなんだけどね)
んでさ、一々相手の人格攻撃するのは止さないか?
反論するのは難しくないけどめんどくさいし
貴方にとっても内容を論理的に言うこと以外に自説の説得力を増す手法なんてないよ >>49
> レイアウト変更ならどっちもどっち、って話だよ。
そんな思い込みを前提にされてもなぁ...
> 重要だと思うんで可読性は相対表記のほうが上だと思う。
> だからこそのOffset表記なんであって
応用力ないの?
> Range("E3").Range("G4")
> ってどこ?
って書いてあるんだから、レスする前に
Range("E3").Offset(3,6)
と
Range("K6")
のどっちが可読性が高いかとか考えないのか?
> めんどくさいし
君にはレスしないと言う自由があるよ
反論するのも苦労してるみたいだしね w >>50
>どっちが可読性が高いかとか考えないのか?
うん、だからOffsetのほうが読みやすいよ
>レスしないという自由
は確かにあるし
君にも好き勝手な方言を垂れ流す手段(自由や権利ではない)はあるんだけど、
こうやってきちんと反論しといたほうが良さそうなんで仕方ないからそうしてる >>51
> うん、だからOffsetのほうが読みやすいよ
へー、そうなんだー、すごいねー(棒
基準の位置と Offset の値の二個読まないといけないだけでも直書きより不利なのに、読みやすいとか笑えるわ w
あと方言とか意味不明
もう少し自分の書き込み見直した方がいいんじゃね? >>53
絶対アドレスが必要ならそうだけど
通常は表内部のレイアウトが問題なんだから
絶対アドレスは気にする必要ないよね?
それともいちいち「何々の項目はF5だ」とか気にして作業してるの?
俺は「表の1列目は@@@の項目で、2列目は***の項目だ」みたいな捉え方はするけど
絶対アドレスが必要になったことなんてないよ
変換ミスについてはまぁ申し訳ない、だけどそれは議論の結果には影響ないと思う。 >>54
> それともいちいち「何々の項目はF5だ」とか気にして作業してるの?
いちいちそんなことをしたくないから定数で定義してるんだよ
意識するのは定数を定義するコードを書く時だけ
> 絶対アドレスが必要になったことなんてないよ
Offset( ) で書くにしても、基準のセルは絶対アドレスで指定するだろ >>55
まだやるんかw
いや、基準のセルは俺も絶対アドレスで指定してますよね。
それ以外の部分では表の中での位置関係(表の何行目であるとか何列目であるとか)
についての情報のみが必要であって
それは基準セル(通常は左上端)からの相対位置が分ればそれで事足りると言ってるのです。
むしろ個々の要素についてまで絶対位置指定などしても可読性が下がるだけです。
まぁ、これはあくまでも普段からR1C1形式を好んで使ってる人間(つまり俺)の意見です。
この判断の優劣・良否・正誤等々については個々人の好みも有るでしょうから
どちらの考え方が優れているとかそういう視点での議論には決着がつかないと思いますけどね。 >>56
> むしろ個々の要素についてまで絶対位置指定などしても可読性が下がるだけです。
根拠もなしに下がるとか言われてもなぁ
とりあえず、
個人の感想です
って書いといた方がいいんじゃないか w
Excel マスターでない一般人は
>> 基準の位置と Offset の値の二個読まないといけないだけでも直書きより不利なのに、読みやすいとか笑えるわ w
だろ
> どちらの考え方が優れているとかそういう視点での議論には決着がつかないと思いますけどね。
はい、ループいただきましたぁ w
>>48
> どう書いてもたいして変わらんから、ごちゃごちゃ言い出した >>29 とか >>31 がバカと言う主張なら納得 >>57
>個人の感想です
>って書いといた方がいいんじゃないか
?
書いてますよね?
R1C1を使い慣れてる人間の意見だって。
一般人の定義がわからないけど
俺は一般人こそ表の体裁(つまり相対位置による個々の要素の関連)には気を使うけれど
その座標なんてものには関心を持たないと思いますよ。
俺自身一般人のつもりですし。
表の修正があったときに「L列から4列ずらす」ってのと
「12列目から4列ずらす」ってののどっちが分かり易いかなんて
俺に言わせりゃ一目瞭然で後者なんですけど、
あなたの言う一般人は前者を選ぶってんでしょ?
それについての価値観云々を論じることに結論が出るのかって話です。
>どう書いても
云々についてはすでに論述済みですが
全体を動かす場合には
基準セル1ヶ所のみを絶対参照で指定するほうが明らかにすぐれていますし、
レイアウトの変更であっても
Range表記で基準位置からの相対指定を用いるというのは
あくまで表の体裁の中だけに問題を帰着できるという意味で
レイアウトを記述するための手法として間違ってないと思います。
ところで、なんだか無理筋で反論続けてるように見えるのですが大丈夫ですか?
一応、われわれの議論を第三者が読んでどう判断するか
冷静に考えたほうが良いと思いますよ。 >>59
> 書いてますよね?
> R1C1を使い慣れてる人間の意見だって。
皮肉も理解できないの?
そもそもそれはその上の
>> 根拠もなしに下がるとか言われてもなぁ
にかかってるんだけど、そこはスルーなのな w
> 表の修正があったときに「L列から4列ずらす」ってのと
> 「12列目から4列ずらす」ってののどっちが分かり易いかなんて
あのさあ、反論できずに悔しいのはわかるけど、「ずらす」なんて変更がどれだけあるんだ?
って話に戻すの?
普通は、>>13 の例だと 注文書番号 を少し左に寄せたいから AO1 から AN1 に移動させてくれって言われるんじゃね?
直書きならその部分のみを AO1 から AN1 に書き換えるだけ
で、君の方法だとどうなるわけ?
可読性がすごくいいんでしょ?
示してみてよ。
> ところで、なんだか無理筋で反論続けてるように見えるのですが大丈夫ですか?
> 一応、われわれの議論を第三者が読んでどう判断するか
> 冷静に考えたほうが良いと思いますよ。
鏡見た方がいいと思うよ w >>60
>根拠
ですから、>>59とかそれ以前の>>49とか>>54とか>>56とかは
全部根拠について書いてるんですが。
意図的なスルーですか?
>普通は、>>13 の例だと 注文書番号 を少し左に寄せたいから AO1 から AN1 に移動させてくれって言われるんじゃね?
>直書きならその部分のみを AO1 から AN1 に書き換えるだけ
>で、君の方法だとどうなるわけ?
いや、オフセット一個増やすだけでしょ
ところで、注文書番号 のAOは一番右端の列っぽいのであえてそこを選んでるんですか?
たとえばB列の外注業者名がずれたら残り全部ずれると思うんですけど。
んでもってそういった場合(一番右端の要素以外の変更の場合)、
「どこどこに@@って項目を追加するから、表を**の項目から全部右にX個ずらして」
みたいな話になるんじゃないでしょうか。
どうみたってオフセットのほうが簡単じゃないですか。
>鏡見た方がいいと思うよ
もちろん、俺は第三者を意識して書いてるので問題ないです。
貴方もそれで良いならこれ以上とくに言うべき事も有りません。
なお>>61は打ち間違えて送信しちゃいました。
たびたびスマン >>62
> ですから、>>59とかそれ以前の>>49とか>>54とか>>56とかは
> 全部根拠について書いてるんですが。
レス番で書かれてもわからないので、該当の箇所を引用してみて
> いや、オフセット一個増やすだけでしょ
で、それが本当に AN1 を指してるのかどうやって確認するの?
可読性がいいんだから一目でわかるんだよね?
早く示してみてよ。
> ところで、注文書番号 のAOは一番右端の列っぽいのであえてそこを選んでるんですか?
一番最初の項目を選んだだけですよ
> みたいな話になるんじゃないでしょうか。
またその話?
>>37
> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。
って書かれてますよ。
> 貴方もそれで良いならこれ以上とくに言うべき事も有りません。
人のことをとやかく言う前に...
> なお>>61は打ち間違えて送信しちゃいました。
落・ち・着・け・よ それよりParamArrayが参照渡しできないのはなぜなんだせ? >>63
>該当の箇所を引用してみて
>>俺個人としては表の各要素の絶対座標よりも表のレイアウト内での相対位置のほうが重要だと思うんで
可読性は相対表記のほうが上だと思う。
>>絶対アドレスが必要ならそうだけど通常は表内部のレイアウトが問題なんだから絶対アドレスは気にする必要ないよね?
>>表の中での位置関係(表の何行目であるとか何列目であるとか)についての情報のみが必要であって
それは基準セル(通常は左上端)からの相対位置が分ればそれで事足りると言ってるのです。
>>俺は一般人こそ表の体裁(つまり相対位置による個々の要素の関連)には気を使うけれど
その座標なんてものには関心を持たないと思いますよ。
以上、大体全部同じことの繰り返しですが、この辺が俺の主張する可読性に関する意見の根拠です。
本文長すぎるんで続きます。 >>65の続きです
ただ、ここに来て根本的な部分の食い違いを実感してるのですが、
>それが本当に AN1 を指してるのかどうやって確認するの?
>可読性がいいんだから一目でわかるんだよね?
というあなたの指摘自体が俺の考えている可読性の概念とは食い違ってます。
あなたは結局シート内でのセルの絶対位置指定やその確認でしか可読性を考えていないようで
俺は逆にそんなものにはこだわらず表のレイアウト中での位置指定という視点で可読性を捉えているわけです。
あなたのやり方は確かにあなたの言うようなシチュエーションでは有効でしょうが、
逆にここまでで俺の主張したようなシチュエーションでは可読性やメンテナンス性が劣るということになります。
たとえばこれですけど
> 仕様変更で項目順の変更とか途中に項目追加とかのほうが多いだろうけど。
途中に項目追加したらそこから先は全部ずれるでしょ?
(よほどスカスカの表なら別ですが、それなりに埋まってる表の場合にはそうならざるを得ません。)
そうするとセルアドレス全部直さなきゃならなくなります。
その場合には全部同じ変更(当該変更箇所を一律にオフセットずらす処理)
で対処できることってメンテナンスには大きなアドバンテージだと思いますよ。
まさか普通の業務ってのがスカスカの表でセル一個だけ変更する作業ばかりだなんて虫の良い事言わないですよね?
実際俺んとこじゃあこういう多数のセルを移動するような業務ばかりなんで俺にとってはそっちのほうが普通なんですよ。
>落・ち・着・け・よ
まぁ、打ち間違いとか変換ミスは良くやっちまうんでスミマセンとしか良いようないけど
重要なのは主張の論旨であってそれは読み手側にある程度の知識があれば
変換ミス程度は何がいいたいのか読解できるだろうからまぁ別にいいかなと思ってます。 >>65
根拠頂戴って言ったら
> >>俺個人としては表の各要素の絶対座標よりも表のレイアウト内での相対位置のほうが重要だと思うんで
> 可読性は相対表記のほうが上だと思う。
〜と思うってどこが根拠なんだよ... w
単なる君の意見でしょ
>>66
帳票って見たことないの?
結構スカスカだよ
例えばこんな奴
https://garage.plus.co.jp/guide/estimate/image/egd_itm_1.gif
表の部分は元々複数出力するので VBA でループ回すから位置を変えるのは問題ない
ありがちなのは会社名とか見積もり番号の位置を変えたいとかで、他に影響することはあまりない >>67
いや、それ言い出したらあなたの主張だって単なる個人の意見ですよ
たとえば帳票はスカスカだってのがあなたの意見なわけですが
そういうのじゃない表だってあるんですよ
ウチは科学技術系の職種でして
縦に時系列、横に計測項目(たとえば気温だったり風速だったり)で
複数の計測データをズラズラと並べるんですが
計測するパラメータが増えたり減ったりするんで表のレイアウトが変わるわけです。
そうすると一気に複数個所いじるのが当たり前になるわけです。
これってこっちの業界じゃあ結構当たり前のことで、
そういう時に絶対セル指定なんて使いづらくてやってらんないですよ。
あなたの主張が普遍的意義を持ってるならともかく、
こういう明らかな反例がある以上、
俺の根拠のみを私的意見だと言い切る資格はあなたにはないです。 Word VBAで [Shift+Enter] を押したとき、「Chr(11)」が入るみたいだけど、これって何なんですか?
アスキーコード一覧だとVertical Tabulation(垂直タブ)って書いてあるけど、
MSDNだと「タブ文字 (縦)。Microsoft Windows では使用できません。」って書かれててよく分からないんだけど、
Windows OSでは使わないけど、word(VBA)だと使ってる文字コードだよってこと?
wordもwindows版だから、Windowsでは使用できませんってのがよく分からないんですが・・
MSDN
ttps://msdn.microsoft.com/ja-jp/library/cc392241.aspx
アスキーコード一覧
ttp://e-words.jp/p/r-ascii.html >>68
> いや、それ言い出したらあなたの主張だって単なる個人の意見ですよ
残念ながら違う
例えば...
> 基準の位置と Offset の値の二個読まないといけないだけでも直書きより不利
これには事実しか書いてない
俺の意見ではない
また...
> たとえば帳票はスカスカだってのがあなたの意見なわけですが
のようにスカスカに感じるかどうかは個人差があるから、実際の例を出してる
スカスカに思うかどうかは実物を見た人が決めればいい
> そういうのじゃない表だってあるんですよ
それはあると思うが、>>13 の帳票が...
> 計測するパラメータが増えたり減ったりするんで表のレイアウトが変わるわけです。
とは全然違うことぐらいはわかるだろ?
また、どっちの帳票が世の中に多いかもわかるだろ?
あと、時系列で入力するってことは複数の行を扱うんだろ?
>>67 にも書いたけどそう言う奴は普通 VBA のループで処理するから、元々絶対アドレス云々の話じゃないと思うんだが >>70
>これには事実しか書いてない
それ以前の前提条件として絶対アドレスを取得する必要があるかどうか
絶対アドレスでの指定が有効かどうか
といった論点が抜けてますよ。
あとわたしがスカスカに対比して問題にしてるのは
つまり他の箇所を巻き込んで移動させる必要が
生じるかどうかを区別していってるのであって
見た目がどうこうの問題ではありません。
複数個所を同時に変更するかどうかです
さすがにそのぐらいは前後の文脈から汲み取っていただかないと困ります。
どうにもご自分の土俵のみで話を進めようとしてらっしゃるようですが
どちらが多いかはともかくとして
(実際のところ世の中に技術系の業種とそうでない業種がどれぐらいの割合で存在してるかなんて知りません)
それにしたって>>36でいわれるような「滅多にないケース」というほどではないでしょうから
それについての言及はあってしかるべきです。
念のため指摘しておきますが
パラメータの増減は列方向ですしループ云々とは関係ないですよ >>71
> それ以前の前提条件として絶対アドレスを取得する必要があるかどうか
だから相対の方が可読性が高いと言うなら、実例と根拠を出せばいいだけのこと
> 複数個所を同時に変更するかどうかです
個々の項目の細かい位置調整っ言うのは珍しくないよ
> どうにもご自分の土俵のみで話を進めようとしてらっしゃるようですが
何回も書くけど、見積書等の帳票と君のところの Excel シートみたいなのどっちが多いと思う?
> どちらが多いかはともかくとして
重要だけど不利だからスルーするってこと? w
> (実際のところ世の中に技術系の業種とそうでない業種がどれぐらいの割合で存在してるかなんて知りません)
技術系の業種でも会社なら見積書とか納品書とかの帳票はあるんだよ
> それにしたって>>36でいわれるような「滅多にないケース」というほどではないでしょうから
そこまで言うなら、どれぐらいあるんだ?
根拠とともに示してくれよ
> 念のため指摘しておきますが
> パラメータの増減は列方向ですしループ云々とは関係ないですよ
いや、少なくとも行方向はループで処理するから元々絶対アドレスでは無理だろ
そう言う状況なら列側も相対にするのは珍しくない
ただし、今回の話とは状況が違うからあまり参考にならないって話 >>72
>重要だけど不利だからスルーするってこと? w
>そこまで言うなら、どれぐらいあるんだ?
>根拠とともに示してくれよ
何でこっちにばかり立証責任があるんでしょうか?
あなたが具体的な根拠を示してくださいよ
データ処理系の表なんて日本中の研究機関その他で当たり前に動いてますんで
この辺はどっちが多いとか少ないとか証明するのは無理だと思います
ですので俺は遠慮しときます
>いや、少なくとも行方向はループで処理するから元々絶対アドレスでは無理だろ
データの頭にヘッダってのが付いてるときにループ開始行が変動するってのも割りとよくある話なんで
そこはやはりループ無関係ですよ
てかあなたこっち系の話知らないだけじゃないですか?
>ただし、今回の話とは状況が違うからあまり参考にならないって話
「今回の話」ってのを勝手に局限されても困るんですけど。
表の位置指定について話してたのに
その中で絶対アドレス指定が有利な状況ばかりに
限定して話を進めないでもらえますか?
それが多いとか少ないとかを論拠にするのは
あなたがきちんと証明してからにしてくださいね >>69
> Word VBAで [Shift+Enter] を押したとき、「Chr(11)」が入るみたいだけど、これって何なんですか?
どこでShift+Enterを入力して、それがChr(11)だと確認した方法を教えて。 >>73
> あなたが具体的な根拠を示してくださいよ
書いてあるでしょ?
>> 基準の位置と Offset の値の二個読まないといけないだけでも直書きより不利
> データ処理系の表なんて日本中の研究機関その他で当たり前に動いてますんで
うん、その研究機関とかが日本中の企業より多いといいね w
> この辺はどっちが多いとか少ないとか証明するのは無理だと思います
君には無理だろうから遠慮するのは正解
企業統計とか研究機関の数って公表されてて、ざっくり研究機関が 8,000件、会社は 280万社ぐらいと言うことぐらいは覚えていても損はないよ
> データの頭にヘッダってのが付いてるときにループ開始行が変動するってのも割りとよくある話なんで
で?
普通に組んでいたら開始行を変えるだけでしょ?
> そこはやはりループ無関係ですよ
まさかベタ書きしてるの? w
> 「今回の話」ってのを勝手に局限されても困るんですけど。
元々、>>13 の話
コメント見る限りは注文書の入力用シートの話であることぐらいは理解しようよ >>74
wordで文章の途中でShift+Enterを入力して、
文章を全部選択した状態で、
マクロで↓みたいなのやったら置換されました。
Sub ReplaceSample()
Selection.Text = Replace(Selection.Text, Chr(11), "改行")
End Sub >>77
>これって何なんですか?
WordでSHIFT+Enterを入力したときに入る文字です
>MSDNだと
そのページはVBAのページではありません
VBScriptで定数vbVerticalTabが使えないと言ってるだけです >>79
VBAのページでも同じこと言ってるよ
ttps://msdn.microsoft.com/JA-JP/library/office/gg278800.aspx >>80
英語のページだとNot usefulって書いてあるのか
使ってはいけないと言う意味での「使えません」じゃないって事だな
まあ、実際にWordで使ってるんなら使えばいいんじゃね >>69
なんなですか?
って言われても、VT のコードって言うしかない
そのコードをどのように解釈するかはアプリケーション次第 >>75
もうやめとけ。
そいつは長いコード書いちゃいけないって俺は言っただろ。
そのうち事故るよ。 >>81-82
んじゃあ「Chr(11)」はタブ文字 (縦)ってことで、それ以上でもそれ以下でもないということですね。
ありがとうございました。 MSOfficeのパワーポイント2013のVBAについて、助言をお願いします。
現在、フォーマット修正用に、色々と文字列置換のVBAを作っています。
しかし、shape単位で置換を行うのですが、shape内のフォーマットが全て最初の文字のものになってしまいます。
ctrl+Hキーでできる置換のように、フォーマットを変えずに文字だけ置換する方法があれば教えて下さい。
よろしくお願いします。 すいません、勘違いがありました。問題なく出来ました。 OWCのグラフで値が空のとこを非表示にするにはどうしたらいいですか? PowerPointでpptxを開いてPDFで保存するvbscriptを
書いたんですが発行中ダイアログが出てしまいます。
これを出ないようにする方法はないでしょうか? VBScriptのスレって池沼みたいな変なコテハンがいて関わりたくないのよね >>89
試しにパワポにマクロでPDF出力を作ってみましたが
別に何も出ませんでしたよ?
Office2013ですけど。 >>93
このソースだと出てしまいます。何か違いますでしょうか?
Option Explicit
Dim inFilePath
inFilePath = Wscript.Arguments(0)
Dim outFilePath
outFilePath = Wscript.Arguments(1)
Dim objPowerPoint
Set objPowerPoint = CreateObject("PowerPoint.Application")
dim pre
set pre = objPowerPoint.Presentations.Open(inFilePath, false, false, false)
dim wdFormatPDF
wdFormatPDF = 32
call pre.SaveAs(outFilePath, wdFormatPDF )
objPowerPoint.Quit()
Set objPowerPoint = Nothing >>94
どうもです
こちらへ誘導したExcel総合相談所 119の171です
私パワポ持ってないんで確認できないんですけど、組み込み定数の違いってなにか関係ないですかね?
■[Tips]PowerPoint 2010 のPDF変換機能を利用して、Powerpointを起動せずにPDFに変換するVBSスクリプト
http://d.hatena.ne.jp/nagasama/20110310/1299772579
をみると
パワポのファイルフォーマットでPDFをあらわすのは"ppSaveAsPDF"(=32)で、
貴方のコード中の"wdFormatPDF"(=17)はワードのファイルフォーマットでPDFをあらわすものみたいですよ
参考までにマイクロソフトのリファレンスもどうぞ
PpSaveAsFileType 列挙 (PowerPoint)
https://msdn.microsoft.com/ja-jp/library/office/Ff746500.aspx
Wdsaveformat クラスの列挙 (Word)(機械翻訳)
https://msdn.microsoft.com/ja-jp/library/office/Ff839952.aspx
ぜんぜん見当違いだったらごめんなさい >>94
よくみたら組み込み定数じゃなくて変数で宣言してましたね
見当違い以前のはなしでした
本当にごめんなさい >>94
93ですけど、そのソースをコピペしてコマンドプロンプトから
実行してみましたが、家の環境(Win10)では普通にPDFできますよ?
ダイアログも出ませんでしたよ。
実行した時はスライド1枚の軽いPPTでやったのですが、
94さんは、もしかしたら結構スライド数多いPPTだから出るんですかね? 出てるダイアログが再現できないので、わからないのだけれども
↓のプロパティでどうにもならないんだとしたら、諦めるしかないのかも。
Application.DisplayAlerts
ttps://msdn.microsoft.com/ja-jp/library/office/ff746503(v=office.15).aspx >>97
スライド数は20くらいでしょうか。
>>98
試してみましたが残念ながら出てしまいました。
困りました。 Windows10でie操作のマクロって動くのですか?
edgeは互換性あるわけでは無いですよね。
別にインストールするのですしょうか。
これでクリエイトするオブジェクトです。
CreateObject("InternetExplorer.Application") Windows10でもieは入っているようです
ttp://simply-assi.com/windows10ie/
なら 操作は可能でないかな?
Windows10持ってるなら テストしてみるべし
自分は Win8.1だから無理だけど >>101
自分も実機がないのよね。
ieが残ってるいうのは聞いてるんだけど、7や8からのアップデートでも、10のクリーンインストールでも何の設定もしないでも動くのかなと。
テストしてる人とかいないかな? 仮想用に買った10のUSBが今日届くから環境作り次第ObjIE試してみますん 受ける会社大丈夫?
下記の条件が全て当てはまる会社にご注意下さい。
・IT系 in tokyo
・「社名 労基」でググると過去の2chスレが出てくる
・転職会議で2.5点 >>106
縦軸と横軸を入れ替えたいのです。
画像として90度回転させたいわけではないのです。 >>107
>>105は1枚めの画像を左に90度回転させ2枚めの画像としています。
現在、エクセルで1枚目のようなグラフがあるのですが、
縦軸と横軸を入れ替えたような(2枚目画像のような)グラフをエクセルで作りたいのです。
自分なりにいろいろ試したのですができませんでした。 >>108
入れ替えたグラフを既に作っているじゃないですか?それで完成しているのでは? >>110
ああ、ごめんなさい。
>>105の2枚目の画像は1枚目の画像を画像ビューワーソフトで左回転させたものなんです。
2枚目のようなグラフをエクセルで作成したいんです。
(今は1枚目のようなグラフをエクセルで作った段階です) 改めて質問させてください。
エクセルで↓のようなグラフがあります。
http://i.imgur.com/BeOZor7.png
このグラフの縦軸と横軸を入れ替えたグラフを(エクセルで)作成したいのですがやり方がわかりません。
作成したいグラフのイメージは↓のようなものです(この画像は画像ビューワーで作成したものです)
http://i.imgur.com/7gXPOFG.png
わかりづらくてすみません。 >>113
Excel グラフ 回転
でググるとやり方でてくるけど、これじゃ駄目? >>114
今エクセルを試せる環境ではないので検索してみた結果を眺めたところ、
線グラフや面グラフの縦軸と横軸の反転は非常に難しそうな印象を受けました。
難しいというか無理やりというか。
そこまでの労力をかけないと望む結果が得られないということはなんとなくわかりました。
そうであるならば現状を受け入れるしかないのかと思っております。
今回は諦めます。ありがとうございました。 >>113
Excelの質問かよ…
じゃあなんでExcelの質問スレじゃなくてここで質問するんだ
後出し条件出してくんなカス >>117
あ〜〜VBA質問スレか・・・
すいません誤爆というかなんというか全く気づかず・・・ 某サイトへのアクセスを1日1回、定時に行うためにIE操作を行うマクロを作っています。
必要な情報を取得した最後にそのサイトをログアウトしてIEを閉じたいのですが、ログアウトをしたときにJavascriptから?のログアウトしましたとの情報メッセージが表示されます。
ググッて調べたところ、以下の様な感じで閉じられるとあったのですが、SendMessageだけがうまくいきません。
ハンドルの値は入っています。
IE11を使っていますが、仕様が変わったのでしょうか?(Windows Updateでの最新)
このメッセージを閉じないとその後の閉じるためのVBAは進んでいるものの、実際の動作をしてくれなくて困っています。
(手動でメッセージを閉じたらその後のIEを閉じる操作が終わった状態にまで一気に進む)
わかる方いましたら教えて下さい。
Const WM_COMMAND As Long = &H111
hWnd = FindWindow("#32770", "Web ページからのメッセージ")
If hWnd <> 0 Then
Rtn = SendMessage(hWnd, WM_COMMAND, vbOK, 0)
End If >>120
値は取得できてます。
これが本当にメッセージのハンドルなのか調べ方を知らないので合ってるかは分かりません。
FindWindowも間違ってないと思うのですが、こちらも調べてみます。 WM_COMMANDの右2つの引数の指定の仕方が間違ってるのと
有効なウィンドウハンドルかどうかはIsWindowで取得できる Rtn = SendMessage(hWnd, WM_COMMAND, 2, 0)
でうまく閉じてくれました。
>>122さんレスありがとうございます。 質問が2つあります(長文すみませんm(_ _)m
○1点目:vbaを用いた自動化でdiv要素だけのボタンを押す方法
作業->ウェブのあるサービスにログインし、一定の操作をしてからログアウトする
問題->idとpassの入力はできたが、ボタンが押せない
構造的には下記アドレスのログインフォームと似ていて
ttp://codepen.io/andrejmlinarevic/full/NGGdVv/
上記例の<button class="btn">Login</button>のような
button要素がなく、div要素のみで設計されています
javascript関係かと思い.fireEventや.Script.setTimeoutを調べてみたのですが
div要素には実行されるjavascriptやそのfunctionなどは何も無く、class名だけ書かれています
○2点目:ieオブジェクトのdocumentがローカルウインドウから参照出来ない
上の質問と関係し、ieオブジェクトのdocumentの中身を見ようとしたのですが
document以下が<変数なし>となっており参照出来ません
調べるとskydriveのadd-onを入れる、shellから持ってくる等情報がありますが、いずれでも解決出来ませんでした
なお<変数なし>とは出ていますが、debug.print ie.document.titleなどとすると中身は出力されます
環境
Windows8.1 pro 64bit
excel 2013 32bit:参照設定MS Internet Controls/MS HTML Object Library/OLE Automation
Visual Basic For Applications/ MS Excel 15.0 Object Library/ MS office 15.0 Object Library
ie 11 64bit(32bitでも変わらず) パワポでソフトトーク使いたいんだけど『開発』タブ出すところまではできてもVBAでマクロを記述〜っていうのができない。インポートするファイルの在り処か作成法を情弱にも理解できるように教えてほしい… 127
Visual Basicのウィンドウは出てきたしテキストもコピペしたけど
wavが自分のファイルに保存されない。
マクロ実行しても何も起こらずウィンドウが閉じるだけ。パワポのファイルにも音源は見当たらない。 >>124
1点目はソースがないとなんとも。
2点目はHTMLDocumentあたりで定義したオブジェクト(変数?)にSetしてやれば参照できるよ。
理由はしらんがie.Documentみたいなままだと参照できない。 >>128
何をしてどうなったのか具体的に書いてもらわないとわかりません
パワポにマクロを組み込んで、softTalkのパスを指定して
スライドのノートに文章を書いて、マクロ実行、までは出来たという理解でOK? >>129
レスありがとうございます
2点目はアドバイスの通り、set objDoc = objIe.Document.allとかしたら中身読めました。ありがとうございます!
1点目は情報少なくて申し訳ないです
業務用なので詳細は一部フェイク入れますが、htmlにはinputタグがあるだけで
<input id="id" class="input-text" type="text" ime-mode="disabled"></input>
はあるのですが、idとpassを入れた後に押すボタンが
<div class="btn-control-outer">
<div class="btn-control-inner">
<div class="btn-control-message">OK</div>
</div></div>
というタグだけで作られています
(なおこのタグはjsで動的に作られているようで、IEの要素チェックで確認したものをコピペしています。ソースだとこのタグがありません)
リンク要素のように.clickが出来るものがなく、setTimeOutするにも、タグの中にjavascript:alert();のような記述も見当たりません
トップページのソースでjsを外部参照していたので、改行がないjs(minify化?)ファイルを読み解いていますが
上のdivタグとどうに関係しているのかわからず詰まっている状態です。 途中だった
For Each tag In ie.Document.getElementsByTagName("div")
if tag.ID = "aaa" Then
tag.Click
end if
Next
でクリックできた。
そちらのサイトでも動くんでないか? パワーポイントで、すべてのシートについて青い文字だけを黒い文字に変換するようなマクロを
作っていただけないでしょうか。 >>132
アドバイスいただいた方法で出来ました!
div要素をclick出来るとは思っておりませんでした。
本当にありがとうございます。
その後の処理も上で>>119さんのやりとりから調べて目的とする動作が出来ました
合わせて感謝します。 >>135
こちらもdivがボタンにできるのを初めて知ったので勉強になったよ。
ちなみに119もオレw access2013でフォームからの入力期間の金額を集計してレポート作成をしようとしています。
vbaでレポートボタンを押下した動作と同じコードは存在しますでしょうか。 レポートボタンってのが何の事かわからんが DoCmd.OpenReport使えとかそういう事か?
とりあえずACCESS VBAはそれ用のスレがあるからそっちで聞け >>134
すべてのシートの、
すべてのテキストの文字色を、一つずつ調べていき、
(または、1文字ずつ調べながら、)
もしそれが青なら、黒に変更する パワポのVBAでお願いします。
ファイル→情報→メディアの圧縮
わVBAからやりたいのですがどのオブジェクトのどのメソッドからやればいいのかわかる方いたら教えて下さい。
音声ファイルの圧縮がやりたいのです。 141507
140712
140715
141512
141207
141215
140708
140709
141508
140807
140703
141509
140815
141503
141208
140907
140315
141209
140915
141203
競馬の三連単の買い目がこのようにある時、マークシート記入枚数を減らすために
14-7,12,15-3,7,8,9,12,15
14-8,9-7,15
140315
とまとめたいのですが、どのように処理すればよいでしょうか?
いずれは金額も考慮したいと考えていますが、現段階では難易度を下げるために同一金額としてください。
同じ理由でここでは頭を固定で例を作成させていただきました。
よろしくお願いします。 >>142
VBA関係ないじゃん
書き込むスレ間違ってるよ >>143
他にそれらしいスレがみつからなかったことと、この買い目を出す処理をVBAで行っているのでここで聞いたのですが
適切なスレがありましたら移動しますので、誘導願います >>144
ごめん、>>1 読む限りだとこのスレで問題なさそうね…
すまんかった でもEXCEL VBAに行ったほういい気がする
どうせEXCELだろ >>142
そういうのはアルゴリズム系スレの方が受けがいいかと
あんま言語関係ないし
データ構造,アルゴリズム,デザインパターン総合スレ 2
http://peace.2ch.net/test/read.cgi/tech/1362301811/ EXCELのVBAでインデントされたとりあえず下のようなXMLを作成したく
http://blogs.yahoo.co.jp/ke1_thanks/folder/929993.html?m=lc
を参考に作成してるのですが、うまく孫要素が作成できません。
どうすれば孫要素が作成できるのでしょうか。ご教示お願いします。
また何と調べればいいのかを教えていただければ幸いです。
環境 windows7 64bit と32bit両方
Excel 2010 64bit と32bit 両方
作成したいXML(括弧は半角だとうまく書き込めないみたいなので全角にしてます)
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<ROOT>
<TITTLE>DQ5</TITTLE>
<CHARACTER>
<PERSON>
<NAME>パパス</NAME>
<HOBBY>女装</HOBBY>
<COMMENT>ぬわーーっっ!!</COMMENT>
</PERSON>
<PERSON>
<NAME>ゲマ</NAME>
<HOBBY>メラミ</HOBBY>
<COMMENT>ほっほっほっほっ。子を思う親の気持ちは いつみても いいものですね。</COMMENT>
</PERSON>
</CHARACTER>
</ROOT> >>152
vba xml 生成 とかでググるといくらでもやり方はヒットすると思うけど
具体的にどんなコードのどこで行き詰まってるのか書いてくれないとアドバイスしようがない <CHARACTER>が</CHARACTER>で作成されてしまい、閉じてくれません。また<PERSON>などが孫要素になってくれません。
コードはこんな感じです。
http://pastebin.com/CVVKVnYF
作成されるXMLは↓です。
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<ROOT>
<TITTLE>DQ5</TITTLE>
<CHARACTER/>
<PERSON/>
<NAME>パパス</NAME>
<HOBBY>女装</HOBBY>
<COMMENT>ぬわーーっっ!!</COMMENT>
<PERSON/>
<NAME>ゲマ</NAME>
<HOBBY>メラミ</HOBBY>
<COMMENT>ほっほっほっほっ。子を思う親の気持ちは いつみても いいものですね。</COMMENT>
</ROOT> >>154
> 'ノードとして子ども・孫の要素を追加
>Set elem2 = rootelem.appendChild(myxml.createElement("CHARACTER"))
> Set elem2 = rootelem.appendChild(myxml.createElement("PERSON"))
>
> 'ノードとしてひ孫の要素を追加
>Set node = rootelem.appendChild(myxml.createNode("element", "NAME", ""))
> node.Text = "パパス"
rootelemにしか子供追加してないから、孫、ひ孫が生成されないのは当然な気がする
追加した子要素に子供を追加してやらなくちゃ…
試してないけどこんな感じ?
'ノードとして子ども・孫の要素を追加
Set elem2 = rootelem.appendChild(myxml.createElement("CHARACTER"))
Set elem2 = elem2.appendChild(myxml.createElement("PERSON"))
'ノードとしてひ孫の要素を追加
Set node = elem2.appendChild(myxml.createNode("element", "NAME", ""))
node.Text = "パパス" ThisWorkbook.Save
で「指定したディメンションは、このグラフの種類では無効です。」のエラー発生。
エラーが出るときと出ないときがある。
VBAでグラフを操作している部分もあるが、それとは無関係と思われるSaveでこのエラーに戸惑っています。
↓このサイトで、SaveAsで存在しないパスを指定し同様のエラーが出た事例は見つかりましたが私はパス指定していません。
http://yaplog.jp/purplish-blog/archive/1838
エラー回避する方法を教えて下さい。 >>156はエクセルの話です
win7, office2010 VBA内でセル指定をするときにシート名を明記しないと
そのセルがアクティブシートのセルになってしまってエラーが出ることがあるけど
VBAでグラフを作成するプログラムを作成していますが、エラーがでます。エラーの... - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1486687089
ぷぎえもん日記 VBA:実行時エラー1004グラフを作る時のエラーについて
http://pugiemonn.blog6.fc2.com/?m&no=985
その辺は大丈夫? >>155
うまく行き作りたいものが作れました。ありがとうございます。 >>159
レスありがとうございます。
今出先なので明日帰宅してから確認してみます。 あ、書き込めた。規制かかっててレスできず申し訳ないです。 既存のブックに入れているマクロは正常動作しているんだけど、2,3日以前から作った
ブックは
オートメーションエラーです。
例外が発生しました。
ってエラーですぐ落ちてしまうんだけど、これって何が原因なんですかね。
(OS Win7Home excel2010)
なんせ、
Sub test()
MsgBox "test"
End Sub
ってだけのでも同じエラーで落ちてしまうんで┐(´∀`)┌
ちなみにウィルス対策はAVGでチェックかけて異常なしではありました
http://www.dotup.org/uploda/www.dotup.org790841.jpg >>156
「vba 指定したディメンションは、このグラフの種類では無効です。」で検索!
>>163
「vba オートメーションエラー」で検索! Declare 文でDllを指定するとき、絶対パスを指定するのとしないので挙動が変わるなんてことありますかね?
パスの通ったフォルダにDllを置きDeclare文にはパスを書かない、という状態で何度テストしても失敗する(結果がおかしい)ので、
もしやと思って絶対パスを指定してみたら成功しました。何度やっても同じです。
念のため他のフォルダに同名のDllがないか確認しましたが、そんなものはありませんでした。
Window7、Excel2010(64bit)です。 下記プログラムでデータ貼り付け可能ですが、
Range( どんな dll 使って、
どう失敗するのか
とかじゃね? >>167-170
DLLはこんな感じで
Declare PtrSafe Function funcABC Lib "ABC.dll" (ByVal n As Long, ByRef v As Variant) As Long
本来1が返ってくるべきところに0が返ってくるんです。
だけど、〜 Lib "C:\tmp\ABC.dll" 〜 とすると、ちゃんと1が返ってくる。
どちらの場合もDLL名を変えると「ファイルが見つかりません」という実行時エラーになるので、同じDLLファイルを
指しいてるのは間違いないと思います。 >念のため他のフォルダに同名のDllがないか確認しましたが、そんなものはありませんでした。
限りなくこれが怪しいと思うんだが >>165
同名のdllが無いことをどうやって確認した? >>175
パスが通っている全フォルダとカレントフォルダからの目視です。
環境変数(PATH)をまず確認して、
kernel32.dllにあるAPI 「GetEnvironmentVariableA」 に引数"PATH"を渡して出てきたフォルダを対象にしました。
問題のfuncABC も GetEnvironmentVariableA も同じVBAから発行しています。 カレントフォルダをどうやって確認したかとか
システムディレクトリにdllがないかとか
まあ、確認漏れ自体はいっぱいありそうだな >>178
C:\windowsやC:\Program Files、C:\Program Files (x86)は入ってますよ。
目視も検索フィルタにとりあえず *.dll で全DLLを出してからやっています。
>>176
マジですか... >>179
本当にひとつしかないならあり得ない挙動だと思うけど。
dllの内容を明かしてみな。 Windows が使用する DLL 検索パス
1.実行中のプロセスの実行形式モジュールがあるフォルダー。
2.現在のフォルダー。
3.Windows システム フォルダー。このフォルダーへのパスは、GetSystemDirectory 関数が取得します。
4.Windows ディレクトリ。このフォルダーへのパスは、GetWindowsDirectory 関数が取得します。
5.環境変数 PATH 内に記述されたフォルダー。
https://msdn.microsoft.com/ja-jp/library/7d83bc18.aspx >>177
ウインドウズの検索機能を使ってみたら? 何か仕事でもしながら、ディスク全部の範囲で、検索すればいい windows なら黙って search everything 入れろ
考える余地なし >>179
> 目視も検索フィルタにとりあえず *.dll で全DLLを出してからやっています。
プログラマーに向いてないんじゃね?
コマンドプロンプトで
dir /s /b \ABC.dll
ってやればいいだけだろ >>180
ODBCのコネクションを張る関数で、特に自分の場所が関係する処理はしてないですね。
>>181-186
全ドライブを検索した結果(search everythingは入れてませんが dir/s はやってみた)
C:\Users\*****\Google ドライブ\
に見つかりました。
しかし、これを消しても現象は変わらなかった(もともと参照パスに入ってない)ので、諦めの気分です。 元々の質問は、挙動が変わることがあるか?で、
あるって回答で解決だと思うけど、どうしてもないってことにしたいの?
ゴールが見えないよ >>188
あるって回答(>>176)もあり、ないって回答(>>180)もありで、判断がつかない状況です。 それと、>>173と>>176もいまいち理解できておりません。
「dllのパスを取得」とは、実際の存在はひとつでもDeclare文での指定のしかたまでも検知できるんでしょうか? まさか、パス・ユーザー名など、システムに関係する部分に、
日本語を使ってないだろうな?
それで、バグってるとか? そのDLLの作者が外人で、DLL内で、パス・ユーザー名を扱っていた場合、
もしその中に日本語が入っていれば、バグるかも >>187
>ODBCのコネクションを張る関数で
それなら、そのDBのメーカーが(ドライバーが)、絶対パスしか許可していないのかも。
相対パスの危険性も考慮して、そういうアクセス許可にしているのかも
絶対パスを使えばいい >>187
> 特に自分の場所が関係する処理はしてないですね。
ん?
自分で作った dll なの?
だったら自分でデバッグしなよ 全ドライブを検査してひとつしかdllファイルがなかったって言ってるんだろ。
それが本当なら何も対処できないよ。OSレベルの不具合。 VBAをコーディングするのに最適な画面サイズとモニターの台数は何台ですか?
縦と横どっちでつかってすか?
4Kディスプレイはどうですか? エクセルのVBA質問があります。
一番前のTOTALシートのA22:H26までを複数シート(20シートくらいある)の最終行の次の行に貼り付けたいのです。
各シートの最終行はバラバラで多いのは数千とあります。
しかも、G列には\と$の通貨マークH列には金額が書いてあり、SUMIFが組んであります。
記録マクロでやると下記みたいになりますが、こんなこと可能なのでしょうか?
調べても出てこないので誰か教えてください。
Sub Macro2()
Rows("24:28").Select
Selection.Copy
Sheets("A").Select
Rows("22:22").Select
Selection.Insert Shift:=xlDown
Range("H22").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=SUMIF(R9C7:R19C7,RC[-1],R9C8:R19C8)"
Range("H23").Select
End Sub >>202
具体的にあなたが躓いているところがわかりません >>203
具体的にあなたが何がわからないのかわかりません >>200
For Eachで全シートループして、各シート最終行取得して貼り付ければ良いと思いますが、ダメですか? 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
l EXCELのVBAでメール返信(OUTLOOK)をする仕組みを作りたいのですが、
元メールを引用するにはどうしたら良いでしょうか?
タイトルやらアドレスやら本文がくっついてないと、
どうも返信感がでないと思いまして。 >>208
Outlookヘルプから
次の例は、現在のフォルダを受信トレイに設定し、フォルダの 2 番目のメッセージを表示します。
Visual Basic for Applications
Set myOlApp = Outlook.Application
Set myNamespace = myOlApp.GetNamespace("MAPI")
Set myFolder = myNamespace.GetDefaultFolder(olFolderInbox)
myFolder.Display
Set myItem = myFolder.Items(2)
myItem.Display Excel向けだとVBA関連の本は結構あるのにOutlookのVBA本って
あんまり無いですね。
Outlookの仕分け機能では宛先とCCに○○から来た時に動作する
条件を付けられますが、宛先○○から来た時には動作するけど
CCに何か入っていた場合は動作しないマクロは作れないでしょうか。
環境はWin7、Outlook2010です。 >>210
多分こんな感じでできるかと
Public WithEvents InboxItems As Items
Private Sub Application_Startup()
Set InboxItems = Application.Session.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub InboxItems_ItemAdd(ByVal Item As Object)
Dim mailItem As Outlook.mailItem
Set mailItem = Item
If InStr(mailItem.To, "○○") > 0 And mailItem.CC = "" Then
MsgBox "何かする"
End If
End Sub 【Win10】 こんな犯罪級OS薦めんなよwww ↓ 【スパイウェア】
この使用許諾契約書には書かれています
”最後にあなたのコンテンツを含む個人データ(例えばあなたの電子メールの内容や―プライベート通信やプライベートフォルダ内のファイル)にアクセスし―開示し保全します”
開示する ここ重要だよ
契約がなければ通常 高度な違法行為になりうることです それはあなたが自分の意思としてこの契約書に同意したのです
https://www.youtube.com/watch?v=ZBwEmgdqB1c
【秘密保護法】 ナチスの手口でサヨクを捕まるんだろ? 早くやってみろよ m9(^Д^) 【緊急事態法】
スノーデン氏→国家秘密法は諜報機関NSAの日本での活動を容易にするために米国が設計して日本政府に導入を要求したもの。
全日本人が調査の対象であり、NSAはあなたの交際関係、信仰等の個人情報を把握している。
https://twitter.com/hopi_domingo/status/740193540529999873
今朝、辺野古で新基地建設に反対するママの会メンバーに対して、機動隊員が「お前たちには汚い血が流れている」などと暴言を吐いたそうです。
自分のやっていることを「だってお金欲しいもん〜」「俺の写真を待ち受けにしろ」とも (顔写真)
https://twitter.com/MothersNoWar/status/690357793702940672
サンマ以降のバラエティ芸人の大半が、暴走族出身で極右思想。原発反対派を「放射脳」と嘲笑する連中。
芸能界極右は石原慎太郎一家を筆頭に、上田晋也 草野仁 津川雅彦 向井理 松本人志 宇多田ヒカル マツコ 春日俊彰 田村淳 北村晴雄
https://twitter.com/tokaia mada/status/630627400552845312 vbaでshell関数を使って指定パスのエクスプローラをファイル選択状態で開いてるのですが、
家でやると何でもないのですが、会社でやると、その方法で立ち上げたエクスプローラは
1分〜数分以内に「エクスプローラは停止しました」となって落ちます。そのフォルダだけ
落ちるので他のは巻き込まれないだけマシですが、手動で立ち上げた他のエクスプローラで
このように不意に落ちた事はないので、プログラムから立ち上げたエクスプローラが特別
不安定だとしか思えないのですが、原因が不明です。
それで、家と会社の違いは、会社だと共有フォルダを開いている事です。
家ではテスト環境をローカルで構成している為か、全く問題は起きません。
色々ぐぐってみたのですが原因が不明です。
vbaから開く方法で、解決策、あるいは次善の方法等ありますでしょうか。
shell関数はこのように使っております。
Shell "Explorer.exe /select, """ & path & """", vbNormalFocus
環境はWindows7 Excel2010(32bit)です。 >>215
試しに自宅の環境で共有フォルダをshell関数でファイル選択状態で開いてみたけど
特に問題なかったよ
原因は共有フォルダであること
ではないのじゃないかな
その共有フォルダへのショートカットを作って
それをshell関数を使ってexplorerで開いてみるとかは? 手動で起動したプロセスは、親プロセスが無く、単独のプロセスだから、ずっと生き残るのかな?
Aプログラム(Aプロセス)から起動したプロセスは、親プロセスがAとなり、
Aを終了すると、その子プロセスもすべて、連鎖して終了するのかな?
プロセスを起動する際、親子関係を切れば?
ただしそうすると、起動されたプロセスは、A終了後も残り続けるから、
誰がそのプロセスを終了するのかが、問題となる
漏れは、Windowsはよく知らない。Linuxから推測して書いた >>216
ショートカットから開く方法ですか、考えもしなかったです。
確実に再現するバグではない(場合によっては20分くらい経ってからクラッシュしますし、端末によっては何も起きなかったりします。)
なので、原因を掴むのが難しいです。
>>217
なるほど、プロセスが分離されているから巻き込まれなかったんですかね。
前後のコードを見返しているのですが、shell関数を読んだ直後に
Kill thisworkbook.fullName
thisworkbook.close
を読んで終了させているんですが、ひょっとしたらこの兼ね合いが原因かも?とふと思いました。
shell関数は非同期処理で、会社の共有フォルダを開くときはローカルと違って若干起動に時間がかかります。
shell関数の処理が完了しきっていないのに即終了させるから、動作が不安定になってる可能性はありますかね・・。
なのでとりあえずShell関数を、Wscript.ShellのRunメソッドの同期処理に置換えてみました。
それで明日会社でテストしてみます。 >>219
同期処理に変えたら全く落ちなくなりました。
どうやら推測は当たったみたいです。
手動で立ちあげてる時には同じトラブルは一度も起こったこと無く、誰からも聞いていないので、
VBA処理が原因で間違いないと思います。
ぐぐっては見てたんですけど、VBA関連でのエラー報告は0でしたね。
しかし、元々この手のトラブル報告がかなり多いことにはびっくりしました。
とりあえずは解決です。皆さんどうも有難うございました。 タイミングの問題で、バグが起きるときは、
sleep 3秒などで、時間稼ぎすることが多いな >>221
タイミングというか処理を待ち合わせる必要があるって事だよな
3秒で完了しない処理だと問題が起きる
90%くらい解決出来れば実用上は問題にならないかも知れないけど ' キャッシュ反映を待って5秒待つ
↑これなんとかして >>223
何のキャッシュか判らないけど
キャッシュをフラッシュするインターフェイスがあればそれを使えば良いのでは
無いなら知らない 起動方法と起動のタイミングの問題で
>1分〜数分以内に「エクスプローラは停止しました」
>場合によっては20分くらい経ってからクラッシュ
のような症状が出るとは考えにくいけどな
まあ、直ったって言うならそれでいいけど vbaの And, Or って短絡評価してくれないの??? >>227
普通しない
(常にしないかどうかは知らんけど) X(n) And Y(m) で X(n) = False だった場合、Y(m) は評価しなくても式が False と確定する
Or でも同様のことが可能
VBAがショートサーキットしているかどうかは、各関数で Debug ログを出力してみればわかる >>229
いちいち短絡評価の説明なんてしなくていいよ... くぅ。
短絡評価してくれるもんだと思って、
True, False, Nullを返す関数の結果で、
NullをFalseに倒したくて、
左辺でNot isNullやってたけど、
右辺もNullで動いてしまってエラーになってはまったわ。 .NetならOrElseやAndAlsoが使えるし
Nullable指定も出来るから便利なんだけどなー
まあ無いものねだりしても始まらないか VB(A)はWithとかある割にそういうとこは全然気が利かないよな
C言語すら知らない人が作った言語なんだろう事は判る VBって元々はMSじゃないんだよね BASIC好きのゲイツが惚れ込んで買収しただけ 漠然と「VBAの初心者向けの本を教えてください」ってのはよくあるが、上級者向けは珍しいね
ある程度基礎が身に付き、やりたいことが分かってきていれば
○○に関する本、ってなるように思うんだが・・・
田中亨氏の「Excel VBA 逆引き辞典パーフェクト 」は名著だよ >>237
ありがとうございます。
クラスや多段階配列、イベント自作、擬似コントロール配列あたりの情報がある書籍はありませんか? アプリ作成で学ぶExcel VBAプログラミングユーザーフォーム&コントロール(横山達大著)
かんたんプログラミング 応用編(大村あつし著)
同じく、かんたんプログラミング コントロール関数編
デバッグ関連だと
立山秀利著の本 VBAでコードを抜き出してSVNやgitで管理したりするとそれだけで上級者っぽくなる PowerPointのVBAでファイルを閉じた後も変数の値が保存されるようにしたいんですが外部のテキストに書き出す以外にファイル本体にどうにかして埋め込む方法はありますか? 透明のシェイプとかに書くとか色々あるけど
実際本体ファイルを更新されるとバージョン管理とか使う側が気持ち悪がるとか運用面で問題が出そう Excel脳っすなぁ
標準的なユーザーデータ保存場所がちゃんとあるんだからそれ使えばいいじゃん >>246
条件によるだろ
思いつきで即答すんなアホ >>249
条件って
ファイル本体に埋め込みたい
ってことだろ
>>246 の保存場所がどこの事を言ってるのかよくわからんが >>245 より >>248 の方がはるかにマシ ファイル本体に埋め込みすんのがアホなんだよわかれよ素人
ゴミを量産して人に迷惑かけないでくれ
独りよがりの仕事してんじゃねえよ 実際に仕事してるとそれこそ基地外避けを作る必要が出てきたりするんだよな ユーザーデータを変な場所に保存したりするやつとか避けないとな >>254
> 変な場所に
透明のシェイプとかのことですね、わかります 50枚のスライドが入ったパワポが5個あります。
これを統合したいのですが
ファイル1の1枚目
ファイル2の1枚目
ファイル3の1枚目
ファイル4の1枚目
ファイル5の1枚目
ファイル1の2枚目。。。
という順番にしたいのです。
どういうマクロを書けばいいでしょうか? ExcelVBAをつかいこなしていても
パワポはマクロの記録がないと腰が重いな >>256
この作業用を何回も繰り返さないといけないの?
1度きりならあなたの場合は手作業の方が早い気が >>256
スマホからだから試してないけどこんな感じかな
Application.Presentations.Open(ひとつ目のファイル)
Application.Presentations.Open(ふたつ目のファイル)
...
Application.Presentations.Open(いつつ目のファイル)
Set P = Application.Presentations.Add
For I = 1 To 50
For J = 1 To 5
Application.Presentations.Item(J).Slides(I).Copy
P.Slides.Paste
Next
Next
P.SaveAs(新規のファイル) 選択されているセル範囲内の文字、図形を削除する手順を作ってみましたが、処理がえらく重いです。
もっと処理を早くする方法はないでしょうか?
Sub sakujo()
Application.ScreenUpdating = False '画面更新を停止
Dim shp As Shape
Dim rng As Range
If TypeName(Selection) <> "Range" Then Exit Sub
For Each shp In ActiveSheet.Shapes
Selection.ClearContents
Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) '図形の配置されているセル範囲をオブジェクト変数にセット
If Not (Intersect(rng, Selection) Is Nothing) Then '図形の配置されている範囲と選択されているセル範囲が重なっているときに図形を削除
shp.Delete
End If
Next
Application.ScreenUpdating = True '画面更新を再開
End Sub >>263
再計算とイベントも停止してみた?
あと、コレクションに対するループの中で自分自身のコレクションが変化するのは、なんとなくまずい気がする
根拠はないけど、それって遅くなる要因と違う? 処理の基本をよく考えるべき。
1.Shape毎にSelection.ClearContentsする意味は?
2.shp.Delete後もループする意味は?
3.そもそもSelectionって何?つまり何が選択されている時に削除したいの?
For Each shp In ActiveSheet.Shapes
If shp Is Selection Then
shp.Delete
Exit For
End If
Next
じゃ駄目? 選択されているセル範囲については最初のIf文でExit Subしてるから削除されないんじゃ?
処理がよく分からん。
選択されているShapeの下のRangeの内容を削除したいならshp=Selectionの場合に
Range(shp.TopLeftCell,shp.BottomRightCell).ClearContents
で良いんじゃ? shp=Selectionの場合じゃなくてshp Is Selectionの場合だな。
shp.Deleteの前ね。 >>265
質問者じゃないけど変わって説明するよ
・シート上に文字と図形が複数箇所に設定されている
・消す範囲を選択して、その範囲内の文字と図形を消すコードを書いた
・でもなぜか遅い
質問者に言えるのは、
・Selection.ClearContentsはfor eachの外でいい
・試しに100個のshapeを貼り付けて50個くらいが入る範囲を選択して消してみたら一瞬で終了(もちろんコードでだよ)
・遅いって具体的にどれくらいなの? >>268
コード見りゃわかる。
でもコードがやってることは無駄な部分が多いから聞いてる。
最初のIf文を見ればRangeを選択した場合はExit Subしたいみたいだがら範囲選択した場合は処理して欲しく無いんだよな。
→じゃ、どんな時に処理して欲しいの?
For Each shp In ActiveSheet.Shapes
If shp Is Selection Then
Range(shp.TopLeftCell,shp.BottomRightCell).ClearContents
shp.Delete
Exit For
End If
Next
じゃ駄目なの? 今までは長い時で1〜1.5秒程止まっていました
>>268さんの言われた通り、Selection.ClearContentsの位置を変えたらスムーズになりましたのでこれで行こうと思います
たくさんご意見頂きありがとうございました >>269
> If TypeName(Selection) <> "Range" Then Exit Sub
だよ エクセルのマクロでも質問大丈夫でしょうか?
名前と同じファイル名の画像を名前セルの隣に貼り付けるプログラムなんですが
Sub ボタン1_Click()
Const n As Long = 2
Dim i As Long
Dim x As Double
Dim s As String
Dim t As FileDialog
Dim m As VbMsgBoxResult
With ActiveSheet
For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row Step 6
Set r = .Cells(i, 3).MergeArea
s = "D:\画像\1\" & .Cells(i, 2).Value & ".jpg"
Dir Application.Path
With .Pictures.Insert(s).ShapeRange
.LockAspectRatio = msoTrue
x = Application.Min(r.Width / .Width, (r.Height - n) / .Height)
.Width = .Width * x
.Left = r.Left + (r.Width - .Width) / 2
.Top = r.Top + (r.Height - .Height) / 2
End With
Next
End With
End Sub
この"D:\画像\1\"の部分をフォルダ選択できるようにしたいので
Dim s As String
Dim t As FileDialog
Set t = Application.FileDialog(msoFileDialogFolderPicker)
s = "t" & .Cells(i, 2).Value & ".jpg"
としたら「1004 PicturesクラスのInsertプロパティを取得できません。」と実行できません
どうしたら"D:\画像\1\"の部分をフォルダ選択できるようにできるのでしょうか?ご教示お願い致します。 >>272
Dim s As String
Dim t As String
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Sub
t = .SelectedItems(1) & "\"
End With
'途中省略
s = t & .Cells(i, 2).Value & ".jpg"
じゃないかな?
あと
元コードもそうだけど
フォルダ内に その画像ファイルが存在してなかった時の対策も必要だと思うよ
同じエラーになるぞ それとも絶対 あるのが 確定してる? >>273
大変ありがとうございます!
ただ、貼り付ける画像は複数あり、貼り付けるたびにフォルダ選択画面が出てしまいますので、一気に貼り付けられないものでしょうか?
ファイルが存在してない時の対策は、セルの状態を色変えて罫線で斜線を挿入したいと考えてますが、まだそこまで進む前段階がクリアできないので困ってます
よろしくお願いします >>274
ん? そこは分ってるとおもたよ
フォルダ選択部分は Forループの外だよ
↓ここねw
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Sub
t = .SelectedItems(1) & "\"
End With >>275
あっ!できました!ありがとうございます!助かりました! こんにちは。
パワーポイント2013のVBAについて分かる方教えて下さい。
やりたいことは、グラデーションの塗りつぶしがあるシェイプのGradientStopsのそれぞれの色を変化させるアニメーションの方法です。
2013ではできないけど2016ではできる等の情報もあればお願い致します。 俺が手を下すまでもないな
答えてやれよ
>>280 VBAだけってのが
外部コントロール使用禁止
API呼び出し禁止
なら不可能です VBAの変数の値を次回の処理を行う時まで記録しておくのにセルに書き込みをしたりしていますが、
セルにアクセスするのを減らすためにセルに記録しなくて処理終了時に変数値をVBA内で保存しておいてくれる一次記憶領域みたいな物はないのでしょうか? ちりも積もればの話ですが
足し算引き算割り算レベルの計算をセルに関数を割り当てて行うのと
同じ計算式を変数を用いてVBAで書いて実行するのとで、より処理速度が速いのはどちらでしょうか? >>281
セルでいいんじゃないの?
ただそのIOは配列アクセスを使うべき
ループで1セルづつ読み込むとかがナンセンス >>281
説明がいまいち分かりにくい。
次回ってのは何時のことを言ってる?
グローバルな変数じゃダメなの?
次にそのブックを開くまで保持したいならセルってのも分かるんだが。
で、その場合にセルの代わりに保持したいならCustomDocumetProperties使ったりするかな。 >>283
ありがとうございます。
>配列アクセス
勉強してみます。
>>284
Bookを閉じずに他からデーターを取り込み再度VBA実行を繰り返します。
>グローバル変数
>CustomDocumetProperties
勉強してみます。
グローバル変数に代入した数値は処理を中断しても生き続けるのであればそれで解決しそうです。 >>284
プロシージャの上に定義すると処理が終了しても最終定義された内容は残ったままなんですね!
今まで処理を中断する必要がある場合は変数をすべてセルに書き出していましたが大発見です。ありがとうございました。 Public変数もしくは通常の変数の指定数の限界はあるのでしょうか?
問題なく動くレベルは何個ぐらいでしょうか?
50個
100個
1000個
10000個でも平気だっり?
実は
100000個以上でも問題ないとか? >>287
使えるメモリは決まってる
変数の個数じゃなくてそれぞれのバイト数の合計 >>287
グローバル変数(Public)は便利に見えるけどスコープを考えて必要無い所では使わない方が良い。
PublicかPrivateかプロシージャ内で宣言するかを意識して使った方が良いね。 日曜の午後からずっとVBAを書いてるけどまだおわらね〜
てかやればやるほど選択肢が爆発的に増えてきて一生かかってもおわりそうにね〜!w >>287
しかもEndやErrorで抜けたら破棄されるという罠 素数や組み合わせ爆発のような数学の迷宮的な問題に陥って
一生かかってもコードを完成させるのは無理ですよみたいな場合もあるのでしょうか? >>292
数学的バックグラウンドがなければコードが書けないという類いの問題はあるね。
たとえばNP困難なやつ。
巡回セールスマンとかナップサック問題とか、ナーススケジューリング問題とか。
自力でなければ、それなりの回答が得られる解法(コード)が既に存在してるものもある。 問題を解く方法を考案するのと、その方法をコンピューター言語に翻訳する作業は別ですわ
それぞれに異なった知識と才能が必要となりますので >>291
End Subの行にブレークポイント、これ パブリック変数で
1000個
10000個でも平気だっり?
とかどんな拷問なんだよw テストしてみたがパブリック変数500個は問題なく動いた。
もっと使ってる人いる? 変数の一部を変数にする事は出来ないのでしょうか?(代入
とかではなく)
たとえば↓はイメージですが変数名の箇所を文字列をつなぎ合わせる時と
同じように変数をわりあてられないのでしょうか?(以下は動きませんがphpではこれができます。)
dim aaa1
dim aaa
dim no
dim bbb
aaa1=例文1
aaa=aaa
no=1
aaa & no = bbb
msgbox bbb
↓
結果は「例文1」 と表示されますみたな、、 >>299
最終的には
aaa1=「例文1」
aaa2=「例文2」
aaa3=「例文3」
・
・
とし
aaa & no のno番号だけ差し替えて制御するみないな感じで使います。
ただしnoの番号は連続した数字ではなく他の集計結果からランダムに発生するため
ループ処理等では成り立たず変数のように扱う必要があります。 >>300
aaa1とかaaa2を変数として捉えず、文字列と数値を要素に持つ2次元配列と見れば良い
で、データ全体を制御するときは、aaa1,aaa2...の2次元配列全てを要素として持つコレクションオブジェクトを生成して操作する >>300
Dictionaryのkeyにすれば良いんじゃね CollectionよりDictionaryだな、確かに そういう質問、初心者によく聞かれるわ
普通は配列を使えと教えるもんだが >>302
>>301
ありがとうございます。Collection Dictionary 調べてみましたが
どちらも説明をざっと読んでも使い方が理解できませんでしたが挑戦してみます。
phpのように (aaa & no) =
と変数名自体を複数の変数で合成する事は出来ないのですね。 >>300
>>301
>>302
>>304
aaa1=「状況に応じて変化する数値1」
aaa2=「状況に応じて変化する数値2」
aaa3=「状況に応じて変化する数値3」
・
・
すみません説明を単純にするために「例文1」としてましたが
変数に格納されるのは状況に応じて変化する数値(他の集計の計算結果)でした。
固定された文言であればDictionary keyで処理できるというのはわかりましたが
格納されている物が変化する数値の場合かつ
変数名を数字で管理(他の集計から3という結果が出たら→aaa3が適応されるみたいな)
したい場合こういうことを実現する方法はありますでしょうか? >>306
変数名を数字だけで管理する方法はない。
VBAの仕様上、できない。
というか、その集計結果なるものがプログラム実行時に決定するのだとしたら、集計結果を格納する変数の名前に集計結果の数値をはじめから盛り込もうとするのは無理があるし、そもそも理由が分からない。
やりたいことを実現するにはもっと適切な他の方法があるんじゃないかな。 >>306
Dictionaryのvalueは変更可能 >>308
>>307
理解するのにかなり時間がかかりましたがDictionaryなんとなくわかりました。
これって Dim とかPublicとかの変数とは別に存在できるんですね。
全く未知の分野ですが使ってみます。ありがとうございました。 Dim dic As New Dictionary
Dim i As Integer
dic.Add "キー1", "アイテム1"
dic.Add "キー2", "アイテム2"
dic.Add "キー3", "アイテム3"
Dictionaryで指定した"キー"と "アイテム"は処理が終了するとリセットされるようですが、
グローバル変数のように処理が終了しても次実行されるまで記憶させておくようにする事は出来ないのでしょうか? >>310
プロシージャを跨いで値を保持させるなら、グローバルな配列変数、(アプリケーションがExcelならば)セル、シェイプ、カスタムドキュメントプロパティ、グローバルコレクション、自作のグローバルクラスのインスタンスなどに値を記憶させるしかない
でもそれならわざわざプロシージャ内でDictionaryを使って連想配列を操作するより、ExcelのセルにKeyと値を書き込んで配列アクセスして読み書きする処理の方が遥かに楽だと思う >>311
ありがとうございます。
今作っているコードでセルへのアクセスが膨大になってきて処理時間がどんどん長くなる傾向がみられまして
全操作をセルにアクセスせずに完結させようと色々考えていましたがなかなかそうはいかないようですね。 >>312
Dim dic As New Dictionary
の宣言を何処でしているかによるんじゃね? >>312
標準モジュールとかでDictionary型のオブジェクト変数をグローバルスコープ(Public)でNew宣言すれば、処理を抜けてもDictionaryのItemは初期化されないんじゃないのかな
ただ単なる配列の処理でデータが数千件程度なら、描画止めた状態でワークシート使った方が遥かに楽だと思うが。 >>311
引数に渡すってのを忘れてるぞ。
一番使われてるんじゃないか? >>316
プロシージャを跨ぐって話だろ。
別のプロシ−ジャに引数として渡せば形の上ではそれぞれのローカル変数でも値は保持されるだろ。 >>317
>>310を読んでなんとなく、一個のルーチンのプロシージャ間の値の受け渡しの話ではなく、ルーチン内で一度AddしたDictionaryのKeyとItemを何らかの形で保存して、同じルーチンを再実行したときにKeyとItemを再利用することが出来るかどうかという話だと思ったんだが
まぁ、オブジェクトプロパティへの値の保存も実際はそのオブジェクトを定義してるクラスのメソッドに引数を渡してるのと同じだから、変わらないといえば変わらないけど 超既出FAQですな。
『Public 宣言された変数の有効期間』
https://support.microsoft.com/ja-jp/help/408871
簡単に言うと、メソッド実行中以外はいつでもpublic変数はクリアされうるから、値が残っていることを期待したマクロを書くなってこと。 >>319
俺は使う時にクリアされてるかチェックしてクリアされてたら再設定するようにしてるな。
値が0だったら値を取得するFunctionを呼び出すって感じ。 Publicな静的変数は使わない。
エクセルのセルとかワードの文書変数とかの規定オブジェクトにデータを書き込んだ方が便利 >>321
いや、それは格好悪いんじゃね?
セルを使ったりCustomDocumentPropertiesも使うけど、それに合ったものだから使うわけでPublic変数に合ったものもある。
適材適所だろ。 ontime で実行するプロシージャって標準モジュールに書かないとあかんのか。
このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。って出た。 >>323
スコープ
普通にCallで呼び出せる場所にないと実行できないのは、どの方法でも同じ >>324
ThisWorkBookのモジュールからOnTimeでThisWorkBookのモジュール内のPrivate Sub を予約したんですが・・・これじゃ駄目なんですかね? >>325です
OnTimeで実行予約するプロシージャを標準モジュールに移動したら動くようになりました〜 特定の文字が含まれているセル(複数ある)を検索し、
検索されたセルを含む行全体(Entirerow)を同時選択する方法
以上お願いします。 その文字を含むセルを、行ごと削除したり、行ごとコピーしたりと、いろいろしたいので質問致しました。 鮮やかな丸投げっぷりにワラタ
作成依頼OKな Excel VBAスレと間違えてない? >>328
とりあえず、複数行を選択するところをマクロの記録で見てみたら?
ctrlキー押しながら選択するのとshiftキーを押しながらのとで。 検索対象のセル範囲でForループを回す
セル値に特定文字を含むセルが見つかる度にEntireRowを取得して変数に入れるかUnionで選択対象の範囲をマージしていく
ループ終了後にSelectする
以上 >>327
Ctrl+Fで検索しろやボケナス
ちゃんと行選択までしてくれるぜ ごめんなさい、質問者です。
ここじゃなかったのですね。上に上がったやり方でできそうなのでやってみます。ありがとうございます 色々細かい条件でどんなコードが効率いいか、変わってくるでしょ。
例えばそのセルがあるのは、特定の行だけとか、検索文字列はセルに完全一致なのか含まれるのか、など。 331だが、同じ行に該当セルが複数ある場合は無駄が生じるな
実現したい機能次第だが、工夫が必要かもな はじめまして。以下2点、教えていただけると幸いです。
環境は、OS:Windows7, Excel2010です。よろしくお願いします。
1.プルダウンの初期値設定
セルA1にりんご、A2にバナナ、・・・のようにA列にある項目をプルダウンで選択したいです。
このとき、「A列のj行目(パラメータ選択可能)を初期値にしたプルダウンをB1に設置する」VBAのコマンドを教えていただきたいです。
2.ファイル名の変更
aaa.txtというファイルをデスクトップに出力するマクロを作れました。
このマクロ実行後、再度実行するとaaa(2).txtのファイルを、再度実行するとaaa(3).txtのファイルを出力・・・
このようなVBAのコマンドを教えていただきたいです。 >>336
txtファイルをデスクトップに出力っていう日本語の破壊力がやべぇ >>336
1
・B1セルを選択してからマクロの記録を実行
・入力規則でリストを選択にリストの内容でA列を選択する
・マクロ記録の終了をする
・できたコードを修正してA列の任意のセルをデフォルトにするように変更する
2
・デスクトップにaaa.txtが存在するかチェックする。
・存在しない場合はaaa.txtを作成して終了。
・存在する場合はDo~Loop中にデスクトップにaaa(i).txtが存在するかチェックする
・存在する場合はiをカウントアップして次のループ
・存在しない場合はそのiを使用してaaa(i).txtを作成して終了。 A1セルに =NOW()-TODAY() と入力すると
現在時刻が表示されますが。
MsgBox Range("a1")
とすると 0.0110212・・・と言ったような数値が出ます。
Dim now As Date
now=Range("a1")
と型を指定した変数に格納してやると
MsgBox now で 21:49:32 といった一般的な時間表記を示せますが、
変数化を省略して
MsgBox Range("a1")〜に補足コードを書くなどで同じ処理を実現する方法は無いのでしょうか? MsgBox Range("A1").Text
とか
MsgBox Format(Range("A1"), "hh:mm:ss")
とか >>341
なんと!!
変数をだらだら定義すること無く綺麗さっぱり解決できました!ありがとうございました。m(_ _ )m プロシージャの中で1回しか使わないのに、わざわざ変数にするやつとかいるよね。(しかもハンガリアン記法で)
100行に満たない程度のコードなら、Withステートメント使ったほうがむしろ可読性は上がる。 マシンパワーが貧弱だった大昔ならともかく、今時はリソースを気にする必要なんてないんだから、可読性を最優先で記述するべきだよ。 >>343
ああ、俺だ。
Ubound(配列)とか、For〜Nextの中で何回も実行すると、
なんか遅いような気がして、一度変数に入れちまう。 >>345
何回も実行するなら変数に入れたほうがいいんじゃね? >>345
(1)
For I1 = 1 to UBound(xxx)
For I2 = 1 to UBound(xxx)
(2)
J=UBound(xxx)
For I1 = 1 to J
For I2 = 1 to J
普通に考えて本のチョット早いと思われますが、記述の労力ほどじゃない。
他の方の書いてますが、今は、処理速度が物凄く早くなっています。
気にしなくていいと思います。
ただし、私はEXCELでVBAを書くのですが、シートのセルに書き出すと物凄く遅くなる。
VBAの配列とかメモリーならばほとんど気にしなくていいです。
ですから、メモリー内で処理して最後の最後にシートに書くようにしてます。 >>347
> ですから、メモリー内で処理して最後の最後にシートに書くようにしてます。
基本中の基本だからいちいち書かなくてよろし アノニマスに入会したいんですがVBA知ってるだけで入れますか?
あと入会ってどうやんの? スーツ着て履歴書持って事務所に面接に行くの? 超初心者です
同じブック内の複数のシートにある顧客データをUserFormを用いて(検索するイメージ)抽出し、別のシートへ出力するコードを書きたいのですがいまいちわかりません。
大変困っているのでヒントをくださればありがたいです。 >>351
超初心者には無理です
パソコン教室に通ってせめて初級をクリアしてから質問してください >>352
返信ありがとうございます
Excel自体触ったことない超初心者ですが頑張っているところです( ??? ) >>351
自称初心者がどこでUserFormとか覚えたの?
まずはシート上でやってみようね どこで覚えようとお前の知った事じゃねえだろw
なんだこのバカはwww >Excel自体触ったことない超初心者
ユーザーフォームを作ったことはあるのか?
無けりゃ、この時点でやろうとしていることはもう無理
VBAはほんの少しでも書いたことはあるのか?
まぁ最初は>>354の言うようにシート上で実現して、それをユーザーフォームにもっていくのが順当
というか触ったこと無いって時点で釣り確定 VBA参入門書とネットの知識を詰め込みました。
Excel初心者は本当です。友達に教えてもらいつつやっています。気分を害された方、すみません。
>>356さん非常に分かりやすいです。
二日間くらい最初からコードを書こうとしてもがいていましたが、マクロの記録が使えそうな気がします。
そのコードをいじってボタンで起動するユーザーフォームとくっつけるイメージで挑戦してみます。 >>354さんもありがとうございます!参考&励みになります >>357
ユーザーフォームでその機能を実現する必然性が感じられない
フィルタオプション機能を用いて、検索結果の出力先を新規シートに設定するだけで事足りると思うぞ フィルタオプションとマクロの記録で8割方完成できるな ADOの事でちょっと質問です
変数を定義する時に
Dim wkR as New ADODB.Recordset
ってするんだけど、RecordsetとRecordの違いって何? >>361-362 ありがとうございます、簡単なプログラムですが完成して感動しました。
Ifとマクロの記録が万能すぎることを肝に銘じてこれからもがんばります( ??? ) >>365
万能過ぎないけどね。
そればっかり使ってる人は永遠に初心者なままだし、色々な面で出来の悪いプログラムになる。
自動生成されたコードのそれぞれの意味を理解して自分なりに書けるようになると上達する。
例えば
Range("B4").Select
Selection.Value=10
のようなコードが生成されると思うけど意味を考えたら
Range("B4").Value=10
で良いとわかるよね。 すみませんお力添えをお願いします!
エクセルマクロ(VBA)の件でお尋ねいたしたく思います!
まずグラフの系列名はセル参照で表示させてます
シート名:あいうえお
適用グラフ:グラフ4
系列範囲:A11:Z11
必要なデータ選択は全ての系列で済ませています
あとはグラフで不要な系列を削除したいため、グラフに乗せたくない系列名は”×”になるようにしてます
この系列名”×”をVBAで自動的に削除させることは可能でしょうか?
またグラフは別シートの数値入力をもって自動作成される仕様にしているので、トリガーは設けません
デフォルトだと全部”×”のため(初めは数値データの入力がないため)
数値が入ると正しい系列名に変更されるため、VBAではまず”×”で削除して、”×”以外の系列名に変わったら復活するという構想を練っています
とりあえず、まず”×”を消すコードを見よう見まねで書いてみたのですが動作しませんでした
消すのは良いですが復活させるのも組み込むとなるとちんぷんかんぷんです
是非ともご教示お願いします!
Sub test()
Dim d As Long
Dim i As Long
Dim j As Long
For i = 2 To Sheets.Count
d = Range("A11:Z11").End(xlUp).Row
With Worksheets(i).ChartObjects("グラフ 4").Shapes.AddChart.Chart
.ChartType = xlLineMarkers
For j = .SeriesCollection.Count To 1 Step -1
If .SeriesCollection(j).Name <> "×" Then
.SeriesCollection(j).Delete
End If
Next j
End With
Next
End Sub >>367
説明サイトへのリンク、ありがとう。
取り敢えず、「階層構造のデータ間を移動する手段として」のRecordオブジェクトは使うこと無さそうw IF文初心者ですが
3つ数字の中から一番小さい数を判定したいのですが、
elseや入れ子で複数書けば判定できるというのは推測がつきますが
最も簡潔に記述するとしたらどんな記述方法がありますでしょうか?
例)
33 12 3
↓
3を抽出 >>370
最小値 = WorksheetFunction.Min(Array(33, 12, 3)) >>370
x = 33
y = 12
z = 3
If x < y And x < z Then
最小値 = x
ElseIf y < x And y < z Then
最小値 = y
Else
最小値 = z
End If >>372
>>371
明確な答えをありがとうございます。
やはりIFの場合は372が妥当なようですね。 >>372は < じゃなくて <= にしないと誤判定する 例題の対象が3ではなくて1000とかに増えたら破綻するだろw >>375
数字3つという前提を勝手に変えるこういう馬鹿はなんだろう 汎用性を考慮しないのか。
なかなかひどい。こういう人もいるという参考になったわ。 372のはアルゴリズムと言うよりその場しのぎの対応 配列に入れてループで最小値と比較して小さければ最小値を更新していくのが定石なのでは。 だからMin関数で一発なのに、無駄に車輪の再発明をしたがるやつが多くてリンダ困っちゃう >>379
順次比較も立派なアルゴリズムの一種なんだが IF初心者とか言ってる人に何言ってるんだか
あといつからこのスレはEXCEL VBA限定になったんだ >elseや入れ子で複数書けば判定できる
>最も簡潔に記述するとしたらどんな
という問いに、elseや入れ子の回答するのは無能以前に答えになってないのとちがう? え?え?日本語理解できてる?
質問には「Elseを使わずに」なんてどこにも書いてないぞ
ざっくり意訳すれば「IfとElseの数を最小に」する方法を聞いてるんだろ 372のは374が書いてるように、例えば
x=1
y=1
z=3
と入れただけで誤判定する。アルゴリズムの最低限を割ってるぞ。
372がベストアンサー(笑)だと質問者が思ったなら気の毒なので念のため。 そもそも計算量も最少じゃないしな
普通に
最小値 = x
If y < 最小値 Then 最小値 = y
If z < 最小値 Then 最小値 = z
ってやる方がわかりやすい うん、ベストアンサーはMin使った方だね。
俺だったら迷わずMin使用する。
同時にMin使わない方法も考える。
配列ループも考えた。
でも、別にIf文使っても良いんじゃない?
そんな目くじらを立てるようなことじゃない。 だから372はif elseだとしても最小(計算量的に)の答えにもなってないし、そもそも答えとして間違ってるって話だろ それは勉強する奴と仕事にしてる奴のスタンスの違いだな。
仕事にしてる奴はIfを使わなきゃならないなんてことに遭遇しないから、はなっから抜けてる。 必ずIfを使う縛りなら>>388がベストアンサー
ソートアルゴリズムの最初の1回目のループを展開してるだけなんだけど、基本中の基本のやり方 >>392
if文の使い方を聞かれてmin()関数を教えるような人はプログラムを仕事にしないで欲しいのです
いえ、仕事をしないで欲しいのです 仕様書はちゃんと読んで、条件は無視しちゃいけないよね 勉強のため何が何でもIfだけで解決しなきゃいけなかったのか、
まだ初心者だからMinという便利な物があることを知らなかったのか
それによって変わってきちゃうからー >>395
仕様書ならそれが正解
しかし案件定義なら顧客が何をしたいかを読み取ってより良い方法を提案することも必要
そもそも>>370にはIf使えとは書いてないし >>394
分かってねえなあ。
勉強を教える仕事じゃないならユーザーにとって一番使いやすいとか、速度が速いとか、ユーザーが満足するようなものかどうかが大事なのであって、どんなコードじゃなければならないとかの要望は普通無い。
そして、メンテナンス性とかコードの書き方に関してもMinの方が良いとなればそもそもの問い掛け自体仕事で発生することは無い。
そして実際には、何でMinじゃ駄目なのと問い掛けられない奴は仕事の出来ない奴ということになる。
(もちろん明確に理由が有るならIfで書く。)
指示通りにしか作れない奴じゃ単なるコーダって奴になるしかない。
仕事ではMinを使わないなら明確な理由が存在するし、打ち合わせなんかのやり取りで既に意思統一されてる筈だ。
つまり今回の問い掛けのような事態は存在しない。 >>393
だな、簡素で分かりやすく奇麗なコードだ >>398
なんか仕事をしてる体で話してますけど
あなたの想像上の仕事では自分にとって都合の悪い事態は存在しないのですね
さぞかし楽しかろうとは思いますが
あなたは社会に出ないでください >>400
仕事をしたことの無い奴には分かるまいw 再利用したいけどExcelの話をしたいときに困るのかな 「Excelの話」したいんだったら総合相談所でやれ 早速質問
今vbaでマップ使って
とある表の集計を行なっております
一つのkeyに対しアイテムが複数あるので
配列で入れようと思ったのですがうまくいきません
何か良い方法はありませんか? >>408
一つのキーに対して複数のアイテムがある
これをどうにかこうにか出来ないか
やりたいことは
キーが重複された二次元配列を
グループ化&合計を取りたい >>409
エクセルならピボットテーブルでいいんじゃない? エスパーじゃないんだから、もっと具体的に説明しないと、何がしたくて何ができないのか判んないよ。
そして多分だけど普通にifで分岐するプログラムを書くだけだと思う。 いや多分forでループするプログラムを書くだけだと思う データシート
キー 金額a 金額b
1 10 20
2 20 50
1 30 90
結果(期待)
キー 金額a 金額b
1 40 110
2 20 50
上のような感じのシートがあって
集計かけたり
平均とったり
最大値だったりしたい >>415
そのくらいの事を自分でできないなら
ピボット使った方がいいと思うぞ
バグって計算結果が合わないから そのくらいの事を自分でできないから質問してんだろ
そのくらいの事を理解できないなら質問スレに来ない方がいいのに そのくらいの事も判らない人にも実現できる方法を提案してるだろ https://i.imgur.com/wtkTdlA.png
上のように各列の情報に応じて、一定の条件にヒットしたら評価欄に追記、ということをしているのですが、
上手い書き方が思いつかず、冗長で読みにくいコードになってしまいます
https://i.imgur.com/cE0kOho.png
どうすれば綺麗で読みやすいコードになるでしょうか?
特に、変数(ここでは「評価」)の参照先のセルに書き込みつつ、変数の値自体も更新するスマートな方法と
If文で2つの条件が当てはまった場合に両方の処理を実行させる(ここでは40点以下と60点未満のIf文を一つで済ませるとか)方法があれば知りたいです >>419
配列を使え
あとソースを読んだり修正したりやりにくいから画像にせずそのままテキストとして貼ってくれ
科目 = Array("国語", "算数", "理科")
For j = 0 to 2
点数 = i.Offset(0, j + 1)
If 点数 <= 40 Then
i.offset(0, -1).Value = i.offset(0, -1).Value & 科目(j) & "の点数が以下略" & vbCrLf
みたいな感じで教科の数に関わりなく記述を1回にできる
条件が3つ以上ある時はCaseで分ける方法もあるけど、どんどん文字列を追加するならIfを並べる今の書き方で別に悪くない ありがとうございます、やってみます
(コードは行数制限とインデントが反映されなかったのでつい画像に…すみません) オートフィルの連続データでA1が0なら終わりでそれ以外なら下にオートフィルの連続データを追加して行くってどうやればいい? 下に一つオートフィルの連続データを追加してもしもその数が0以外ならばその下に一つづつ追加してもし0になったら終わるってことです
オートフィルの連続データまでは成功しました! >>424
何をやりたいのかさっぱりわからんから
> オートフィルの連続データまでは成功しました!
のコードを晒してくれ 何をどーしたいのかよーわからんが、
オートフィルの連続データが完成したならDo While Loopでも使えばいいんじゃね そうですね連続データと探す作業分けてDo until使ってみたら目的は達成できました ありがとございます 漠然とした質問で申し訳ない
コレクションというのがあるけど、その利点というかこういう場合に使うとかという
のを教えてくれないだろうか。配列は動的配列も含めてよく使うけどコレクション
というのはあるのは知ってるけどどういう場合に使うものなのか判らない。
(まぁそれでも何とかなってるということは今の時点ではそれでも問題ないって
ことでもあるんだけど) >>428
Dictinonaryだとキーが重複してたらエラーになるから
重複させたくない場合は便利だと思う
あと既にそのキーが登録してあるか調べるメソッドがあるから便利
配列でも実現出来るけど生産性の問題だと思う >>428
Excelならコレクションは知らないうちに必ず使ってるから心配しなくてもいい
オブジェクトを複数まとめた物がコレクションで、例えばワークシートオブジェクトをまとめた物もコレクションの一種
新規ブックを作るとワークシートが3枚あるじゃろ?それがもう既にコレクションなんだわ
名前をよく見ると「Worksheets」って複数形になっとるじゃろ?これが「複数まとめた」コレクションを示しておるのじゃ >>428
コレクションの便利さを実感できるのは、For Each 〜 Nextとか 広い意味では配列もコレクション
元質問のコレクションが何指してるか質問からは分からん >>433
どの言語でもコレクションの定義は曖昧だからなあ。
配列のように物理的に連続したメモリ領域で動かせないものが配列。 気付かないうちにコレクションを使ってたってのは、あぁそうなのかって感じですけど
>元質問のコレクションが何指してるか
思い浮かべてんのは連想配列とかディクショナリとかってやつですかね。
ディクショナリが重複チェックにも使えるってのは知りましたが。
今現在動かしているのをディクショナリに変えて見ようかなとと思ってます。
どちらにしろ自分で判らないことにはすすまんので。
後、曖昧模糊とした質問に答えてくれた皆さん、ありがとう 配列数の制御がめんどいし
個々のデータ型も合わせんでいいし 感覚的な話になるけど、例えばA列、B列、C列には○と×が入っててD列には何かの名前が入ってる時に、A、B、Cの組み合わせが×、○、○の時のD列の名前を表示したいとするわな。
こういう場合は一行ずつ見て行って×、○、○の組を探すわな。
こういう場合はFor Next使うわな。
つまり普通の配列が感覚に合う。
一方、A1:F100の範囲の各セルで1つだけ○、他は全て×の時に○のアドレスを知りたいなんて時には見つかるまで全てチェックすれば良いわけで、どう見ていくかなんて関係無いわな。
こういう場合はFor Each Next使うわな。
つまり連想配列が感覚に合う。 >>438
そんなもん普通はvlookup使うわな。 >>439
ばーか。
感覚を例として挙げてることが分からないバカは黙ってろ。
もっと上手い方法があるだろうことは最初から分かってる。
順番を意識しないIteratorの感覚を説明してる。
コレクションにだって順番は実際はある。
しかしそれを意識しないような場合にぴったりということだ。 他人の回答の批判とかするほうがおかしいね
質問に対して自分の考えで回答すればいいのに 適当に批判してやらなきゃお前ら好き勝手に質問と関係ない事ばかり言うじゃん
批判してくれる奴に感謝しろよw 質問と関係ないこと言ってもいいと思うけどなんでそれが駄目なのかな? >>444
自分は質問と関係ない自分語りするけどそれを批判されるのは許せないってか?
どんだけワガママに育てられたんだお前は ドカタ仕事の憂さ晴らしをここでやるのはやめてほしいと思うのです
汚い言葉を使うのは本人は無頼漢的にイケてるつもりかもしれないけど
側から見ると貧乏くさいのです accessの条件付き書式について質問です。
FormatConditions.Add(acExpression,,
の後の式は変数を展開してくれないでしょうか?
また、関数の呼び出しも出来ないでしょうか?
例えばmonth関数は呼び出して戻り値が得られるのですが、自作関数だと呼び出せなくて困っています。 解決しました。関数使えますね。変数はまだ試していませんが、たぶんダメでしょうね。 Includeのようなことはできないでしょうか?
参照設定ではありません。
現在、ユーティリティ関数を集めたxlamファイルがあるのですが、中身が膨れ上がってきました。
機能単位でファイルを分割したいのですが、
そうすると今まで参照設定でutility.xlam1つで済んでいたのが、
utility_picture.xlam
utility_text.xlam
utility_workSheet.xlam ...
と、いくつも参照しなくてはならなくなります。
utility_xxx.xlamをすべてインクルードした1つのファイルを作り、
それを参照すればすべて使える、というようにしたいのです。
こういうことはできるでしょうか。 >>451
ひとつのxlamがいくつの標準モジュール、クラスモジュールを持ってるの?
VBAでそんなに大きくなるイメージがいまいち湧かないんだが なんでも詰めこめばいくらでも大きくなるだろw
どんだけ貧困なイメージ力だよw なんでも詰め込んで大きくなったならダイエットしろというアドバイスになるだろw >>451
そういう運用は良いのかという問題がある。
それぞれのアドインがバッティングしないのなら、そもそもアドイン1つに纏めるべきじゃね?
カテゴリが別だからとか色々理由が有るんだろうけど、その理由がそのままいくつも参照すべきという理由になるだろ。
アドインを1つに纏めるべきかいくつも参照すべきのどちらかじゃね? >>457
・プロジェクトエクスプローラが縦に長くなりすぎて使いづらい。
・巨大なクラスになるとfacadeパターンを使って分割しているのですが、
その際に処理を委譲するクラス名にxxx_reader, xxx_outputter等つけています。
ファイルを分けられれば単にreader, outputterで済むのですっきりさせたい。
この辺が分けたい理由です。
触るのが久しぶりだったので忘れていたのですが、a→b→cで参照が連鎖している場合、
a→cの参照がないとaからcの関数を呼び出せないだけで、プログラム自体は動くんですね。
いくつも参照でやってみようと思います。
>>453
単一目的のマクロ(そのutilityを呼び出す側)はそれほど大きくならないのですが、
画像操作、データシート処理のラッパー、デバッグ機能など
汎用的に使える機能をutility一つにまとめて行ったら大きくなってしまいました。
この辺を別ファイルにしようと思っています。 どうせ使う時は全部必要なんだろw
無駄なことすんなw 使うときは割と全部必要ですが、細かく分かれていないと
機能追加やリファクタリングが面倒なんですよ。
モジュールをディレクトリ分けしてツリー構造にするような
ことができれば一番いいんですが。 出来るかどうか知らんが
親のユーティリティで子を自動的に参照設定すればいいんじゃね
たしか参照設定もVBAからいじれたはず Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim objMe As Recipient
Set objMe = Item.Recipients.Add("domon@sapporotakusho.co.jp")
objMe.Type = olBCC
objMe.Resolve
Set objMe = Nothing
End Sub
検索すると出てくるこのプログラムだと、
再送しようとした場合、BCCが複数追加されてしまいます
Outlookで自動的にBCCを設置するプログラムは調べたら乗っているのですが
BCCに既に設定したいアドレスがあった場合は追加処理をしないというプログラムを追加したいです >>463
変数objMeを宣言している行の直前に以下の処理を追加
Item.BCCプロパティに設定されている文字列を取得して、その中にdomonなんたらっていうアドレスが含まれているかどうかをInStr関数で調べる
含まれていたらExit Sub ありがとうございます
間違えてメールアドレスそのまま載せてしまいました
やってしまった…
もう一度頑張ってみます VBAとPythonが併用できるのかな?
前例あるの? python入る言うてもどのバージョンかとかライブラリかとかアップデートはするのかとか色々課題あるだろ 質問なのですが、別表の項目から他の表の項目(セルの位置)にデータを飛ばしたいんですが、できますか? ×ご教授
○ご教示
あと、見も知らぬ他人にタダで教えてもらうんならそれ相応の作法は必要じゃないのって、端で見てて思う >>472
もっと具体的にどんなのが作りたいか書いてもらわないと難しいです。
5列目を変更した時に同じシートの1列目を選択するようにしたい、とか。
あるいは、別のシートのA1セルを選択したいとか。
飛ばすといっても、そのタイミングが変更した時なのか、選択したときなのか、特定の数値が入ったときなのか。 こんな感じの表Aがあって、似たような表Bが別シートにあるんですけど、
表Aのセルの色を付けると同時にB表のセルのイロを変える
または、セルの文字も一緒に持ってくる
できますか?
https://i.imgur.com/u3mc1ot.jpg できるけど、コード教えてもらって、それを標準モジュールなり、sheet1モジュールなりに書き写せます?
それを使いやすいように改良できます? できるって書いたけど、色を変えるのをイベントにするのは無理だから、マクロをボタンに登録するか、何かほかのイベントに割り当てるかしないとダメだわ。 >>482
お忙しいのにみなさんありがとうございます
ちょっと詳しく説明すると、こんな感じです
左のsheetの表は一項目につき3段、その3段目の情報で仮にA,Bが記載されてある色つきのセルの情報のみを抜き出し、右にある別sheetの表に反映させたいのです
分かりづらかったらすいません
どのように組めば行けるのか、詳しく教えて頂くとありがたいです
https://i.imgur.com/M5bti06.jpg おわび
御貴兄たち、何卒添削お願いします。変数colとかrowのほうが良かったな
Const OFFSET_X = 1
Const OFFSET_Y = 1
Const BLOCKS_Y = 3
Const WIDTH = 6
Const HEIGHT = 6
Private Sub CommandButton1_Click()
Dim src As Worksheet
Dim dst As Worksheet
Dim x As Integer, y As Integer
Dim des_x As Integer, des_y As Integer
Set src = ThisWorkbook.Sheets("sheet2")
Set dst = ThisWorkbook.Sheets("sheet3")
dst.Cells.Clear
des_x = 1 + OFFSET_X
des_y = 1 + OFFSET_Y
For y = 1 + 3 To HEIGHT * BLOCKS_Y Step 3
For x = 1 To WIDTH
If src.Cells(y, x + OFFSET_X).Value <> "" Or _
src.Cells(y, x + OFFSET_X).Formula <> "" Or _
src.Cells(y, x + OFFSET_X).Interior.ColorIndex <> xlNone Then 'エラー判定は無し
src.Range(src.Cells(y, x + OFFSET_X), src.Cells(y, x + OFFSET_X)).Copy _
Destination:=dst.Cells(des_y, des_x)
End If
des_x = des_x + 1
Next x
des_x = 1 + OFFSET_X
des_y = des_y + 1
Next y
End Sub これ色付き以外のセルにも文字列は入ってるんだよな? あー〜スマン
>表Aのセルの色を付けると同時にB表のセルのイロを変える
この仕様を見逃してたわ
見なかったことにしてくれ >>487
入ってます
欲しいデータは1色で統一されてますが
ちなみに他に文字が存在しており、それらはほかの色で存在しています
>>488
お手数お掛けしております
ほんとにありがとうございます
色で判断をなくして、(条件で変えるので)>>483に書いてある欲しいデータ4種類を転記させるものでも良いのですが、難しいでょうか パソコンで見たら見えた。
これ、変更したところだけ反映したいの?
それとも、元表の3行目全てを反映したいの?
というか、データだけなら=で結べばいいのでは? >>491
そこまでして見ていただいて申し訳ないです
三段目だけを反映させたいのですが、その手書きの表の列、行ともに結構長い表なのです
手っ取り早く一瞬で作れたらと思って質問した次第です Excel VBAスレいけば寄ってたかってみんなで教えまくってくれんじゃね?行けば? >>493
いまはゴキブリが湧いてるからあっちは行かない方が良さそう >>492
結構長いというけど、どれくらい?
数十列数十行くらいで、1回だけなら右にオートフィルして、行ごとコピペするのが早いと思う。
=で繋ぐだけなら1回やっておけば、あとは自動でかわる。
マクロでやるとしても、数式で=を入れればいいのか、値を持ってくるようにした方がいいのか。
表の範囲指定はどうするか?
current.regionか、usedrangeか、直接指定するか。(元の表に罫線が引いてあるか、空欄があるかで変わってくる) 数式だって絶対参照、相対参照をきちんと意識して書けばRange=数式でアドレスに併せて変えてくれるから1回の代入で終わる。
以外と知らずに1セルずつ代入する人もいるけど。 >>495
3段目に毎回同じ文字がくるとは限らず、最低3種類の文字がくるので、とりあえずif分使って作成しました
横に日数1年分、縦に各項目50程です
絵にある通り、全く同じ表をコピペして使いますが(線あり)、ほんとは転記先の表は1段で済ませたい所でした
日替わりで最低3種類のうちのひとつが返ってきたらいいので
わかりづらくてすいません >>496
そうなんです
やり方を知らないので今は1セルずつ代入しています >>498
fast-uploader.com/file/7072682105190/
目的のものと全然違うかもしれないけど作ってみました。
データの最初のセルだけは自分で指定してください。 >>499
乙です
老婆心ながらアップする前に「ブックの検査−ドキュメント検査」したほうがよろしいかと。 >>499
見れないのですが、消されたのでしょうか >>498
やり方も何も、例えばA1からA列に1、2、3、・・・と入力されてるとしてRange("B1:B10").Value="=A1"を動かしてみな。
全部A1を参照したいならRange("B1:B10").Value="=$A$1"とする。
本当はValueではなくてFormulaだけどValueでもちゃんと相対参照してくれる。 fast-uploader.com/file/7072704922415/
パス 0128 >>504
>>505
みなさん、無知ですみません
ほんとに助かります
ありがとうございます
>>505
ひとまずダウンロード致しましたので明日内容を確認します
お時間割いて作っていただいて、ただただ感謝です
おやすみなさい 下から5行くらいにtext ってあるの、valueに直した方がいいかも。
textでも問題ないかもしれないけど。 おはようございます
昨日ダウンロードさせてもらったファイル開かないのですが、どうやったら開きますか? エクセルのバージョンは?
当方2013で開けましたよ。 >>509
2010です
すいません、どうやって開きました? プログラマですがvbaの初心者です。
C,java,lisp,python 基本的な言語とその意味論はだいたい知ってます。
vbaで書籍を探すと、大抵業務問題の解決という文脈で本が書かれているようですが
純粋に言語的な機能を抽出した言語仕様、あるいはリファレンスに相当するものを求めています。
そのような書籍のうちもっとも簡潔に記述されているような本はないでしょうか? >>511
本職のPGならマイクロソフトのディベロッパーセンターの英語版リファレンスを直に読んだ方が良い
あと、場合によってはVBAとほぼ同じシンタックスになってるVB.NET用のMicrosoft.Office.Interopクラス以下の各アプリケーションのオブジェクトのリファレンスの方が役に立つこともある VLOOKUP関数の応用で、2列のリストがあり、検索セルではどちらかを入力するともう片方が入力されるものをVBAで作りたいのですが、、、 >>514
左をキーにしてvlookup 、次に左をキーにしてvlookup すれば良いんじゃないか?
右と左に同じ内容が存在するとダメだけど。 グラフを作成するときにXValuesってすべての系列で統一しないといけないんですか?
x1={0., 1., 2.}, y2={0., 1., 4.}
x2={0., 0.5, 1., 1.5, 2.},y2={0., 0.25, 1., 2.25, 4.}
みたいな2つの系列があったときにplot(x1,y1), plot(x2,y2)みたいに扱いたいのですがどうしたらいいでしょうか 特定のフォルダ内のすべてのブックにC列に複数存在する特定の文字列『a』のすべてに対して右隣のセルに文字列『aa』を入力して、さらに同じシート内でC列に複数存在する特定の文字列『b』のすべてに対して右隣のセルに文字列『bb』を入力するようにしたいのですがどのような感じになりますでしょうか? ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ vbacでmdbファイルをcombineしていると、「このアクションを実行するとプロジェクトがリセットされます。実行しますか?」というダイアローグが出てくるのですが、回避策をご存じの方いますか? VBA初心者です。
省略可能なキーワードOptionalに関して質問がございます。
・質問内容
以下のコードにおいて、なぜ"ABC"が2回繰り返されるのでしょうか?
Optionalで指定した1が初期値としてtmpに格納され、For〜Nextステートメントの処理が0〜1となり、回答は”ABC”のみだと考えました。
・コード
Sub Sample1()
Call Sample2
End Sub
Sub Sample2(Optional tmp As Long = 1)
Dim i As Long
For i = 0 To tmp
Debug.Print "ABC"
Next i
End Sub
基礎的な質問で恐縮ですが、ご解説いただければ幸いです。
よろしくお願いします。 >>522
0も1回と数えるから、i が0の時に1回、1の時に1回、合計で2回です
For i = 1 To tmp
にすれば1回になるよ >>523
解説頂きましてありがとうございます。
0も1と数えるのはややこしいですね。。
しっかり復習します。 配列は0スタートとか知っておいたほうが良い(VBAの場合はOption Baseで切り替えられるけど) >>524
理屈で覚えればややこしくはないぞ。
配列の添字は距離のようなもので、「当該配列の1個目の要素のポインタを起点としたときに、そのポインタにどれだけ(何回)加算した場所に、その要素の格納されているメモリが存在するか」を示す数字。
1個目の要素から1個目の要素に移動するための加算回数=距離は0だから、1個目の要素にアクセスするときの添字は0になる。 >>514
if文でセルの指定範囲の時実行で1列目の時と2列目の時で分けたらどうですか? >>525
0スタートどころか-100スタートとかも可能 こればかりはプログラマーを混乱させるために導入されたとしか思えない謎仕様 >>531
配列添字の範囲指定なんてPascalの時代からあるのにバカって悲しいな w >>529
C#だとint[] intArray = new int[2]で要素は[0] と[1]になるんだが、
vbaだとdim Array(2) as Longが0,1,2の三つになるからたまにコンパイルエラーで悩む。Collectionは一から始まるが
Dictionaryは0からというのもたまに嵌る。 >>534
> vbaだとdim Array(2) as Longが0,1,2の三つになるからたまにコンパイルエラーで悩む。
0,1,2になるか1,2になるかはOption Baseによる
コンパイルエラーは意味わからんが
>>533
お前が黙っとけよ w ExcelのCellsの添え字が1オリジンだからデフォルトで使うしかない >>535
cell番地が1から始まるからbaseも1じゃなきゃ書けないバカはレス禁止 Cellsはコレクションオブジェクトを返すプロパティ関数だから、インデクサが1オリジンなのは文法上当たり前 >>540
配列の話してんだよバカチョン黙ってろや >>539
誰にレスしてんだよ、ボケ w
>>540
アホすぎ、そんなもん仕様によるだろ Excelが開発された当初はまだ0の発見前だったからだろ。
今作るなら0から始まるようになる。 こんばんは! おしえてください!
VBAでフリーフォームを書いたり、既にあるフリーフォームの頂点編集をしようとしています。
書く方は上手くいって、Shapes.BuildFreeformに、AddNodesコマンドで10点頂点を追加して、
楕円を書きました。
続いて、頂点の編集を行うべく、書かれたshapeのnodesや、Verticesで頂点情報を取得したら、
なぜか30点あります。ベジェ曲線で描かれた頂点の座標はもう残っていないのでしょうか?? こんにちは。
VBA初心者です。
Excelで知恵袋のような社内用のQ&Aを作成中です。
質問フォームに入力すると質問が縦に書き込まれていくところまで作りました。
しかし回答を質問に対応させることができません。
回答は対象の質問の横に入力されていくように作りたいですが、どうしたらよろしいでしょうか。
教えて下さい。
分かりづらいかもしれませんが、下記のように作りたいです。
質問1 回答1 回答2 回答3…
質問2 回答2-1 回答2-2…
質問3 シートを別にする
質問ごとにIDを振って回答にその質問IDを保持させる htmlからidやnameに属さない、独自の名前を付けられた値を取得したいです。
<li id="result_1" result-rank="1" data-original="hoge">
<li id="result_2" result-rank="2" data-original="fuga">
・・・
<li id="result_123" result-rank="123" data-original="hage">
data-original="hoge"の「hoge」を取得したいです。
常にidのresult_1を取得したいわけではなく、またidの値も検索結果によっては変動します。
data-originalは必ずliタグの中にあります。
htmlは変更できません。
ウィザード級の方々何卒お力をお貸しくださいませ。m(_ _)m ExcelVBAの質問です
adodbStreamを使って、jisコード(ISO-2022-JP)で書かれたテキストファイルを読み込んで色々するマクロを作っています
対象のテキストは1行120バイトのレコードが何行も含まれるという体裁になっているファイルです
このファイルを入力ファイルに指定したところ、なぜか3行目のみ最初の12バイト分が読み込まれません
レコードの内容を変えて何度か試してみたのですが、決まって3行目のみ行頭の12バイトが抜け落ちてしまいます
adodbを使う際に何か必要なことがあるのでしょうか? Webにあるスクリプト入れても動いたり動かなかったり
厳しいね、これは。 ファミコンゲームを再現したいんですが、単純な構造のゲームってありますか? シート1のA44:I44のセルの内容を、マクロでシート2の最後列に貼り付けていきたいです。
下記のマクロだと、シート1のA44のセルをシート2の最後列のAのセルにのみ、コピーするだけになってしまいます。
どう変更すればいいのか、よかったら教えて頂きたいです。
よろしくお願いします。
Sub テスト()
Dim LastRow As Long
With Worksheets("シート2")
LastRow = Worksheets("シート2").Range("A"&Rows.Count).End(xlUp).Row + 1
Range("A"&LastRow).Value=Worksheets("シート1").Range("A44:I44").Value
End With
End Sub >>556
Resizeで貼り付ける範囲を広げてあげる
幅を9セルにしたいならResize(, 9)って付け足す 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
HCSP8 シートにボタンがいくつかあって、押したときの処理が結構複雑なんです
とりあえずclickedをシートモジュールに書いて、そこから呼び出される関数も全部シートモジュールに書いたら分量がすごいことになりました
やっぱりクリック検出だけにしぼって残りは全部標準モジュールにすべきなんですかね。そのシートでしか呼び出されないわけで分けるのも分かりにくいような気もして >>563
Excel2003までのツールバーにメニュー追加するコードを書くと2007以降ではリボンにメニューが追加されるけど違う話かな? Access2016でコンボボックスの規定値をnullから1へ変更したくて
フォーム!コンボボックス.DefaultValue = """1"""とするフォーム上は1と表示されるんだが、プロパティーシート上は全く変化なくて、フォームをとじてから開くと規定値が変わっていなくてNullのまま。
VBAからは既定値の変更が出来ないのかな? フォームを閉じるときに変更を保存しなけりゃ普通に考えてもとに戻るわけだが ここはjscriptはアカンけ?outlookをjsで弄りたいんだが Wordで読みとり専用推奨で保存されてるファイルをVBAで書き込み可で開いて編集して上書き保存したいんですが、やる方法はありますか? マジだったカオスと思ったが
開くと読み取り専用か聞いてくるのか
まあ、OS側でなくワード側で制御してそうだから、回避は厳しそうな気がする カオス言いたい年頃なのでどうか大目に見てやって下さい カオスは天地が分かれる前の状態 あるいは光と闇が分かれる前の状態 >>576
VBAを使わずにファイルを開いてダイアログのウィンドウをつかまえて「いいえ」ボタンにメッセージを送るという力技ぐらいしか方法はないんでしょうか?
Excelでは開くときにIgnoreReadOnlyRecommenedというのを指定すれば良さそうなんですが document.openメソッドにも引数readonly があるみたいだけど >>581
ReadOnlyにFalseを渡しても読みとり専用で開かれるのは確認済みです >>574
ありません。
Wordは手動でやるしかない。
Excelとは違いますから。 >>580
VBAでもその力業で出来るけどね。
でも読み取り専用推奨で保存する目的はそのメッセージを出すことにあると思うからそれをスキップするコードを書くべきかという問題もある。 >>582
すくなくともうちの環境では、ReadOnly:=Falseで書き込み可能で開いてるけど?
その状態からReadOnlyRecommended = Falseにして保存したら、読み取り専用推奨は外れてるが
まあうちの環境がかなり古いから最近では出来ない可能性もあるが
それホントに推奨なだけなのか? >>586
じゃあ2010から出来なくなったんだな
うちの2007ではできてるから
ただそこの文書
Note The following example applies to Word 2003 and 2002:
とか書いてあるな
Last Updated: Apr 19, 2018
らしいけど、適用対象バージョンがよくわからんな ACCESSでオートルックアップクエリを使用したフォームでマスタにないものを入力した際、
フィールドとキーが一致しているレコードをテーブルで探すことができません。
と出ますが、マスタにないデータを入力しようとしたとき、上のメッセージを出すことなく、マスタ登録用フォームを呼び出すにはどうすればよいでしょうか?教えていただけると助かります。 スパークラインをVBAで挿入したいんだけど範囲指定のところがうまくいきません。
わかる方いたら教えてください。よろしくお願いします。
call cells(10 , h ).SparklineGroups.Add(xlSparkLine, "n5: n100")
"n5: n100" のところなのですが、
range(worksheets(h).cells(14,5) , worksheets(h).cells(14 , G ))
のようにして ワークシートごとの数値群をスパークラインにしていきたいのですが、、、
何か良い方法を教えてください。
よろしくお願いします。 質問
Outlook2010なのですが
受信トレイの検索(Ctrl+E)で「請求書」を検索するのと同じ動作を
VBAにしたいのですがどのように記述すればいいのでしょうか
ボタンに登録して使うつもりです。
OutlookVBAを使うのは初めてでしてお手引きをお願いいたします VBAで質問です
【前提】
・デスクトップにフォルダA
・フォルダAの中に9月1日分のExcelファイル"0901"とマクロ作動用の.xlsmファイル
【したいこと】
・フォルダAの中に9月2日分のフォルダ"0902"を作成
・"0901"を開き、B2セルの2018/9/1を2018/9/2に書き換え
・フォルダ"0902"内にファイル名を"0902"にして保存
日毎のレポートのひな形を作ろうとしています
あまり知らないながら書いてるのですがエラー出まくりで泣きそうです >>590
Application.Searchメソッド、もしくは
Application.Session.GetDefaultFolder(olFolderInbox).GetTable(DASLクエリの引数) を使えば良いのでは >>591
悪いこと言わないから、手でやるか詳しい人に頼みなさい
複数のブックが同時に開かれている状態でのVBA処理には
いろいろ面倒なところがあり、経験が必要
5ちゃんでサクっと説明できるものではない
しかもフォルダ処理も伴っているので、エラー処理を含め
きっちり作ろうとするとけっこうな規模のアプリになってしまうと思う >>591
thisworkbook.path\フォルダA\0901を開いてあとはブック名から指定して必要事項を書き換え。
ブック名を指定してsaveAsで
thisworkbook.path\フォルダA\0902で保存。
蛇足だが、必要無くともブックもシートも常に指定した方が良い。 >>591
とりあえず作ったコードを晒せば色々添削してもらえるかと
>>593
回答できないなら黙ってなよ おそらくやりたいことはこんな感じだろう。
0901ファイルを開いた状態で、9月2日当日にレポートを作成する前提。
0901ファイルを修正するという話だったからその通りにしたけど、本当ならここはテンプレートファイルから書き起こすようにするべきだと思う。
テスト実行してないので、エラーが出たらごめんなさい。
Sub CreateDailyReport
Dim Report As Workbook
Set Report = Application.Workbooks("0901")
'テンプレートから新規ファイルを作成するなら以下のように変える
'Set Report = Application.Workbooks.Open(テンプレートのパス)
Report.Worksheets("Sheet1").Range("B2").Value = Format(Date, "yyyy/mm/dd")
Dim PathString As String
PathString = Thisworkbook.Path & "¥" & Format(Date, "mmdd")
If Dir(PathString, vbDirectory) = "" Then MkDir PathString
Report.SaveAs PathString & "¥" & Format(Date, "mmdd") & ".xlsx"
Report.Close
End Sub >>592
Application.AdvancedSearchして
Searchオブジェクトを検索フォルダーにSaveするっていうことですかね
単純にVBAでCrtl+Eのクイックサーチ(?)する方法があればと思ったのですが
無理っぽいですね
ありがとうございました 初歩的な質問でごめんなさい
うまくできません
If IsNumeric(myN) Then
Range("A1").Value=Range("A1").Value + myN
End If
myNが1の時と2の時があるとしてセルA1の値を3にしたいのですが
やってみると12っていう風に数字が並んでいってしまいます
どうしたらいいでしょうか >>599
もしmyNがString型、あるいはObject型に文字列データが入っている場合は数値型に変換する必要がある
Range("A1").Value = Val(Range("A1").Value) + Val(myN)
でいいんじゃないかな >>600
String型になっていました
参考にしてもっと勉強します
お付き合いくださりありがとうございました 超初心者です。
Googleの検索窓に「VBA」と入力する サンプルコード
(https://vba-code.net/ie/set-value-to-textbox/) を実行してみましたが、
objIE.document.getElementById("gbqfq").Value = "VBA"のところで
「実行時エラー 424 オブジェクトが必要です。」となって動きません。
「標準モジュールに以下のコードを追加して」の意味が分からないので、
標準モジュールをどう書いたらよいのか、どこに追加したらよいのかわからず
サンプルコードのみを実行しました。
どなたか親切な方、対応方法を教えてください。
難しいことはわからないので具体的にコードを書いてもらえると嬉しいです。
よろしくお願いいたします。 >>602
>>objIE.document.getElementById("gbqfq").Value = "VBA"
objIE.Document.getElementById("lst-ib").Value = "VBA" >>603
ありがとうございます!
できました!!!
なんか分からないけど動いて嬉しいです!
頑張ります。 >>604
おう頑張れ!わからんかったらまたいつでも聞いてくれな! >>605
ありがとうございます!
同じことを別のホームページでしたくて、
URLと入力するところを変えてみたのですが、
実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていませんとなって動きません。
ホームページは
https://www2.smile-etc.jp/NASApp/etcmlg/MlgReq;jsessionid=0001kXELRCuGax2mjI7VtXa12rz:15fqn57ku?gvlddpef=1011100000&mdwsetmb=1011120000の画面でしたくて、
入力するところは
objIE.document.getElementsByName("Name1Kana").Value = "マイレージ"としてみました。
お時間あるときでよいので出来たらお願いします。
仕事で毎日同じような入力ばかりしていて自動化できるところをできたらいいなと思っているのですが、超初心者にはハードルが高くて難しいです 涙
' getElementById("gbqfq")
getElementById("lst-ib")
君は、この違いがわからないの?
HTML, DOM, CSS, JavaScript とか知らないの?
VBA には関係ないのだけど。
全言語・プログラミングに共通の話題なんだが HTML に書いてある、ID だよ
ウェブページは、HTML(DOM), CSS, JavaScript で出来ている。
ブラウザでF12 を押すと、開発者ツールが起動するだろ
これらを知らないと、ウェブ開発はできない!
VBA とは、全く関係ない >>609
>>609
知識もないのに場違いな質問をしてしまいすみませんでした。ご親切にありがとうございました。 >>606
自己解決して、自動入力マクロができました!ありがとうございました。 VBAでできることはC#でもやることはできますか? それにしても、なんで、マクロはFunctionしかcall出来ないんだろうね。
無駄にFunctionを作らないようにと英語の本には書いてある。Subで済むもをFunctionにするなと書いてある。
なのに、マクロの仕様のために、無駄にFunctionをつくったり、SubをcallするだけのFunctionを作ったりしないといけないのは間抜けな仕様だと思うがどうだろうか? >>614
それもC#で可能
>>615
ちょっと何言ってるかわかんないですね >>616
マクロからSubをCallできないのは知ってますか? >>617
知らないです
私の知ってるマクロだとsubもcallできるので >>616
本当に?
ワークシートからDLL関数をCallするためのインターフェースだけはVBAネイティブのFunctionとして書かなきゃいけないと思ってた
ワークシートから直接C#ソースの関数をCall出来るってこと?
>>615
SubもCall出来る
というかSubは本来Subroutineのことを指すのでそもそもCallできなきゃおかしい あれ?エクセルは出来るの?
アクセスは駄目なんだよ VBAしか使わない人間は、WinAPI使わない人間はSubしかCallしない。 なんでAccessはマクロからSubを呼び出せない仕様なんだろうか? ほんとに?MSのサイトに対処方法が書いてあったけどなあ。
仕事で使ってたmdbでエラー出まくってSubをFunctionに書き換えた記憶があるけどなあ 意味が分からん。
ExcelだろうがAccessだろうが当たり前にできる。
やり方間違えてるだけだろ。
lngRet = FuncA("何かの引数")
Call SubA("何かの引数", "何かの引数2")
これはできる。
SubでCallを省いた場合に
SubA("何かの引数1", "何かの引数2")
とするのは出来ない。
Callを省く場合は
SubA "何かの引数1", "何かの引数2"
とする。 >>627
AccessとExceの用語の違いが問題かもしれません。
Accessだとマクロのデザインビューで新しいアクションの実行→プロシジャーの実行を選択→プロシジャー名を指定という流れです。
ここでSubを入れるとエラーになり、Functionを入れると実行されます。
全く同じ動作でもSubだとエラーでFunctionだと実行されるという謎仕様のことです。 >>628
Accessマクロの「プロシージャの実行」機能は、Functionプロシージャに限ってアプリ経由でコールバックさせることができるっていう一種のリフレクション機能だから、仕様上Subプロシージャを呼べないのは当たり前
でも普通はVBAその他一般のプログラミング言語の話題でCallするとかコードを呼び出すとか言う場合、プログラムのコード中で他のプロシージャ(=メソッド)を呼び出すこと一般を指す
AccessだろうがCallステートメントでSubを呼べないわけがない
全然話してる内容が違う MSの提示する対処方法
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/runcode-macro-actionから抜粋
>>[!ヒント] Visual Basic で記述した Sub プロシージャまたはイベント プロシージャを実行するには、Sub プロシージャまたはイベント プロシージャを呼び出す Function プロシージャを作成します。
>>その後、 RunCode アクションを使用して、Function プロシージャを実行します。 >>630
そうなんですか?Callという言葉の使い方が悪かったのですね。
Accessのマクロのプロシジャーの実行からSubを実行できないという表現が適切なんですね。
それにしても謎仕様ですね。いちいちCall_SubみたいなFunctionを作らないといけないなんて馬鹿らしいですよね。
Subを使うのを止めて戻り値を使わないのになんでもかんでもFunctionにしている人がいるのはこのあたりにも原因があるのでしょうかね。。。 C#やJavaなどの言語にはfunction相当の構文しか存在しないから、それに合わせてるだけかも サブルーチンというものは、マクロ上での繰り返し処理や重複処理が必要な場合に同じコードを何度も記載することを回避して、プログラムの再利用性と簡潔性とメンテナンス性を高めるためのもので一種の共通部品で呼び出して使えるためとても便利。
その代わり呼び出し側のコードが必ず必要。 たとえ1回しか使わなくても、機能ごとに分けて名前を付けることでコードの見通しを良くするという目的もある ・Accessのマクロの「プロシージャの実行」機能は要するに「関数を実行する」ことに重きを置いている機能なので、関数ではないSubプロシージャは呼び出せない。
・「呼び出す」と「Callする」は意味が(あるいは受け取り方が)違うので下手に知ったかぶりしないこと。 >>638
関数という言葉の定義次第ではSub Procedureも関数の一種になるぞ
あと、Accessマクロの実行機能に関する話題でマクロピッカーからプロシージャを直接選択して実行する操作を指して「呼び出す」とか「Callする」と表現する例は比較的稀だと思うぞ 数学的な定義だと関数は一対一の写像だから戻り値がないものは関数ではなくなってしまう
丸投げアウトソーシングとでも言えばいいのか >>641
その理屈だと、Function Procedureが戻り値なしの記述を許容していること、戻り値と全く論理的な二項関係がない処理をFunction Procedureの中に書けてしまうことを考えた場合、Function Procedureが果たして関数と言えるのかどうかということの方が怪しくなる それはプロパティとメソッドについても言えるわけで。
意味合いから使い分ければ良い。
Accessの仕事してるけどいわゆるAccessのマクロ機能は嫌いなので殆ど触ったことないな。 >>640
マクロからVBAプロシジャを実行するのを、呼び出すと言うのはすごく一般的だとおもうが
むしろ呼び出す以外にどう言うんだ
>>642
戻り値を指定しないFunctionだって戻り値はちゃんとあるんだが
まあそもそもプログラミング上でいう関数は数学的定義の関数ではないんだがな
>>643
一般的なプログラム用語としてはそうかもしれんが
VBAや旧VB,VB.NET,C#なんかはプロパティはメソッドとは別な構文で定義されてる
VBAの話するならちゃんと区別しれ vba初心者でわからないところがあって質問したいんですけど、ここで大丈夫ですか? ExcelとAccessは専門スレが別にあるけどな >>647
その宿題をやるには「フォームの作成」という作業が必要で、それは文章だけの掲示板じゃとても説明できない 二次方程式 VBAのキーワードでぐぐればそれなりに情報はあるよ 学校でExcelの課題出るのか
全員Excel入りのWindows機もってる前提なのか なきゃ学校にあるPC使うだけやんけ
変な事気にする奴やな >>653
商業科の電卓名人みないな奴は、もぅおらんのか VBAで3つ数値があった時、最大値を表示させたい時
下記URLのNo.4の回答のelseifを使ったものがありますが、
elseifを使わずにelseだけで表示しようとすると、
どのようになるのでしょうか?
宜しくお願いします
ttps://oshiete.goo.ne.jp/qa/5352661.html 分かりづらそうなので追記で、下記のところです。
宜しくお願いします
a = 10
b = 200
c = 30
Max = a
If b > Max Then
Max = b
ElseIf c > Max Then
Max = c
End If Max = a
If b > Max Then
Max = b
Else
If c > Max Then Max = c
End If >>658
ありがとうございます
試してみたいと思います そもそも657では最大値求められないだろ。
なぜ他の2つと比較してから決めないのか すいません、まだ初心者でまだ理解が追いついていなくて
とりあえず最大値求めるにはこういう形...とかで覚えようとしてて....頑張ります 658でも最大値は求められない
試しに
a = 1
b = 2
c = 3
で試してみるといい。Maxが2になってしまう
Ifだけでやる場合の正解の一例
Max = a
If b > Max Then Max = b
If c > Max Then Max = c >>661
If Elseの構文は、最初のIfの条件が成立したらElse以降は処理されずEnd Ifまで飛ばされる
つまり、
a = 1
b = 2
c = 3
だった場合、
b > Maxが成立したらc > Maxの部分は飛ばされてしまうからMaxは2のまま終わってしまう elseやelseifは先行条件でTrueにならない場合にしか実施されない仕組みなことを理解しましょう >>661
このレベルを形で覚えようとしている貴方にプログラミングは向いてない ID変ったかも知れませんが>>656です
皆さんありがとうございます
>>665
手痛いレスですが、出来るところまで頑張ろうと思います。プログラマーではないですが基本は覚えないと連携し辛い位置の役職のため頑張ります。 本当のプログラミング初学者なら仕方ない。制御構文なんてどの言語も似てるので、1つ覚えれば次は勘が効くようになるよ、長い目でがんばりなされ 最大値を求めたいならWorkSheetFunction.MAX使えば良いんじゃね? パニックを、5人がかりでやれば楽勝だろ、とか言ってるようなもの。 VBA初心者です。少し長くなってしまいますが質問です。
・やりたいこと
1:現マクロ有効ブックのsheet1にフォームボタン設置する。
2:押すとC:\Users\Public\動物まとめ.xlsx をバックグラウンドで開き、その中のシート名"カピバラ情報"の E列4行目から5行目6行目...と、空白が来るまでの情報を取得しする。
3:現マクロ有効ブックに新しくsheet2を作り、その新シートのA1からA2A3...に取得した情報を書き込む。
現在のマクロは下記ですが上手くいかないです。
Option Explicit
Sub practice()
Dim i As Long
i = 4
Dim fullPass As String
'セルのB3に C:\Users\Public\動物まとめ.xlsxと記述
fullPass = Range("B3")
Dim wb As Workbook
Dim Anothersheet As Worksheet
Workbooks.Open fullPass
Set Anothersheet = wb.Worksheets("カピバラ情報")
Sheets.Add After:=ActiveSheet
Range("A1").Select
Do While Cells(5, i).Value <> ""
i = i + 1
Loop
Call wb.Close
End Sub
上手く情報を取得できないのでアドバイスお願いします。 >>675
wbに何も代入されてない。
AnotherSheetへの代入もこけるはず。
AnotherSheetが正しく生成されたとしても、その後使用されていないから何かとってこれるはずがない。 >>675
fullpass じゃなくて、fullpath ね。 >>675
行列指定が逆?
5行目を右方向に評価してくような感じになってるけど、新規に作ったシートが対象になってるから、一周もループしてないよね? >>675
Cell値を取るときは、デフォルトにまかせずちゃんとプロパティ指定しよう。 >>675
バックで開いたつもりのブックに新規シート作っちゃってない?
ブックのフォーカスを制御するとか必要かも。 ID変わりましたが>>675です。
>>676‐>>680
遅い時間帯でありながら見てくださって
ありがとうございます。
色々と不十分だったのですね。
指摘箇所を直したりして
また報告しようと思います。 >>675
最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。
ちゃんと省略せずにWorkbookやWorksheetから書くようにする。
しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。
以下はスマホ上で書いてるんで動くかは不明です。 Option Explicit
Sub practice()
Dim i As Long
Dim fullPath As String
Dim wb As Workbook
'Anothersheetじゃ分かりにくいんでopnShtに変更。
Dim opnSht As Worksheet
'追加シートは変数に受けないの?
Dim addSht As Worksheet
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
fullPass = Thisworkbook.Worksheets("Sheet1").Range("B3").Value
'B3に出鱈目書いて動かしたらどうなるんだろう?
Set wb = Workbooks.Open(fullPath)
Set opnSht = wb.Worksheets("カピバラ情報")
With Thisworkbook
Set addSht = .WorkSheets.Add( After:=.WorkSheets("Sheet1"))
End With
'Range("A1").Selectって何の為に有るの?
'iの初期値を一番最初に書いてたけど、初めて見たとき何だか分からんかった。
'使う直前に関連処理と一緒にまとめた方が分かり易いよね。
i=4
Do While opnSht.Cells(5, i).Value <> ""
i = i + 1
Loop
'元のCall wb.Closeなどという書き方をしたことが無いのでいつもの自分の書き方に変更。
wb.Close False
End Sub >>680
フォーカスを制御すべきじゃない。
いきなりRangeやCellsを使うから上手くいかないのであって、きちんとブックやシートから書けばフォーカスを制御しなければならないことは滅多に無い。 早速間違いだ。
fullPassと書いてる所が一ヶ所ある。
fullPathに直しておいてね。 >>684
まぁ、そうかもね。
でも最初はいろいろ試してもいいんじゃない? >>682‐685
ありがとうございます
深夜のご指摘から>>685まで参考にしていて
現在デバッグしてますが、“カピバラ種類”のシートが上手く取得できていないようです。
ちなみに
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
その通りです、分かりづらくてすいません。
改行制限のためいくつかコメントは掲示板に書き込むとき省いてしまいました。
'Range("A1").Selectって何の為に有るの?
ですが 、新シートのA1から書き込む為に書きましたが、デフォルトでA1から書き込むみたいですので
無駄なマクロでしたね。 少し言葉足らずでした。
iのカウント(空白行までループ)は上手く出来ているので、現マクロ有効ブックの新シートに取得情報を
書き込めていないようです。 >>688
うん?
Do〜Loopの中はiのカウントアップしてるだけなので、あなたが省略した(と勝手に思ってるんだけど)コードが動いていないということ?
念のためにいうと、元々のコードには情報を取得するコードが全く無いからこのコードだけじゃ取り込めないのは当たり前だよね。 すいません、
不覚に気づき、
dim j as long
j = 1
を追加し、ループを
Do While opnSht.Cells(5, i).Value <> ""
addSht.cells(j,1) = opnSht.Cells(i, 5)
j = i
i = i + 1
Loop
にして上手くいきました、ありがとうございます。 細かい修正として
j = i
i = i + 1
の部分も
i = i + 1
j = i - ○
のようにして、
無駄にできてしまう空白もなくしました。
お付き合いしてくださった方、
ありがとうございました。 質問です
ワークシート上にすでに引かれている複雑な枠線をコードとしてどうにか変換というか取得できる方法はないでしょうか… >>693
返事ありがとうございます
すみません、私の頭では理解できません…よかったらもう少し詳しく教えてもらえませんか >>694
罫線を描く動作は理解できてる?
マクロ記録で簡単に調べられますよ。
例えば、2行2列選んで、縦横斜め全てに実線入れて
記録されたものを見ればどのような構造で描かれているのか
分かります。
記録の際は、xl〜の定数でよいですが、取得の際は数値で
返ってくるので注意。
調べたければオブジェクトブラウザで調べてもよいですが、
イミディエイトで、?xlThin みたいに簡単に確認する方法も
あります。
でも、取得して使うなら数値のままでもOKです。
ここまではOK? >>695
>>696
会社でとある先人の作ったエクセルのフォーマットがあるのですが、それを使って作業するおばあちゃんが度々壊してしまうのです
セル結合やセルの幅など複雑になっている物なので、壊してしまったパソコンの不得意なおばあちゃんはいつも四苦八苦していて、どうにか入力された数値以外の罫線や列幅などだけボタン1つ簡単に戻せるものを作ってあげたいと考えています
頂いたヒントを元にもう少し頑張ってみます
結局わからなければまた質問させてください
ありがとうございました >>697
シートの保護じゃダメなの?
おばあちゃんには特定セルに数値入力させてるだけなんでしょ? >>697
シート保護で十分みたいですね。
もし何らかの理由で保護できないのであれば、
同フォーマットの隠しシートから書式貼り付けした方が早そう。
セル結合もあるし、1セルずつ罫線情報取得とか効率悪すぎ。 >>698
>>699
それがわかりながらあらゆる所(不規則)を動かさないといけない時があったりで、保護だと都合が悪かったんです
フォーマット自体を大幅に変更できればもっと色々と簡単にできるのですが、それも他のおばあちゃんたちが前の方が良かった〜なんて必ず言うので見た目を崩すことはできません
担当のおばあちゃんorおばさんが変われば書式貼り付けのための範囲選択も上手くできないだろうから(全選択など知りません)また誰かが黙って長時間四苦八苦する事になってしまいます
無駄にすべて最初からやろうとしたりも平気であります
平均年齢49才の職場なので仕方ないんです
誰にも聞かずに戻したい部分を戻せるような、とーーってもわかりやすい説明付きのボタンをユーザーフォーム上にでもいくつか作ってあげたいと思っています
崩してしまうパターンはだいたい把握できているので、それが最善かなと… >>700
いや、だから隠しシートから自動的に書式修復をかければという意味で言うたのですが、、
トリガーはファイルオープンでも、ボタンでも。
試しにやってみたけど、罫線やセル結合は問題なく修復できるみたい。
入力規則とかは引き継げないみたいなので別にケアする必要があるかも。
行挿入、列挿入とかされて座標がかわるようなことされないならこれで十分では?
自分がよくやるのは、表のエリア毎に範囲名をつけて、そのエリア単位で最初に表組みした
ときと同じ要領で表作成を記録していき、コードを整理して修復マクロにします。
これなら起点となるセルが壊されなければ行挿入、列挿入にもある程度柔軟に対応
できるし、式や入力規則の修復も追加できる。
まぁ、利用者は作成者の想定を軽く超えてきますけどね。 >>701
理解力なくてすみません、、、
そしてありがとうございます
そのやり方を取り入れてとりあえず一度作ってみます! ディム a アズ インテジャー
コンスト b アズ バリアント = ファルス
この読み方はあってますか? マジか!
自信なくなってきたわ。
フォー イーチ 〇 イン、スターコンブ、ブイビーナロウ、コンカット、
ナンバーフォーマットローカル、ドゥ ホワイル、イズナメリック、
デカー ファンクション セットウインドウロング リブ "ユーザー32" エリアス、
バイバル 〇 アズ ブーラン、アプリケーション.ハウンド、オプション エクスプリシト。 numeric ニューメリック
alias エイリアス
boolean ブーリアン >>709
>>707が言う通りDeclareじゃね? declare デクレア(デクレアー)
発音記号を見るとディクレィアーなんだけど、音声ではディよりデに近く聞こえる
https://en.hatsuon.info/word/declare パワポでExcelのVBAにある
Application.OnUndo
みたいなことって出来ない? Application.CommandBars.ExecuteMso "Undo" >>716
そっちだね
あるいはパワポの内部変数(たとえば図形のRGB値とか)の変化を検知してイベント上げるとかでもいいんだけども 質問スレでいつも思うんだけど、どんな状況でそれが必要なの?
Excelで出来るんなら、逆にExcelをパワポっぽく見せるという手もあるんじゃないの? 勉強もかねてパワポのアドイン作ってるのよ
だからExcelじゃなくてパワポで出来なきゃ意味がない
その機能自体が必須で欲しい訳ではないから出来ないなら出来ないで諦める 何か斬新な使い方って無い?
ワードでファミコンみたいな。 Functionで値を返すのと、ByRefで返すの、どう使い分けたらいいのか、わからなくなってきた。
どっちでも返せる状況なら、どっちがいい? 他人とか将来の自分が読みやすいようにFunctionで Function一択
ByRefは古い書き方で互換性のために残してる
これから作るプログラムには使うべきじゃない >>721
どちらでもいい状況ならFunctionの方が使い易いのでFunctionにした方がいい
あと>>724はアホだからスルーで ByRefが互換性維持のために存在するという話は聞いたことがないぞ sortのcustomorderって、セル値を入れられたりはするのでしょうか?
複数のセル値を優先順位としてデータを並び替えるマクロを作成したのですが動作が遅いので改善出来ればと考えています。(forとifで判定する手法をとっています)
よろしくお願いします 標準のソート機能で出来ないことでもやるの?
駄目ならSQL使うとか。 さて、名前付き範囲ってVBA@Excelで使えないんだろうか。
もし使えたとして、実行時間はどうなのだろうか。
色々と謎が多い。 >>732
それ使うと後でエラー見つけるのめんんどくさくなる >>732
使えるよ
Application.Namesでコレクション取得して名前つき範囲にアクセスできるし、シートのRangeプロパティの引数ラベルとして名前をそのまま使ってセル取得できる 名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる なんで正規表現?
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない >>737
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う 会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな? >>741
VBAはマルチスレッド非対応だから無理 >>741
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。
1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす
たぶん、こんな感じでできたはず。 >>744
ありがとうございます。
しかし、もし50個URLがあれば50個新しくExcel自体を起動しないといけないのですか?
そんなことしたら激重になってしまうように思うのですが。 複数のInternetExplorer.Applicationのインスタンス立ち上げれば行けんじゃないか >>746
今それができないって会話をしてたところだけど理解してる? >>741
フレームを50個並べたページのHTMLをローカルで作って開けば一気に読み込んでくれる なんか勘違いしてるやつがいるけど、VBAがマルチスレッドじゃないことと、IEを複数開くのはまったく別のことだからな
IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる
IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ >>751
そのプロセスを制御するVBAがシングルスレッドだろ IEにタブをいくつも開いてもらって、みんな読み込んだところでおもむろに順番に処理すればいいってことだろ。 >>752
VBAはシングルスレッドだが、IEでの読み込みは同時並行的にやってくれるんじゃねえの? >>750
?
>>751
その具体的な方法をコードで例示する形で教えていただきたいのでござるよ。
いまだと
Do While readyState < 4
Do Events
Loop
の待ちを50個のURLで1つ1つ順番にやってて
1つのURLを読んでデータ取って閉じる、というのをやるのが社内ネットワークが遅いため(データベースからの読み込みも含まれるからの)1つあたり1分近くかかってる。
だから異常に時間がかかる。
一気に全部同時にやれないかなと。 そんなもんそれこそ流行りのRPAでやればいいのでは そもそも回線が細いのはプログラムでどうこうできないから上司を説得して諦めてもらうしかない 趣味でやってるんじゃなかったら
適当なダウンロードソフト使ったほうが良いんじゃない 動くかどうか試してないけど、こんな感じでいいんじゃない?
もう少し効率を上げるなら、読み込めたページからさっさと処理してもいいし
Sub test()
pg = 50 ' 同時に開きたいページ数
Dim ie() As Object
Dim url() As String
ReDim ie(pg-1)
ReDim url(pg-1)
'ここでURL設定
For i = 0 To pg-1
Set ie(i) = CreateObject("InternetExplorer.Application")
' ie(i).Visible = True '表示しない
ie(i).navigate url(i)
Next
Do
flg = True
For i = 0 To pg-1
If ie(i).readyState < 4 Then
flg = False
End If
Next
Loop Until flg '全ページの読み込み待ち
'ここで読み込んだページを処理
End Sub >>761
ありがとうございます。
試してみます。
最初のFor Nextループがものすごく時間がかかりそうで楽しみです。
あと先日は説明の簡略化のためにシンプルに書いたけど
実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。 >>761
Exit For抜けてますよ
フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います
あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。 >>752
まさかIEオブジェクトの読み込み動作がVBAのスレッドで処理されてると思ってるのか?
>>753
終わりじゃないので考慮点はある
コード書こうかと思ったけど、>>761さんが書いてるからまあいいか
読み込み完了の検出とかどうするか悩みどころではある
イベントハンドラの動的設定か、せめてWithEventsが配列にも宣言出来ればなぁ
まあ50も多重化してもオーバーヘッドかかるだけで高速化しない気がするから
数個固定で持たしてイベントハンドリングするのが現実的かもしれん この場合Do Loopを抜ける条件が全ページの完了だから、Exit Forはあってもなくても結果というかスピードは変わらないね
さっさと抜けたところで、またForループに戻るだけだし
個人的には「pg - 1」が何回も出てくるのが美しくないなあとか、ForとDoの順番を逆にした方がコンパクトになりそうだなあとか 一括処理なら、この方がコンパクト
まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど
For i = 0 To pg-1
Do
Loop Until ie(i).readyState >= 4
Next >>765
> 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか
C言語とかに慣れてるんだろう
VBA的には
ReDim ie(1 To pg)
ReDim url(1 To pg)
For i = 1 To pg
だろうね
可能であればieとurlをTypeで纏めてそれを配列にした方が見易い >>766
ははは、これは笑った。確かにこれが単純明快でコンパクト w >>766
それだとサイズのでかいページで待ちが発生する
Do
For i
If ie(i)準備完了 And i.処理フラグFalse then
処理
処理フラグTrue
カウント
End if
Next
カウント=50 exit
Loop >>769
投げてからの待ちだからいいんじゃねえの?
俺はやったことないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ
で全部取ってから次の処理なら問題ない
でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの
だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは
ばたばたと進んで終了、と理解している >>769
ああ、すまん。それがわかってる上で待ち時間がもったいない、ということね
>>766もそこは注意書きはしているな IEはマイクロソフトも使うなって言ってるのに
VBAって不便だよね IE使えなくなったら、どうやってブラウザ制御するの?
UIAutomation面倒くさいかから、 IE使えなくなったらってもう使ってる人なんていない
セキュリティに甘いとこは使えるのか? ちゃんと動くのか試してみた
たしかにIEが複数開いて、平行処理でページを取ってくるね
VBAのシングルスレッドとか完全に無関係やん 大昔からあるファイルシステムだって非同期読み書きできる
1000倍遅いネットワークで出来ないはずがないだろうが 現実的には50並列で全ページ完了待ちするのはどうもなぁ
あと全力でループまわして完了待ちするのも無反応になるんじゃね
とりあえずDoEvents挟もうぜ
>>776
スレッド以前に、IEオブジェクトが別プロセスだから
アウトプロセスのCOM使うのはVBAで並列やる、おそらく安全で簡単な唯一の方法
まあCOM作る方は大変だがな
>>777
OSがサポートしてるだけで、VBAから使えるかどうかとは別の話
VBAで非同期並列やりたければ、基本的にはイベントベースでしかサポートされていない >>776
これ、1つずつ待つ部分がVBAでマルチにしたいって話だったけどCreateObjectで既に別プロセスだから全部投げてから全部の完了を待つので正解なんだよな。
勘違いしてマルチプロセスでやろうとしちゃったよ。
ついでにApplication.Runで出来なくて、迷ってたんだけど、またまた勘違いでApplication.OnTimeが正解だった。
でもOnTimeって戻り値が取れないんだよな。 あと、ExcelVBAスレにあるようにInternetExplorer.Applicationじゃなくて別のオブジェクトの方が早いと思うよ。 取りあえず書いてみたんだが、1つずつ待っても速度が変わらん。
テスト用に繋げた所があんまり時間が掛からん所でReadyStateのループに入らんのよ。
取りあえずInternetExplorer.Applicationはやっぱり遅かった。
59個のURLから同じ場所にある特定のデータを取ってくる処理でMSXML2.XMLHttpなら5秒のところIEだと60秒くらい掛かった。 IEを普通にUIを持ったアプリケーションとして開けば、クッキーや画面のレンダリングからアクセス履歴の更新やキャッシュの整理までいろんな処理が走るから、そりゃ実質GETだけのXMLHTTPと比べたら遅くなるのは当たり前と言うか
>>785
画像検索にそれぞれ違うキーワードを設定すれば、それなりに時間がかかるようになるから負荷のテストにはおすすめ >>786
そんなことは知ってるが、ここの話で具体的なのがIEだから、いやいや、IEはこんなに遅いですよと注意喚起したんだよ。
まあ、Script関連でIEじゃないと駄目な場合もあるけどね。 真のエクセラーならieなんか使わずにwebクエリーとか使って何とかするべきだろうが getElementByもWebクエリも使ったことあるけど、
Webクエリはどうやって取ってきてるのか謎。 レンダリングしないでペイロードのパースだけやってるんでしょ 誰もSelenium basic使わんの?
IE使わなくていいしセッション維持とかも楽だぉ? readystateが信用ならんのがな
completeになっても完全に読み込めてなくてその後の要素取得処理に失敗とか高確率で起こるし
WinHTTP使うのが確実だと思う >>791
x だぉ
o だよ
正しい日本語を使いたまえ 結局Do LoopとOn Error Resume Nextで逃げるしかないっていう。 >>794
x 結局Do LoopとOn Error Resume Nextで逃げるしかないっていう。
o 結局Do LoopとOn Error Resume Nextで逃げるしかないっていうことですね。
正しい日本語を使いたまえ では、教えてくれ。
正しい日本語の"正しい"とはなんのことだ。
先に言っておくが、国語辞典や義務教育は関係ないぞ。 >>798
国語辞典や義務教育関係ないと言うのならば口語体でも問題ないと思うが…。
例えば力不足、役不足のように意味を間違えて使っていては当然正しい日本語ではないが、今回の様な場合では相手方に伝われば良いということにならないか。 >>796
x 口語体が理解できないやつが正しい日本語とか
o 口語体が理解できないやつが正しい日本語とかどういうこと? 長いのでWithするかSetしましょう。
With 口語体が理解できないやつが正しい日本語
とか = ×
とかどういうこと? = 〇
End With Sub CorrectJapanese()
Dim text As String
Dim inputText As String
text = "口語体が理解できないやつが正しい日本語とか"
inputText = InputBox("あなたの日本語は?")
If inputText = text Then
MsgBox "アホ"
ElseIf inputText = text & "どういうこと?" Then
MsgBox "そのとおり"
End If
End Sub 日付フィルターを使うときにCriteriaに設定する値って、必ず一旦Double型に型変換したDate型データをもとにしてFormat変換しなきゃいけないのかな?
Date関数の戻り値をそのままFormat変換してもうまくフィルターがかからなくて危うくハマりかけたんだが、後学のために識者がいたら教えてほしい >>807
x まともなレスには異論返せないのな
o まともなレスには異論返せないのね VBAで実行時にシンタックスエラーが出るのはどういう場合だろう
デフォルト設定だと1行入力ごとに構文解析するし >>814
それ、1行ごとの構文解析だろ
For Next Do Loop If End If
のチェックまではしてないと思うぞ ああすまん。これってシンタックスエラーではないんだっけ
でもエラーになるよね Nextを書かなかった場合は
「コンパイル エラー:For に対応する Next がありません。」
だった
もしシンタックスエラーのエラーコード(変数Errの値)が存在すれば出る可能性があるってことだと思うけど、コードの一覧てどこにあるんだ?
検索してVBのは出るけどVBAのが見つからん シンタックスって言葉自体は構文規則だけど、コンパイルエラーって出るんだね ExcelVBAでListViewを参照設定で追加して
フォームに配置して使っているんですが、
別フォームからshowしてすでに項目をいくつか追加してある
ListViewのあるフォームを表示したときに
ListViewをアクティブ(そのままの状態から矢印キーで項目を選択できるようにする)
にすることは可能ですが?
例えば
Public Sub UserForm_Active()
With listview1
.ListItems(1).Select
.SetFocus
End With
End Sub
とした場合に、フォーカスは確かにListView1にあるのですが、
その状態では項目が矢印キーの上下で選択することができません。
ListView1.SetFocusではListView1全体にフォーカスはあるが
肝心の中身の項目にはフォーカスがない状態ということなのでしょうか?
なにかよい方法はありますでしょうか? sendkeysで Alt↓までやっちゃうとか
あまりおすすめできる方法ではないが VBA勉強中のものです。
Setステートメントを勉強しているのですが、オブジェクト型についてお聞きしたいです。RangeオブジェクトとかWorksheetオブジェクトなど、いろんなサイトなど見ても使いどころがよくつかめてないです。
どんなときに使うのか、教えてもらえるとありがたいです。 Excel VBA 質問スレで質問してみます。お邪魔しました m( _ _ )m >>823
オブジェクトなら同じものを頻繁に扱うときにコーディングミスをしにくくなる。
毎回、名前でアクセスしていると、ちょっとしたことで、別のものを間違って扱う可能性が高まって、実行時エラーを発生させやすくなる。
定数化していれば防げるが、定数のスコープを大きくしないといけないので、定数の値を変えるときにあっちこっちを確認しながら、直すことになり面倒なことになりやすい。 object型の初期状態はNothing
参照先が存在しない場合もNothing返るのがあってis式で判定できる
一方でvariantの初期状態はemptyなのでis式がエラーになる オブジェクトの値がNothingかどうかで判断するロジックはセンスがいいとは思えない。 Typenameとか列挙定数とかポインタ関数の値で判定するのが良いわな 自分で変数の値をコントロールしているのに、Nothingかどうかをあちこちで確認しているクソプログラマと1年前に仕事した。 >>827
ライブラリ側は何で判定すべきなんだ?
それともNothingを渡されたら挙動は未定義とするとか? >>830
そのライブラリは他人が作ったものなのか?自分が作ったものなのか? ライブラリに状態を持つプロパティがあればいい。
他人が作ったものを使うしかなく、オブジェクトがNothingかどうかでしか判断できないのなら、そうするしかない。 >>833
ライブラリ関数が引数として受け取ったオブジェクトをどうNullチェックするかの話だぞ? いきなりライブラリと言われても何のことやらわからない。 >>835
>>827 が「オブジェクトの値がNothingかどうかで判断するロジック」って言ってるじゃん。
ある関数がオブジェクトを受け取ったときの判断方法の話だと思うんだけど、
自分はライブラリ作者なのでその場合どうするのがいいのか気になった。 >>837
エラーとは限らないけど変数の状態に応じて処理を分けたいと言うのはある。
空のオブジェクトに対してはまた空を返すとかね。
>>829の言ってることはわかるんだけど、>>827と>>828の主張がわからん。
Nothing判定はシンプルだけどTypeNameやenumだともっと分岐のパターンが増えちゃうじゃん。 >>836
世の中、変なやつがいて、オブジェクト変数に値をセットして、何も変わるはずがないのに、直後にオブジェクト変数の値がNothingかどうか判定するコードを書くやつがいる。 代入が成功したかどうか確認するテクニックも存在するから、そういう分野からの転職かな?
具体的には、コンパイラの型チェックを使った裏技だったり、ハードウェアの故障チェックなんかで使われる 直後であってもサブルーチンに分かれてるなら
入力情報のチェックを行うのは普通のこと なんか例のCプログラマがしつこいけど、いまどき関係ない別プロセスがメモリ上の値を書き換えたりするミスは、OSレベルでもCPUレベルでもあるので、持論を批判されていると思って反論しなくていいよ。
ここは漠然としたVBAのスレッドだから、見ているひとにはあなたの言うことは難しくて理解できないと思うよ。
スルー力がないのか、寂しくてかまってほしいのか知らないけど、要はクソコードを書くなと言ってるだけだ。 なんでVBAスレで組み込み系のショボいハードウェアでのプログラミングを語っているのか?
ハードウェア、OS、ミドルウェア、プログラミング言語によって考え方やどこまで想定するのかは全然、違うからいっしょくたにしないでもらいたい。 一般ユーザー権限のアプリで別プロセスのメモリにアクセスできたのは、平成どころか昭和時代の話ですよ、おじいちゃん
希にOSやCPUのバグ騒ぎが起きますが、そんなのは例外中の例外なんで普通は気にしなくていいことです Windows 95、98、98SE、MeがいつのOSかもわからないのか せっかくのイベントなのにPrivateにしたら星飛雄馬のクリスマスパーティーみたいになるじゃん 何か面白いこと言った?
全然わからない。
興味あるからなぜ面白いか教えて? コード書く画面を
背景は黒に、文字は白に、する方法を教えれ Wordで文字置換をしたいのですが、特定のフォントの文字列を検索して、文字列は変えずにフォントだけ変えたいです。半角を全角にしたいのですが可能でしょうか。ヒントだけでも教えていただけると有り難いです。 >>855
できる
任意のRangeのCharactersのフォントを一字ずつ調べて、探しているフォントが適用されている文字が見つかったらその文字のフォントを修正すればいい
半角から全角に変換するにはStrConv関数を使用し、第2引数conversionには列挙定数のvbWideを指定する >>856
ありがとうございます!
やってみます。
>>857
上手くいかなかったと思います。。 Findを利用したコードについて教えて下さい。
書籍、サイトで掲載されていたコードを利用し、少し変えたものです。
Findメソッドを使ってC列の”たろう”を検索します。
探し出したら、A〜C列の文字列をE列に結果を返すように作り替えてみましたが、結果がE1〜G1に上書きされてしまいます。
Cells(Rows,count を理解しきれていない、11行目のCells(i,”E”)の部分も理解していないと感じます。
どのように違うのか、ご指導お願いします。
ワークシートはこんなかんじ E列からG列は実行後の結果をイメージしたものです
A B C D E F G
1 日付 売上 担当者 000 AAA たろう
2 000 AAA たろう 333 DDD たろう
3 111 BBB はなこ
4 222 CCC たかし
5 333 DDD たろう
6 444 EEE はなこ
7 555 FFF くみこ 859の続き
Sub Find()
Dim temp As Range, tempAddress As String, i As Long
With Range("A1").CurrentRegion.Resize(, 1).Offset(, 2)
Set temp = .Find(what:=“たろう”)
If Not temp Is Nothing Then
tempAddress = temp.Address
i = Cells(Rows.Count, "E").End(xlUp).Row
Do
temp.Offset(columnoffset:=-2).Resize(, 3).copy Cells(i, "E")
Set temp = .FindNext(temp)
Loop While temp.Address <> tempAddress
End If
End With
End Sub
Sub copy()
Range("A:G").Clear
Worksheets("template").Range("A1:C7").copy Destination:=Worksheets("Sheet1").Range("A1")
End Sub >>861
それと、行や列用の変数として r c 使ってもええんやで >>861
ファッ!それかも!
マジでありがとうです!
何かあったらまた聞きます
ホントありがとう、頭いい人! 初心者です。
Wordのユーザーフォームを作りたいのですがExcelの書籍しかなくて詰みました。
Excelのセル番地『A1』に相当するのが『ActiveDocument .tables (1) .cell (1.1)』というところまで突き止めて、
とりあえずテキストボックスに打ち込んだ文字列をセルに転記するところまではできたのですが、それ以上のことができません。
例えば繰り返し同じフォームを使う前提で、古いデータを削除したい時、Excelならば
『Range("A1") .CleanContents』で済むっぽい(うろ覚え)ですが
これをActiveDocumentで再現するにはどうすればよいでしょうか。
まだ文法など全く理解できていませんが、素人目に『Range(”ActiveDocument .tables (1) .cell (1.1)”).Select .CleanContents』
などと書いてしまいたい訳です(当然、動きませんでした)
加えて、WordVBAを中心にお勧めの書籍などありましたら教えていただきたいです。
今の書籍は痒いところに手が届かず… >>861
set temp = .findnext(temp)の下に
i=i+1を入れた所、できました。
本当にありがとう!助かりました(T^T) >>864
定番は「最速攻略 Word マクロ / VBA徹底入門」
Word VBAの書籍やWEBサイトは選択肢が圧倒的に少ないから、基本がわかったらVBEのオブジェクトブラウザやネットでMSDNを見た方が確実 学校でVBAを勉強した方はどんな参考で勉強したんでしょうか? >>Wordのユーザーフォーム
必要性が今一分からん >>870
いろんなソースで、色つけたり太字にしたり、用紙指定や段組みして印刷させる
。
炎上プロジェクトに突撃するのに必須 >>864
'選択範囲内にあるテーブルの一行目以外をクリアします。
Sub clearSelectedTableData()
If Word.Application.Selection.Tables.Count = 0 Then
'MsgBox "Select Any Table!"
Exit Sub
End If
Dim t As Word.Table
For Each t In Word.Application.Selection.Tables
Dim r As Long, c As Long
For r = 2 To t.Rows.Count
For c = 1 To t.Columns.Count
t.Cell(r, c).Range.Text = ""
Next c
Next r
Next t
End Sub こっちのがスマートだった
'選択範囲内にあるテーブルの一行目以外をクリアします。
Sub clearSelectedTableData()
If Word.Application.Selection.Tables.Count = 0 Then
'MsgBox "Select Any Table!"
Exit Sub
End If
Dim t As Word.Table
For Each t In Word.Application.Selection.Tables
If t.Rows.Count > 2 Then
Dim r As Long
For r = 2 To t.Rows.Count
t.Rows(r).Range.Delete
Next r
End If
Next t
End Sub もし文字編集でcell()下位の.Rangeが省略されてるのを知らないと
cell.Range.Deleteの文字削除とcell.Deleteのセル削除が
使い分けができないので注意 >>871
そうだろうけど、
他のOfficeでも出来るんじゃないの?
拡張って参照設定の事でしょ?
>>874
マジかよWord Tableって・・。
ExcelでSQLが使えたり、Officeは割と何でもありだとは思っていたが・・。 >>876
リボンやクイックアクセスツールバーとかで増やすほうね>機能拡張 NothingとNullとEmptyの違いがわからない
MSはナンセンス、はっきりわかんだね EmptyはVariant型の初期状態(何も入ってない)
セルの初期状態でもある
確認方法
新規ワークシートに対して、イミディエイトウィンドウで
Print TypeName(Cells(1,1).Value)
とすると
Empty
と表示される
Nothingはオブジェクト型変数にオブジェクトが代入されていない(結びつけられていない)状態
NullはExcelだと出番がないと思っていい
主にAccessでデータを扱う時にNullが必要な場面が出てくる 複数セルのRangeからプロパティとってくるとき不一致だとNullになるくらいやな ユーザーフォームの、複数のテキストボックス、
例えばオブジェクト名をtb1、tb2とかにしてループ文に組み込むということはできますか?
オブジェクト変数というのが関係しそうな気がするんですが、
テキストを読んでも理解できない… >>881
すべてのテキストボックスでループ。
目的のテキストボックス群で名前を元に絞り込みすりゃ良いんじゃね。 普通はテキストボックスのTagプロバティに区別できるキーワード入れといて
For eachでUserform.controlsやると思う >>881
オブジェクトの配列作って、という事だと思うけど
使うとしたらオブジェクト参照を保持したまま色々したい時ぐらいかも
値の参照とセットだけなら皆さん挙げられているcontrolsでやりますね vba スタンダード 、accessのおすすめの問題集ってやっぱり公式テキストでしょうか。 エクセル Cells(1,1)
ワード Cell(1,1)
↑
は? 何でワードにはsが無い? >>887
Word.Selection.CellsとかRow.Cellsとかあるで
Tableには.Cell(1,1)しかないがな
ちなCellsはxy指定できんがCellはxy指定必須や
エクセルのプロパティのほうが異常なんやで vba エキスパート は、excel ベーシック以外は公式テキストまだだから受験は待ったほうがいいですよね。 以前word VBAの質問をした者ですが、その節はありがとうございました。
お陰様で処女作のユーザーフォームが完成しかかっているのですが、最終問題に難儀しています。
やりたい事:「保存」ボタンを押す→ActiveDocumentと同じ場所に「記録表」というフォルダを作成し、
その中に「"氏名”」というファイルを生成する。既に「記録表」のフォルダがあればフォルダは作成せず、
そちらにファイルを生成する。
なお、不特定多数のユーザーが使う前提です(保存場所を手打ちしたらユーザー名で詰む)
四苦八苦しましたが、ひとまず確認用にdesktopに生成しようとしてなんかユーザーフォルダの滅っ茶根深い場所に生成されたり、
推測で打ってみたメソッドが全く機能しなかったり(フォルダの有無を確認するようなのって何だろう)
なんというか、Excelのfxボタンみたいにメソッドの内容を教えてくれるやつ、ないんですかね…
ちなみに職場のPCはスタンドアロンでヘルプに繋がらず、自宅PCにはOfficeが入ってないです。 >>893
オフラインヘルプインストールできなかったっけ… 見てみて
F2キーでオブジェクトブラウザが表示される
これ無しで開発なんてやってられない 今オフラインのヘルプって提供されてないんじゃないのか? >>893
デスクトップはエクスプローラーの左のとこにカタカナで出てるとこと同じやで
深いとこにできても、そちらから近道すればよろし >>893
〉フォルダの有無確認
昔は Dir()だったけど、今は filesystemobjectかな。
参照設定も必要なので使い方も含めてggッテください
folderexists() 公式オフラインヘルプがあったのは2013だな
2016もオフライン版があるけど英語
https://github.com/OfficeDev/VBA-content/
基本的な機能は2013からあんまり変わってないから、2013用のヘルプを入れてしまうという手もある
使い勝手は悪いけど、いつでも参照できるという利点はあるから Activedocument.Pathで所在フォルダのパスが出せる
これとフォルダ名とファイル名繋げた文字列つくればSaveAs2の引数にできる 質問です。excel2016の並び替え機能で
漢字、かな(あ〜ん)、アルファベット(a〜z)で並べ替えて漢字の中でも「本店」を最上位とできませんかね?
降順だと上記並びなのですが、かな(ん→あ)、アルファベット(z→a)になります。
Custumorder に「本店」を入力すると漢字中で1番下になります。
よろしくお願いします >>901
ありがとうございます。
やってみます。 Wordの表で、
ActiveDocument.Tables(2).Select
みたいに選択したいのですが、どれだけ表を分割しても、
全ての表が Tables(1) という扱いなようでエラーになります。
ひとつ前に似たようなものを組んだ時には問題なくTables(2)になりましたが、
それと構文上は全く違いはありません。
どうしたら Tables(2)という扱いになるのでしょうか。 ユーザーフォーム内のコンボボックスにUSBの中にある画像一覧というフォルダ内の全ての画像名を表示したいのですがうまくいきません。
どのように変更すればよいか教えていただけませんか?
Private Sub UserForm1_load()
Dim myList As String
Dim myPath As String
Dim iName As String
myPath = "D:/画像一覧/*jpeg"
fName = Dir(myPath & "*.jpeg")
Do While iName <> ""
If myList <> "" Then
myList = myList & " " & iName
Else
myList = iName
End If
iName = Dir
Loop
If myList = "" Then Exit Sub
myList = Split(myList)
ComboBox1.List = myList
End Sub 取得するのが D:/画像一覧/*jpeg*.jpeg になってるとか
fName は iName の間違いじゃないのかとか
myList は String なのにSplitした後のものを代入してるとか >>905
返信遅れて大変申し訳ありません
3つのご指摘直して反映できました。
ありがとうございました。 ExcelVBAのユーザーフォーム上で、PDFを表示、操作をしたいです。
ですが、ユーザーフォームにコントロールを追加しようとすると、
「要素が見つかりません」とダイアログが表示され出来ません。
どなたか解決策をご存じの方がいましたら、教えていただけますでしょうか。。
Acrobat pro DCはインストールしてあり、ExcelはOffice365を最新の状態で使用してます。 >>907
EXCELは専用スレがあるので、そちらへどうぞ >>908
ありがとうございます。
そちらに書いてみます。 ここで質問していいかわからないんですが、違ったら誘導していただけると助かります。
メッセージボックスを最前面にするために以下のコードを利用したいのですが、呼び出し元の下から3行目のvbOKOnly を vbYesNo に替えた後、選択ボタンを取得する方法がわかりません。
どのようなコードを足したらいいかご教示いただけないでしょうか。
【呼び出し元】
Option Explicit
Dim WSHObj
Dim Args
Set WSHobj = WScript.CreateObject("WScript.Shell")
Args = "cscript ""C:\Program Files\PPX\script\WSHPopUP.vbs""" _
& " ""出力メッセージ""" _
& " 0" _
& " ""VBS名称""" _
& " " & vbOKOnly ←vbYesNoに替える
WSHObj.Run Args,0,true
Set WSHobj = Nothing
【WSHPopUP.vbs】
Option Explicit
Dim Arg
Dim WSHObj
Set WSHobj = WScript.CreateObject("WScript.Shell")
Set Arg = WScript.Arguments
WSHObj.Popup Arg(0),Arg(1),Arg(2),Arg(3)
Set WSHobj = Nothing
よろしくお願いします。 【呼び出し元】
Option Explicit
Dim WSHObj
Dim Args
Set WSHobj = WScript.CreateObject("WScript.Shell")
Args = "cscript ""C:\Program Files\PPX\script\WSHPopUP.vbs""" _
& " ""出力メッセージ""" _
& " 0" _
& " ""VBS名称""" _
& " " & vbYesNo
Dim hoge '受け取り用に追加
hoge = WSHObj.Run(Args,0,true) 'この変数hogeにvbYes=6かvbNo=7が入る。
'何か処理を書く
Set WSHobj = Nothing
【WSHPopUP.vbs】
Option Explicit
Dim Arg
Dim WSHObj
Set WSHobj = WScript.CreateObject("WScript.Shell")
Set Arg = WScript.Arguments
Dim fuga '戻り値用に追加
fuga = WSHObj.Popup Arg(0),Arg(1),Arg(2),Arg(3) 'popupの戻り値を取得
WSHObj.Quit fuga '呼び出し元に終了コードとして返す
Set WSHobj = Nothing vbDefaultButton1 とか、そういうのじゃなくて? >>911
ありがとうございます!
試してみます!
>>913
すみません、vbDefaultButton1 がわかりません >>911
>910,>914です。
教えていただいたコードを試してみたのですが、
‘何か処理を書く
のところに
MsgBox hoge
と入れたのですが、「はい」「いいえ」どちらの場合も 0 が返されます。
どうしたらいいでしょうか ???
VBAなの?
VBSなの?
MsgBox使えるのに、何でWscript使ってんの? 朗報
【アプデ/10】 2019年8月14日のWindowsUpdate後、VB関連が死亡。Windows10全バージョンにて
https://asahi.5ch.net/test/read.cgi/newsplus/1565930238/ >>915
【WSHPopUP.vbs】 のWSHObj.Quit fuga は間違い。エラー出してる。
Wscript.Quit fuga が正しい >>918
返信遅くなってすみません。
レスの通りに修正し、
さらに
fuga = WSHObj.Popup Arg(0),Arg(1),Arg(2),Arg(3) 'popupの戻り値を取得
↓
fuga = WSHObj.Popup(Arg(0),Arg(1),Arg(2),Arg(3)) 'popupの戻り値を取得
に変更し、成功しました。
たいへん助かりました。
ありがとうございました。 WordのアクティブXコントロールのテキストボックスなのですが
BackStyleを0設定すると背景色は消えるのですが
デザインモードを解除すると背景色が出てしまいます
これはバグでしょうか Exchange / Outtlook VBAの質問です
初歩的な質問で申し訳ありませんが、お知恵を拝借できないでしょうか
任意の名前を持つ配布リストや連絡先グループに属するExchangeユーザーのSMTPアドレスの一覧を取得するにはどうしたら良いのでしょうか
配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません
なお配布リスト、連絡先グループいずれも個人ユーザーのみが登録されている前提なので、再帰によるメンバー取得は不要な状況です エスパー的にはexchangeユーザーのユーザー一覧と配布リストのユーザーの
名前を比較すればいいんじゃね >>925
これについて何か解決方法ありましたか?私も配布グループ取得で難儀しております。 VBAの質問スレで質問するのはなぜ馬鹿ばっかりなのですか? >>933
このスレのレベルを知ってる普通以上の人はここを頼ったりはしないから 頼むからVBAでWin32 APIを呼び出すのはやめてくれ
そこまで要求するなら包括的な自作DLLを作ればよいと ものぐさが使うのがVBAなのに
いちいちDLL化なんてめんどくせえ >>936
Declare文が多すぎてコードが見づらい Win32API使える奴がDeclare文読むの?
そりゃ、間違ってるとかおかしなのも中にゃあるけど、普通そんなとこ見ないだろ。 質問スレにも書き込んだのですが二つのieを起動して2つ目のieでpdfを開いて名前をつけて保存したいのですがexecwbを行うと一つ目のieのhtmlが選択されてしまいます。どうかやり方を教えてください。よろしくお願いします。getIEはシェル取得ファンクションです。
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "http://yahoo.jp”
Dim ie2 As InternetExplorer
Set ie2 = CreateObject("InternetExplorer.Application")
ie2.Visible = True
ie2.Navigate2 "C:\\Desktop\test.pdf", 1
Set ie2 = getIE("test")
Dim test As String
test = "c:\test\test.pdf"
ie2.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_DONTPROMPTUSER, test
End Sub 初心者です。どうかお力添えをよろしくお願いします。 すいません 自己解決しました。単純なスペルミスでした 製品番号のフォルダ検索して中のPDFファイルを開くようなマクロ書いてるんだけど
先日Officeのアップデートしたら、件のマクロがしばらく応答なしになって
悪意のあるマクロ云々とか言われてExcel強制終了になった
それ以後そのマクロは激遅に
ブックのファイル名変えたりマクロの関数名変えたりするとしばらくは元の速度に戻るが
1日位経つとまた遅くなる
調べてみたら、VBScript.RegExpのExecuteメソッドが10秒位かかるようになってる
通常は30msで終わるような代物がだ
どうもShellやRunで一度に多数のPDFファイルを開いているのがお気に召さなかったらしく
ファイル名や関数名でアンチウィルスのブラックリストに載る?
そのあとはそれっぽい名前のメソッドが標的になり遅くなるような感じ
こういうの経験した人いる? 会社のPCじゃなければそれもありだが…
paloalto trapsとかいう奴
毎回反応する訳じゃないのが嫌だし
編集中のデータも問答無用でごっそり強制終了しやがるふざけんな >VBScript.RegExpのExecuteが10秒
と
>ShellやRunで一度に多数のPDFファイルを開いている
の関連がわからんね
この二つは分けて原因を探るべきじゃ? マクロ付ファイルでPDF開かせるてのは相当に怪しいと捉えられる可能性は高いね
セキュリティ変更や除外設定なんてのは出来ればしたくないだろうし引っかからないような対策があればいいがな
ShellやRunでPDF開くんじゃなくExcelもしくはWordに取り込ませるようにすると引っ掛からないかもという気がしなくもない VBAから直接PDFを開くんではなく
バッチファイルを書き出し実行することで反応の確率は減ったが
アンチウイルスが反応しやすい型番とかあってよくわからん
正規表現のexecuteメソッドは「それっぽい」名前のメソッドだろ?
これがアンチウイルスが反応したときに動作してた関数から呼ばれた時だけ遅くなるんだよ
同じブック中の他の関数から呼ばれた時は高速のままだ
dir関数でフォルダ内部のファイル名取得して正規表現検索してる時だけアホみたいに遅くなる時がある VBA開発を頼まれた いくら位金額を提示したら良いか誰か教えてほしい
内容は不動在庫を15店舗くらいあグループ店の売り上げデータから引取先の候補を検索するシステム
商品のバーコードから行き先候補を検索する予定。
この内容ってアウトソーシングするといくら位? >>951
マジレスするとVBAは安いので1人月50ぐらいかな。
内容の詳細が分からないが、大して難しいとは思えないので。
どんなに簡単でも50以下は有り得ない。 >>951
人によるだろうな
安く提示すると未経験者とかがくるぞ >>944
遅レスだけど
速度が遅い件は経験ありますよ
うちの環境で調べたらSYMANTECのエンドポイントは大丈夫で、MSのディフェンダーだと遅かった
Win10のバージョンも影響したかもしれないけど、現行サポート対象バージョンは、ディフェンダーだとすべて遅い
会社のPCなんでActiveDirectory、SYMANTEC、SKYSEAがスタンダードなんだけど、更新時の不具合があったんで一部のPCでディフェンダーを使ってて発覚した
VBSの内容は、多少分岐やループはあるけど正規表現を使って置換するだけの簡単なものだった ミッションクリティカルな仕事をVBAでやってるのに、
少し前から動かなくなって修正したくても前任者がこの世に不在+仕様書やマニュアル無し+社内プログラム分かる人いない
って状況割とよく聞くけど、まあ自分が担当することになったんだけど、これどーすりゃいいの?
何社かソフトウェア開発系の会社に話聞きにいったら、vbaはちょっと・・・とか、プログラムみてこれはちょっと・・・って反応だし
1千万超える金積むとなると役員に説明しなくちゃならないんだけど、なんでおまえがやらないの?みたいな反応だし
まあ、控えめに言ってこのまま止まり続けると会社潰れるから言い値で出すしか無いんだろうけど
こういう状況、ここに巣喰う人達はどうやって乗り越えたのかアドバイスやヒントください
転職、以外で ミッションクリティカルなのに止まっても平気なのか
不思議な世界観 >>958
素人が作っためちゃくちゃなコードのデバッグや修正は仕事でもやってるからあんまり困ったことない
言語も問わず引き受けてる >>960
すげえ
社内システム作ってるところとかつてで色んなところに聞きいったけど数百万じゃ難しいって言われたんだ
分かる人には難しさっていうか、見積もりがわかるもんなんだな
参考までにどういうところを見て判断するもんなの?
偉い人に説明するときの参考にしたい >>961
変数名、インデント、コメントの入り方なんかを見れば、制作者のレベルがだいたいわかる
その上でソースの行数、モジュール数がどれぐらいか マクロの記録をベースにしてるのは危険な感じがする
あとループの中にgotoが入ってるやつ見たときはちょっと感動した vba捨ててまともなところに新しくシステム作ってもらった方が安いし早そう それだと社内で仕事が無くなるおっさんたちが文句言い出す 住宅で喩えるなら 地場でイチから設計・施工をする在来工法のパワービルダーや
社内で設計した通り加工し現地で組み立てるだけのハウスメーカー 又は方式は
一緒だけどコスト削減に特化して現地の安い下請け使って費用を抑えるローコスト系
システムを売りにしてる企業は上で言うHMに近く、依頼すればひと声一千万は相場
PBはどんどん規模が縮小してるから探すのも大変 LCHMなら見付かるかも知らんが
要求に応じかねるレベルだと思われる
当時の社内の人間が内製したレベルならその条件、例えばExcelVBAと絞って
改修・修繕の可不可(得意かどうか)を先ず相手に問えば話が早いかも知れない
業務内容を伝えるだけだとうまく伝わらずに高額商品を売る方向に話が進み兼ねない >>962
はえ〜・・・なるほどなぁ
変数名は一応業界の人なら意味が分かる程度
インデントはルールから逸脱してるのはほぼない、とおもう
コメントはあることはあるけど助けられたコメントはほぼないな
'ここで●×処理をする Sub ●×処理(・・・・・・・) みたいなw
行数はただの改行も含めると3万行くらいで
モジュールが4、functionが500、subが1500くらい
この辺が大量にあるから難しいって説明しようとしてたんだけど
数行(ステップ?)なら別にF8ポチポチしながら追えるんだよね
じゃあ足りないのは根気だろ、みたいに言われて循環複雑なんちゃらみたいなの調べてたけど
結局こんな数字だしても理解されないだろうしなぁってのと、単に俺が素人だからってのもあって今に至る
>>964
マジそれなんだけど、何をしてるのか誰もわかんないから何を作ってもらえば良いのかも説明出来ないっていうねw
世間で言われてる炎上案件よりよっぽどかわいいレベルなのかも知れないけど
マジであと数ヶ月放置して会社潰れればいいんじゃねーかとも思ってる >>966
おっと、同じ人かもしれんけどありがとなあ >>967
他人の作ったプロシージャを2千個3万行解析してドキュメントを作成しながらデバッグなら1千万はまあまあ妥当かと
設備投資でたった1千万が出せない会社は遠からず潰れると思うよ
ほかの資産や設備だって千万単位の修理はいつ発生してもおかしくないし >>970
詳しい人にそう言ってもらえるとたすかる
とりあえず素人がやるもんじゃ無いって話は集めたので素直に金だせやって資料作ってるw
しかし1千万つめばできちゃうってのもすげーなあ
個人にとっては大金だけど、会社にとっては中堅社員一人分/年くらいの費用だもんな 解析・デバッグ・ドキュメント作成でひと声一千万?
じゃ、せっかく解析できたんだしそれをベースに新システム製作費は?
パッケージから大きく外れるものだったらオリジナル新規作成?千万? 都合?千万?
せっかく途中まで分析し始めたようだし「わたしに二千万ください、これやります」でいーじゃん >>972
やり方教えてくれww
まあ1千万超えは最低限な感じだね
今起きてる障害を直すだけだけどね 業務止まってるのにのん気だな
せめて地方と業務とアプリぐらい概略書けば誰かがどこかを紹介するかも知れんぞ
アプリはAccessと踏んだが、どう?
どうせこのご時世、近場でなくともZoomやらでリモートしたりでのサポートだろうし 結局余所に投げる方向で解決した
乗り越えられるものとそうじゃないものを見極めるのも大切と思い込むことにした
なお費用は想定の2倍近くになる模様w
みんなアドバイスありがとう >>963
> ループの中にgotoが入ってるやつ見たときはちょっと感動した
Continue 文が無いメジャーな言語があってな。
GoTo Continue1
とか、書くときの隔靴掻痒感と言ったらもう・・・。 もしかしてフィルタで非表示になってるセルってVBAで値参照できない? WordのVBAで質問させてください。
文書内の2種類の括弧「」『』の中にある改行だけを削除するマクロを作りたいと思っています。
例えば以下のような文章に対してマクロをかけたときに
「み
か
ん」
ば
な
な
「り
ん
ご
」
以下のような結果になるマクロです。
「みかん」
ば
な
な
「りんご」
つづきます Sub 括弧内の改行を削除()
Dim myRange As Range
Set myRange = ActiveDocument.Range(0, 0)
With myRange.Find
.Text = "[「『""]*^13*[""』」]"
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
Do While .Execute = True
With myRange.Find
.Text = "^13"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
DoEvents
End With
Loop
End With
Set myRange = Nothing
End Sub 自分なりに以上のようなマクロを組んでみたのですが、実行してみると、
最初の「みかん」の改行は削除されるのですが、そのあとの「りんご」の改行が削除されません
やり方をお教えいただけると助かります。 正規表現使えば一発じゃん。
VBAって正規表現使えるんだっけ? RegExpオブジェクトを使えば。
面倒だから俺はどうしてもというとき以外は使わない。 Wordなら最初から正規表現もどきが使えるから、Excel VBAよりはちょっとだけ楽に文字列操作ができる >>982
正規表現でマルチラインを設定して改行を空文字に置換
RegExpオブジェクトの使い方は、他の言語より面倒な書き方だったりするけど文字を操作するなら必須だと思うよ splitでいい感じに分割して判定してreplaceで改行無くしてくっ付けろ
「」は自分でつけたせ あんま実験してないから文句いうなよ
まずはさ、アホでも考えられるような地道な形でやるべきだと思うわ
そのあとに、効率性とか考えて無駄排除したりすればいいわ
Sub MainProcess()
Dim text As String
text = Sheet1.Cells(1, 1) 'A1に括弧が含まれる文字列をいれろ
Const right1 As String = "「"
Const left1 As String = "」"
Const right2 As String = "『"
Const left2 As String = "』"
text = MakeText(text, right1, left1)
text = MakeText(text, right2, left2)
'B1に結果が返ってくるぞ。途中結果はメッセージボックスで順次表示されるからループ終わるまで何度もOKおせ
Sheet1.Cells(1, 2) = text
End Sub >>989の続き
Function MakeText(text As String, rightChar As String, leftChar As String) As String
Dim startPosition As Integer
Dim endPosition As Integer
Dim InstrStartPosition As Integer
InstrStartPosition = 1
Do While InStr(InstrStartPosition, text, rightChar) <> 0
startPosition = InStr(InstrStartPosition, text, rightChar)
If startPosition <> 0 Then
endPosition = InStr(startPosition + 1, text, leftChar)
End If
Dim midText As String
midText = Mid(text, startPosition, endPosition - startPosition + 1)
Dim midTextChanged As String
midTextChanged = Replace(midText, vbLf, "")
text = Replace(text, midText, midTextChanged)
InstrStartPosition = startPosition + Len(midTextChanged)
MsgBox "無限ループになっちゃった時はctrl + Breakを押せ" & vbCrLf & vbCrLf & text
Loop
MakeText = text
End Function つかさ、rightとleftが逆だったわ
まぁ動くからいいわ あれだ、最期の方に「だけが単独であると無限ループだわな
ループの条件にその辺の修正いれておいてくれ
もう寝る おっきした
>>990を↓に修正
Function MakeText(text As String, rightChar As String, leftChar As String) As String
Dim startPosition As Integer
Dim endPosition As Integer
Dim InstrStartPosition As Integer
InstrStartPosition = 1
Do While InStr(InstrStartPosition, text, rightChar) <> 0
startPosition = InStr(InstrStartPosition, text, rightChar)
If startPosition <> 0 Then
endPosition = InStr(startPosition + 1, text, leftChar)
End If
Dim midText As String
midText = Mid(text, startPosition, endPosition - startPosition + 1)
Dim midTextChanged As String
midTextChanged = Replace(midText, vbLf, "")
text = Replace(text, midText, midTextChanged)
InstrStartPosition = startPosition + Len(midTextChanged)
MsgBox "無限ループになっちゃった時はctrl + Breakを押せ" & vbCrLf & vbCrLf & text
Dim textForCheck As String
If textForCheck = text Then
MakeText = text
Exit Function
End If
textForCheck = text
Loop
MakeText = text
End Function ∧,,,∧
( ・∀・) 1000ならジュースでも飲むか
( )
し─J このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 2294日 13時間 24分 43秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。