X



VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0559デフォルトの名無しさん
垢版 |
2018/05/23(水) 19:25:31.94ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

HCSP8
0561デフォルトの名無しさん
垢版 |
2018/05/30(水) 16:34:41.89ID:C5TotkC4
VBAってリボンにメニューを作成出来る?
0563デフォルトの名無しさん
垢版 |
2018/05/31(木) 22:00:54.69ID:mTNxmz5w
出来ないだろ
0564デフォルトの名無しさん
垢版 |
2018/05/31(木) 22:10:43.12ID:tlOTml64
シートにボタンがいくつかあって、押したときの処理が結構複雑なんです
とりあえずclickedをシートモジュールに書いて、そこから呼び出される関数も全部シートモジュールに書いたら分量がすごいことになりました
やっぱりクリック検出だけにしぼって残りは全部標準モジュールにすべきなんですかね。そのシートでしか呼び出されないわけで分けるのも分かりにくいような気もして
0565デフォルトの名無しさん
垢版 |
2018/05/31(木) 23:13:50.53ID:eZ3BghFT
>>563
Excel2003までのツールバーにメニュー追加するコードを書くと2007以降ではリボンにメニューが追加されるけど違う話かな?
0566デフォルトの名無しさん
垢版 |
2018/07/02(月) 19:23:11.48ID:kZ0RH16R
Access2016でコンボボックスの規定値をnullから1へ変更したくて
フォーム!コンボボックス.DefaultValue = """1"""とするフォーム上は1と表示されるんだが、プロパティーシート上は全く変化なくて、フォームをとじてから開くと規定値が変わっていなくてNullのまま。
VBAからは既定値の変更が出来ないのかな?
0567デフォルトの名無しさん
垢版 |
2018/07/04(水) 18:36:07.99ID:uOrTSuCX
フォームを閉じるときに変更を保存しなけりゃ普通に考えてもとに戻るわけだが
0569デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:40:17.29ID:gFgZc5FG
5OK
0574デフォルトの名無しさん
垢版 |
2018/08/01(水) 19:27:32.96ID:sloNm1e3
Wordで読みとり専用推奨で保存されてるファイルをVBAで書き込み可で開いて編集して上書き保存したいんですが、やる方法はありますか?
0576デフォルトの名無しさん
垢版 |
2018/08/01(水) 22:05:26.28ID:oaZVWoyy
マジだったカオスと思ったが
開くと読み取り専用か聞いてくるのか

まあ、OS側でなくワード側で制御してそうだから、回避は厳しそうな気がする
0580デフォルトの名無しさん
垢版 |
2018/08/02(木) 00:14:28.59ID:isxfR7GW
>>576
VBAを使わずにファイルを開いてダイアログのウィンドウをつかまえて「いいえ」ボタンにメッセージを送るという力技ぐらいしか方法はないんでしょうか?

Excelでは開くときにIgnoreReadOnlyRecommenedというのを指定すれば良さそうなんですが
0583デフォルトの名無しさん
垢版 |
2018/08/02(木) 12:49:47.07ID:rM6odxjs
>>574
ありません。
Wordは手動でやるしかない。
Excelとは違いますから。
0584デフォルトの名無しさん
垢版 |
2018/08/02(木) 18:55:35.87ID:kRv3+o5C
>>580
VBAでもその力業で出来るけどね。
でも読み取り専用推奨で保存する目的はそのメッセージを出すことにあると思うからそれをスキップするコードを書くべきかという問題もある。
0585デフォルトの名無しさん
垢版 |
2018/08/02(木) 19:38:51.82ID:CFW8XzdE
>>582
すくなくともうちの環境では、ReadOnly:=Falseで書き込み可能で開いてるけど?
その状態からReadOnlyRecommended = Falseにして保存したら、読み取り専用推奨は外れてるが

まあうちの環境がかなり古いから最近では出来ない可能性もあるが
それホントに推奨なだけなのか?
0587デフォルトの名無しさん
垢版 |
2018/08/02(木) 21:07:22.34ID:CFW8XzdE
>>586
じゃあ2010から出来なくなったんだな
うちの2007ではできてるから

ただそこの文書
Note The following example applies to Word 2003 and 2002:
とか書いてあるな
Last Updated: Apr 19, 2018
らしいけど、適用対象バージョンがよくわからんな
0588デフォルトの名無しさん
垢版 |
2018/08/08(水) 01:24:38.39ID:vu1bVHsA
ACCESSでオートルックアップクエリを使用したフォームでマスタにないものを入力した際、
フィールドとキーが一致しているレコードをテーブルで探すことができません。
と出ますが、マスタにないデータを入力しようとしたとき、上のメッセージを出すことなく、マスタ登録用フォームを呼び出すにはどうすればよいでしょうか?教えていただけると助かります。
0589デフォルトの名無しさん
垢版 |
2018/08/22(水) 19:57:58.33ID:I61xiysx
スパークラインをVBAで挿入したいんだけど範囲指定のところがうまくいきません。
わかる方いたら教えてください。よろしくお願いします。

call cells(10 , h ).SparklineGroups.Add(xlSparkLine, "n5: n100")

"n5: n100" のところなのですが、 
range(worksheets(h).cells(14,5) , worksheets(h).cells(14 , G ))

のようにして ワークシートごとの数値群をスパークラインにしていきたいのですが、、、
何か良い方法を教えてください。
よろしくお願いします。
0590デフォルトの名無しさん
垢版 |
2018/09/02(日) 12:36:29.88ID:/2qGDDvp
質問 
Outlook2010なのですが
受信トレイの検索(Ctrl+E)で「請求書」を検索するのと同じ動作を
VBAにしたいのですがどのように記述すればいいのでしょうか
ボタンに登録して使うつもりです。

OutlookVBAを使うのは初めてでしてお手引きをお願いいたします
0591デフォルトの名無しさん
垢版 |
2018/09/02(日) 16:03:58.04ID:v7+8Ol2A
VBAで質問です
【前提】
・デスクトップにフォルダA
・フォルダAの中に9月1日分のExcelファイル"0901"とマクロ作動用の.xlsmファイル

【したいこと】
・フォルダAの中に9月2日分のフォルダ"0902"を作成
・"0901"を開き、B2セルの2018/9/1を2018/9/2に書き換え
・フォルダ"0902"内にファイル名を"0902"にして保存 


日毎のレポートのひな形を作ろうとしています
あまり知らないながら書いてるのですがエラー出まくりで泣きそうです
0592デフォルトの名無しさん
垢版 |
2018/09/02(日) 16:16:35.28ID:7fXcCHFS
>>590
Application.Searchメソッド、もしくは
Application.Session.GetDefaultFolder(olFolderInbox).GetTable(DASLクエリの引数) を使えば良いのでは
0593デフォルトの名無しさん
垢版 |
2018/09/02(日) 16:51:32.22ID:Q0JGCJ3q
>>591
悪いこと言わないから、手でやるか詳しい人に頼みなさい
複数のブックが同時に開かれている状態でのVBA処理には
いろいろ面倒なところがあり、経験が必要
5ちゃんでサクっと説明できるものではない
しかもフォルダ処理も伴っているので、エラー処理を含め
きっちり作ろうとするとけっこうな規模のアプリになってしまうと思う
0594デフォルトの名無しさん
垢版 |
2018/09/02(日) 17:27:55.14ID:1l6OdzeH
>>591
thisworkbook.path\フォルダA\0901を開いてあとはブック名から指定して必要事項を書き換え。
ブック名を指定してsaveAsで
thisworkbook.path\フォルダA\0902で保存。


蛇足だが、必要無くともブックもシートも常に指定した方が良い。
0596デフォルトの名無しさん
垢版 |
2018/09/02(日) 18:16:50.42ID:dkuRxOF+
おそらくやりたいことはこんな感じだろう。
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
0598デフォルトの名無しさん
垢版 |
2018/09/02(日) 21:02:04.61ID:/2qGDDvp
>>592
Application.AdvancedSearchして
Searchオブジェクトを検索フォルダーにSaveするっていうことですかね

単純にVBAでCrtl+Eのクイックサーチ(?)する方法があればと思ったのですが
無理っぽいですね
ありがとうございました
0599デフォルトの名無しさん
垢版 |
2018/09/06(木) 16:40:58.45ID:KlP6yXrE
初歩的な質問でごめんなさい
うまくできません

If IsNumeric(myN) Then
Range("A1").Value=Range("A1").Value + myN

End If

myNが1の時と2の時があるとしてセルA1の値を3にしたいのですが
やってみると12っていう風に数字が並んでいってしまいます
どうしたらいいでしょうか
0600デフォルトの名無しさん
垢版 |
2018/09/06(木) 19:12:55.41ID:iNH/PWkM
>>599
もしmyNがString型、あるいはObject型に文字列データが入っている場合は数値型に変換する必要がある
Range("A1").Value = Val(Range("A1").Value) + Val(myN)
でいいんじゃないかな
0601デフォルトの名無しさん
垢版 |
2018/09/06(木) 19:23:08.77ID:KlP6yXrE
>>600
String型になっていました
参考にしてもっと勉強します
お付き合いくださりありがとうございました
0602デフォルトの名無しさん
垢版 |
2018/09/21(金) 21:15:16.71ID:Fm9zyYJ3
超初心者です。

Googleの検索窓に「VBA」と入力する サンプルコード
https://vba-code.net/ie/set-value-to-textbox/) を実行してみましたが、
objIE.document.getElementById("gbqfq").Value = "VBA"のところで
「実行時エラー 424 オブジェクトが必要です。」となって動きません。

「標準モジュールに以下のコードを追加して」の意味が分からないので、
標準モジュールをどう書いたらよいのか、どこに追加したらよいのかわからず
サンプルコードのみを実行しました。

どなたか親切な方、対応方法を教えてください。
難しいことはわからないので具体的にコードを書いてもらえると嬉しいです。
よろしくお願いいたします。
0604デフォルトの名無しさん
垢版 |
2018/09/21(金) 22:40:18.36ID:Fm9zyYJ3
>>603
ありがとうございます!
できました!!!
なんか分からないけど動いて嬉しいです!
頑張ります。
0605デフォルトの名無しさん
垢版 |
2018/09/21(金) 22:42:58.72ID:MqKbhYRD
>>604
おう頑張れ!わからんかったらまたいつでも聞いてくれな!
0606デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:16:58.27ID:Fm9zyYJ3
>>605
ありがとうございます!

同じことを別のホームページでしたくて、
URLと入力するところを変えてみたのですが、
実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていませんとなって動きません。
ホームページは

https://www2.smile-etc.jp/NASApp/etcmlg/MlgReq;jsessionid=0001kXELRCuGax2mjI7VtXa12rz:15fqn57ku?gvlddpef=1011100000&mdwsetmb=1011120000の画面でしたくて、


入力するところは
objIE.document.getElementsByName("Name1Kana").Value = "マイレージ"としてみました。

お時間あるときでよいので出来たらお願いします。

仕事で毎日同じような入力ばかりしていて自動化できるところをできたらいいなと思っているのですが、超初心者にはハードルが高くて難しいです 涙

'
0607デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:29:19.39ID:m8DL5ZJ4
getElementById("gbqfq")
getElementById("lst-ib")

君は、この違いがわからないの?
HTML, DOM, CSS, JavaScript とか知らないの?

VBA には関係ないのだけど。
全言語・プログラミングに共通の話題なんだが
0608デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:59:36.29ID:Fm9zyYJ3
>>607
すみません、わかりません。
0609607
垢版 |
2018/09/22(土) 01:01:33.83ID:DCTpeoPT
HTML に書いてある、ID だよ

ウェブページは、HTML(DOM), CSS, JavaScript で出来ている。
ブラウザでF12 を押すと、開発者ツールが起動するだろ

これらを知らないと、ウェブ開発はできない!

VBA とは、全く関係ない
0610デフォルトの名無しさん
垢版 |
2018/09/22(土) 03:52:07.76ID:AiTHsE5Z
>>609
>>609
知識もないのに場違いな質問をしてしまいすみませんでした。ご親切にありがとうございました。
0611デフォルトの名無しさん
垢版 |
2018/09/22(土) 09:42:45.32ID:AiTHsE5Z
>>606
自己解決して、自動入力マクロができました!ありがとうございました。
0615デフォルトの名無しさん
垢版 |
2018/10/12(金) 09:54:55.01ID:TjU2aakC
それにしても、なんで、マクロはFunctionしかcall出来ないんだろうね。
無駄にFunctionを作らないようにと英語の本には書いてある。Subで済むもをFunctionにするなと書いてある。
なのに、マクロの仕様のために、無駄にFunctionをつくったり、SubをcallするだけのFunctionを作ったりしないといけないのは間抜けな仕様だと思うがどうだろうか?
0619デフォルトの名無しさん
垢版 |
2018/10/12(金) 12:28:42.41ID:YStpcFYj
>>616
本当に?
ワークシートからDLL関数をCallするためのインターフェースだけはVBAネイティブのFunctionとして書かなきゃいけないと思ってた
ワークシートから直接C#ソースの関数をCall出来るってこと?

>>615
SubもCall出来る
というかSubは本来Subroutineのことを指すのでそもそもCallできなきゃおかしい
0621デフォルトの名無しさん
垢版 |
2018/10/12(金) 17:15:46.40ID:QO2uhWCP
VBAしか使わない人間は、WinAPI使わない人間はSubしかCallしない。
0626デフォルトの名無しさん
垢版 |
2018/10/12(金) 18:20:18.57ID:4bQjrfTH
ほんとに?MSのサイトに対処方法が書いてあったけどなあ。
仕事で使ってたmdbでエラー出まくってSubをFunctionに書き換えた記憶があるけどなあ
0627デフォルトの名無しさん
垢版 |
2018/10/12(金) 18:45:46.09ID:S2JrLclJ
意味が分からん。
ExcelだろうがAccessだろうが当たり前にできる。
やり方間違えてるだけだろ。

lngRet = FuncA("何かの引数")
Call SubA("何かの引数", "何かの引数2")
これはできる。

SubでCallを省いた場合に
SubA("何かの引数1", "何かの引数2")
とするのは出来ない。

Callを省く場合は
SubA "何かの引数1", "何かの引数2"
とする。
0628デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:05:34.79ID:TjU2aakC
>>627
AccessとExceの用語の違いが問題かもしれません。
Accessだとマクロのデザインビューで新しいアクションの実行→プロシジャーの実行を選択→プロシジャー名を指定という流れです。
ここでSubを入れるとエラーになり、Functionを入れると実行されます。
全く同じ動作でもSubだとエラーでFunctionだと実行されるという謎仕様のことです。
0630デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:39:49.69ID:wk7eAlWy
>>628
Accessマクロの「プロシージャの実行」機能は、Functionプロシージャに限ってアプリ経由でコールバックさせることができるっていう一種のリフレクション機能だから、仕様上Subプロシージャを呼べないのは当たり前

でも普通はVBAその他一般のプログラミング言語の話題でCallするとかコードを呼び出すとか言う場合、プログラムのコード中で他のプロシージャ(=メソッド)を呼び出すこと一般を指す
AccessだろうがCallステートメントでSubを呼べないわけがない

全然話してる内容が違う
0631デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:42:56.49ID:4ERZBcjn
MSの提示する対処方法
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/runcode-macro-actionから抜粋
>>[!ヒント] Visual Basic で記述した Sub プロシージャまたはイベント プロシージャを実行するには、Sub プロシージャまたはイベント プロシージャを呼び出す Function プロシージャを作成します。
>>その後、 RunCode アクションを使用して、Function プロシージャを実行します。
0632デフォルトの名無しさん
垢版 |
2018/10/12(金) 19:47:22.51ID:4ERZBcjn
>>630
そうなんですか?Callという言葉の使い方が悪かったのですね。
Accessのマクロのプロシジャーの実行からSubを実行できないという表現が適切なんですね。
それにしても謎仕様ですね。いちいちCall_SubみたいなFunctionを作らないといけないなんて馬鹿らしいですよね。
Subを使うのを止めて戻り値を使わないのになんでもかんでもFunctionにしている人がいるのはこのあたりにも原因があるのでしょうかね。。。
0633デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:06:27.08ID:a+EZTAPW
C#やJavaなどの言語にはfunction相当の構文しか存在しないから、それに合わせてるだけかも
0634デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:12:42.89ID:Vm21lImY
サブルーチンというものは、マクロ上での繰り返し処理や重複処理が必要な場合に同じコードを何度も記載することを回避して、プログラムの再利用性と簡潔性とメンテナンス性を高めるためのもので一種の共通部品で呼び出して使えるためとても便利。
その代わり呼び出し側のコードが必ず必要。
0636デフォルトの名無しさん
垢版 |
2018/10/12(金) 20:43:31.86ID:xhA4Quty
たとえ1回しか使わなくても、機能ごとに分けて名前を付けることでコードの見通しを良くするという目的もある
0638デフォルトの名無しさん
垢版 |
2018/10/12(金) 23:40:27.93ID:kwtsHVW5
・Accessのマクロの「プロシージャの実行」機能は要するに「関数を実行する」ことに重きを置いている機能なので、関数ではないSubプロシージャは呼び出せない。
・「呼び出す」と「Callする」は意味が(あるいは受け取り方が)違うので下手に知ったかぶりしないこと。
0640デフォルトの名無しさん
垢版 |
2018/10/13(土) 14:18:57.90ID:7+viDhhJ
>>638
関数という言葉の定義次第ではSub Procedureも関数の一種になるぞ

あと、Accessマクロの実行機能に関する話題でマクロピッカーからプロシージャを直接選択して実行する操作を指して「呼び出す」とか「Callする」と表現する例は比較的稀だと思うぞ
0641デフォルトの名無しさん
垢版 |
2018/10/13(土) 18:29:35.77ID:hGe/e45K
数学的な定義だと関数は一対一の写像だから戻り値がないものは関数ではなくなってしまう
丸投げアウトソーシングとでも言えばいいのか
0642デフォルトの名無しさん
垢版 |
2018/10/14(日) 01:16:47.10ID:FNEdXER5
>>641
その理屈だと、Function Procedureが戻り値なしの記述を許容していること、戻り値と全く論理的な二項関係がない処理をFunction Procedureの中に書けてしまうことを考えた場合、Function Procedureが果たして関数と言えるのかどうかということの方が怪しくなる
0643デフォルトの名無しさん
垢版 |
2018/10/14(日) 18:45:30.05ID:+nd0Ta/b
それはプロパティとメソッドについても言えるわけで。
意味合いから使い分ければ良い。

Accessの仕事してるけどいわゆるAccessのマクロ機能は嫌いなので殆ど触ったことないな。
0644デフォルトの名無しさん
垢版 |
2018/10/15(月) 00:09:25.20ID:bvVmxQGC
>>640
マクロからVBAプロシジャを実行するのを、呼び出すと言うのはすごく一般的だとおもうが
むしろ呼び出す以外にどう言うんだ

>>642
戻り値を指定しないFunctionだって戻り値はちゃんとあるんだが
まあそもそもプログラミング上でいう関数は数学的定義の関数ではないんだがな

>>643
一般的なプログラム用語としてはそうかもしれんが
VBAや旧VB,VB.NET,C#なんかはプロパティはメソッドとは別な構文で定義されてる
VBAの話するならちゃんと区別しれ
0645デフォルトの名無しさん
垢版 |
2018/11/14(水) 18:28:17.85ID:yWBiOXbZ
vba初心者でわからないところがあって質問したいんですけど、ここで大丈夫ですか?
0648デフォルトの名無しさん
垢版 |
2018/11/14(水) 19:27:08.71ID:yRk1YRk6
>>647
その宿題をやるには「フォームの作成」という作業が必要で、それは文章だけの掲示板じゃとても説明できない
0654デフォルトの名無しさん
垢版 |
2018/11/15(木) 12:24:37.27ID:yIPB3Fsn
なきゃ学校にあるPC使うだけやんけ
変な事気にする奴やな
0656デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:21:50.05ID:XqpfGkJo
VBAで3つ数値があった時、最大値を表示させたい時
下記URLのNo.4の回答のelseifを使ったものがありますが、
elseifを使わずにelseだけで表示しようとすると、
どのようになるのでしょうか?
宜しくお願いします

ttps://oshiete.goo.ne.jp/qa/5352661.html
0657デフォルトの名無しさん
垢版 |
2018/11/15(木) 23:28:15.36ID:XqpfGkJo
分かりづらそうなので追記で、下記のところです。
宜しくお願いします 
  a = 10
  b = 200
  c = 30

  Max = a

  If b > Max Then
    Max = b
  ElseIf c > Max Then
    Max = c
  End If
0660デフォルトの名無しさん
垢版 |
2018/11/16(金) 06:57:12.53ID:fQoG7lNZ
そもそも657では最大値求められないだろ。
なぜ他の2つと比較してから決めないのか
0661デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:24:20.18ID:biDBAQdb
すいません、まだ初心者でまだ理解が追いついていなくて
とりあえず最大値求めるにはこういう形...とかで覚えようとしてて....頑張ります
0662デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:30:47.41ID:1oL4uemZ
658でも最大値は求められない
試しに
a = 1
b = 2
c = 3
で試してみるといい。Maxが2になってしまう

Ifだけでやる場合の正解の一例
Max = a
If b > Max Then Max = b
If c > Max Then Max = c
0663デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:35:16.96ID:1oL4uemZ
>>661
If Elseの構文は、最初のIfの条件が成立したらElse以降は処理されずEnd Ifまで飛ばされる
つまり、
a = 1
b = 2
c = 3
だった場合、
b > Maxが成立したらc > Maxの部分は飛ばされてしまうからMaxは2のまま終わってしまう
0664デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:44:30.26ID:fQoG7lNZ
elseやelseifは先行条件でTrueにならない場合にしか実施されない仕組みなことを理解しましょう
0666デフォルトの名無しさん
垢版 |
2018/11/16(金) 09:26:27.62ID:RKO+v0zL
ID変ったかも知れませんが>>656です
皆さんありがとうございます

>>665
手痛いレスですが、出来るところまで頑張ろうと思います。プログラマーではないですが基本は覚えないと連携し辛い位置の役職のため頑張ります。
0667デフォルトの名無しさん
垢版 |
2018/11/16(金) 09:39:56.01ID:fQoG7lNZ
本当のプログラミング初学者なら仕方ない。制御構文なんてどの言語も似てるので、1つ覚えれば次は勘が効くようになるよ、長い目でがんばりなされ
0671デフォルトの名無しさん
垢版 |
2018/12/16(日) 00:58:32.35ID:SwJ6GlUb
>>668
わにわに
0672デフォルトの名無しさん
垢版 |
2018/12/16(日) 01:01:16.65ID:SwJ6GlUb
パニックを、5人がかりでやれば楽勝だろ、とか言ってるようなもの。
0675デフォルトの名無しさん
垢版 |
2018/12/26(水) 21:53:30.63ID:KrpjpPkw
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

上手く情報を取得できないのでアドバイスお願いします。
0676デフォルトの名無しさん
垢版 |
2018/12/27(木) 00:53:04.14ID:coxr7jtk
>>675
wbに何も代入されてない。
AnotherSheetへの代入もこけるはず。
AnotherSheetが正しく生成されたとしても、その後使用されていないから何かとってこれるはずがない。
0678デフォルトの名無しさん
垢版 |
2018/12/27(木) 01:02:39.75ID:coxr7jtk
>>675
行列指定が逆?
5行目を右方向に評価してくような感じになってるけど、新規に作ったシートが対象になってるから、一周もループしてないよね?
0680デフォルトの名無しさん
垢版 |
2018/12/27(木) 01:16:51.54ID:coxr7jtk
>>675
バックで開いたつもりのブックに新規シート作っちゃってない?
ブックのフォーカスを制御するとか必要かも。
0681デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:18:35.23ID:psUgzr4+
ID変わりましたが>>675です。

>>676>>680
遅い時間帯でありながら見てくださって
ありがとうございます。

色々と不十分だったのですね。
指摘箇所を直したりして
また報告しようと思います。
0682デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:19:34.30ID:lhYnw8ev
>>675
最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。
ちゃんと省略せずにWorkbookやWorksheetから書くようにする。
しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。

以下はスマホ上で書いてるんで動くかは不明です。
0683デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:20:24.73ID:lhYnw8ev
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
0684デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:22:53.65ID:lhYnw8ev
>>680
フォーカスを制御すべきじゃない。
いきなりRangeやCellsを使うから上手くいかないのであって、きちんとブックやシートから書けばフォーカスを制御しなければならないことは滅多に無い。
0685デフォルトの名無しさん
垢版 |
2018/12/27(木) 09:26:03.58ID:lhYnw8ev
早速間違いだ。
fullPassと書いてる所が一ヶ所ある。
fullPathに直しておいてね。
0687デフォルトの名無しさん
垢版 |
2018/12/27(木) 11:57:21.88ID:psUgzr4+
>>682‐685
ありがとうございます
深夜のご指摘から>>685まで参考にしていて

現在デバッグしてますが、“カピバラ種類”のシートが上手く取得できていないようです。
ちなみに
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
その通りです、分かりづらくてすいません。

改行制限のためいくつかコメントは掲示板に書き込むとき省いてしまいました。

'Range("A1").Selectって何の為に有るの?
ですが 、新シートのA1から書き込む為に書きましたが、デフォルトでA1から書き込むみたいですので
無駄なマクロでしたね。
0688デフォルトの名無しさん
垢版 |
2018/12/27(木) 12:23:02.37ID:psUgzr4+
少し言葉足らずでした。
iのカウント(空白行までループ)は上手く出来ているので、現マクロ有効ブックの新シートに取得情報を
書き込めていないようです。
0689デフォルトの名無しさん
垢版 |
2018/12/27(木) 12:57:12.54ID:lhYnw8ev
>>688
うん?
Do〜Loopの中はiのカウントアップしてるだけなので、あなたが省略した(と勝手に思ってるんだけど)コードが動いていないということ?

念のためにいうと、元々のコードには情報を取得するコードが全く無いからこのコードだけじゃ取り込めないのは当たり前だよね。
0690デフォルトの名無しさん
垢版 |
2018/12/27(木) 13:47:48.84ID:psUgzr4+
すいません、
不覚に気づき、
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
にして上手くいきました、ありがとうございます。
0691デフォルトの名無しさん
垢版 |
2018/12/27(木) 13:57:20.08ID:psUgzr4+
細かい修正として
j = i
i = i + 1
の部分も
i = i + 1
j = i - ○
のようにして、
無駄にできてしまう空白もなくしました。

お付き合いしてくださった方、
ありがとうございました。
0692デフォルトの名無しさん
垢版 |
2019/01/03(木) 04:15:42.29ID:aAVkqECP
質問です
ワークシート上にすでに引かれている複雑な枠線をコードとしてどうにか変換というか取得できる方法はないでしょうか…
0694デフォルトの名無しさん
垢版 |
2019/01/03(木) 13:29:44.69ID:aAVkqECP
>>693
返事ありがとうございます
すみません、私の頭では理解できません…よかったらもう少し詳しく教えてもらえませんか
0696デフォルトの名無しさん
垢版 |
2019/01/03(木) 15:15:01.64ID:Em9anKIf
>>694
罫線を描く動作は理解できてる?
マクロ記録で簡単に調べられますよ。
例えば、2行2列選んで、縦横斜め全てに実線入れて
記録されたものを見ればどのような構造で描かれているのか
分かります。
記録の際は、xl〜の定数でよいですが、取得の際は数値で
返ってくるので注意。
調べたければオブジェクトブラウザで調べてもよいですが、
イミディエイトで、?xlThin みたいに簡単に確認する方法も
あります。
でも、取得して使うなら数値のままでもOKです。
ここまではOK?
0697デフォルトの名無しさん
垢版 |
2019/01/03(木) 16:26:50.99ID:+aY40et6
>>695
>>696
会社でとある先人の作ったエクセルのフォーマットがあるのですが、それを使って作業するおばあちゃんが度々壊してしまうのです
セル結合やセルの幅など複雑になっている物なので、壊してしまったパソコンの不得意なおばあちゃんはいつも四苦八苦していて、どうにか入力された数値以外の罫線や列幅などだけボタン1つ簡単に戻せるものを作ってあげたいと考えています

頂いたヒントを元にもう少し頑張ってみます
結局わからなければまた質問させてください
ありがとうございました
0698デフォルトの名無しさん
垢版 |
2019/01/03(木) 16:38:04.35ID:CdG5H8Qg
>>697
シートの保護じゃダメなの?
おばあちゃんには特定セルに数値入力させてるだけなんでしょ?
0699デフォルトの名無しさん
垢版 |
2019/01/03(木) 17:30:36.94ID:Em9anKIf
>>697
シート保護で十分みたいですね。
もし何らかの理由で保護できないのであれば、
同フォーマットの隠しシートから書式貼り付けした方が早そう。
セル結合もあるし、1セルずつ罫線情報取得とか効率悪すぎ。
0700デフォルトの名無しさん
垢版 |
2019/01/03(木) 22:01:21.27ID:aAVkqECP
>>698
>>699
それがわかりながらあらゆる所(不規則)を動かさないといけない時があったりで、保護だと都合が悪かったんです
フォーマット自体を大幅に変更できればもっと色々と簡単にできるのですが、それも他のおばあちゃんたちが前の方が良かった〜なんて必ず言うので見た目を崩すことはできません
担当のおばあちゃんorおばさんが変われば書式貼り付けのための範囲選択も上手くできないだろうから(全選択など知りません)また誰かが黙って長時間四苦八苦する事になってしまいます
無駄にすべて最初からやろうとしたりも平気であります
平均年齢49才の職場なので仕方ないんです
誰にも聞かずに戻したい部分を戻せるような、とーーってもわかりやすい説明付きのボタンをユーザーフォーム上にでもいくつか作ってあげたいと思っています
崩してしまうパターンはだいたい把握できているので、それが最善かなと…
0701デフォルトの名無しさん
垢版 |
2019/01/04(金) 02:06:01.37ID:+nkelZ7z
>>700
いや、だから隠しシートから自動的に書式修復をかければという意味で言うたのですが、、
トリガーはファイルオープンでも、ボタンでも。

試しにやってみたけど、罫線やセル結合は問題なく修復できるみたい。
入力規則とかは引き継げないみたいなので別にケアする必要があるかも。
行挿入、列挿入とかされて座標がかわるようなことされないならこれで十分では?

自分がよくやるのは、表のエリア毎に範囲名をつけて、そのエリア単位で最初に表組みした
ときと同じ要領で表作成を記録していき、コードを整理して修復マクロにします。
これなら起点となるセルが壊されなければ行挿入、列挿入にもある程度柔軟に対応
できるし、式や入力規則の修復も追加できる。
まぁ、利用者は作成者の想定を軽く超えてきますけどね。
0702デフォルトの名無しさん
垢版 |
2019/01/04(金) 08:59:12.57ID:jYRqvj54
>>701
理解力なくてすみません、、、
そしてありがとうございます
そのやり方を取り入れてとりあえず一度作ってみます!
0703デフォルトの名無しさん
垢版 |
2019/01/19(土) 20:28:43.04ID:gUifgf+0
ディム a アズ インテジャー
コンスト b アズ バリアント = ファルス

この読み方はあってますか?
0705デフォルトの名無しさん
垢版 |
2019/01/20(日) 08:43:51.62ID:KJwN8fo6
マジか!
自信なくなってきたわ。
フォー イーチ 〇 イン、スターコンブ、ブイビーナロウ、コンカット、
ナンバーフォーマットローカル、ドゥ ホワイル、イズナメリック、
デカー ファンクション セットウインドウロング リブ "ユーザー32" エリアス、
バイバル 〇 アズ ブーラン、アプリケーション.ハウンド、オプション エクスプリシト。
0714デフォルトの名無しさん
垢版 |
2019/01/31(木) 16:04:06.71ID:f4/Ws+Wz
パワポでExcelのVBAにある
Application.OnUndo
みたいなことって出来ない?
0717デフォルトの名無しさん
垢版 |
2019/02/01(金) 15:41:12.07ID:lbEDOgk3
>>716
そっちだね
あるいはパワポの内部変数(たとえば図形のRGB値とか)の変化を検知してイベント上げるとかでもいいんだけども
0718デフォルトの名無しさん
垢版 |
2019/02/01(金) 19:24:08.72ID:69So7CMb
質問スレでいつも思うんだけど、どんな状況でそれが必要なの?
Excelで出来るんなら、逆にExcelをパワポっぽく見せるという手もあるんじゃないの?
0719デフォルトの名無しさん
垢版 |
2019/02/02(土) 00:14:40.30ID:hkITps2T
勉強もかねてパワポのアドイン作ってるのよ
だからExcelじゃなくてパワポで出来なきゃ意味がない
その機能自体が必須で欲しい訳ではないから出来ないなら出来ないで諦める
0721デフォルトの名無しさん
垢版 |
2019/02/09(土) 00:13:31.38ID:nXE2v5Lv
Functionで値を返すのと、ByRefで返すの、どう使い分けたらいいのか、わからなくなってきた。
どっちでも返せる状況なら、どっちがいい?
0724デフォルトの名無しさん
垢版 |
2019/02/09(土) 04:25:25.62ID:6oInKB58
Function一択

ByRefは古い書き方で互換性のために残してる
これから作るプログラムには使うべきじゃない
0727デフォルトの名無しさん
垢版 |
2019/02/27(水) 18:52:45.21ID:0gstYK5t
sortのcustomorderって、セル値を入れられたりはするのでしょうか?
複数のセル値を優先順位としてデータを並び替えるマクロを作成したのですが動作が遅いので改善出来ればと考えています。(forとifで判定する手法をとっています)
よろしくお願いします
0729デフォルトの名無しさん
垢版 |
2019/03/19(火) 09:29:22.78ID:3/8oXV0g
VBAがどっとNet対応
キターーーー!
0732デフォルトの名無しさん
垢版 |
2019/03/19(火) 22:45:44.06ID:i2FNQUrb
さて、名前付き範囲ってVBA@Excelで使えないんだろうか。
もし使えたとして、実行時間はどうなのだろうか。
色々と謎が多い。
0734デフォルトの名無しさん
垢版 |
2019/03/20(水) 00:38:39.23ID:vmDq6MjZ
>>732
使えるよ
Application.Namesでコレクション取得して名前つき範囲にアクセスできるし、シートのRangeプロパティの引数ラベルとして名前をそのまま使ってセル取得できる
0735デフォルトの名無しさん
垢版 |
2019/03/20(水) 16:11:53.05ID:VkiUMgxP
>>733
横からだけど、どう面倒になるの?
0737デフォルトの名無しさん
垢版 |
2019/03/20(水) 21:06:17.96ID:ad3N4bFR
名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる
0738デフォルトの名無しさん
垢版 |
2019/03/21(木) 01:35:24.94ID:XMapNPTs
なんで正規表現?
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない
0740デフォルトの名無しさん
垢版 |
2019/03/21(木) 07:34:08.81ID:u3u8nbsq
>>737
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う
0741デフォルトの名無しさん
垢版 |
2019/03/22(金) 17:57:33.45ID:DJ7JSKt5
会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな?
0743デフォルトの名無しさん
垢版 |
2019/03/22(金) 19:06:27.17ID:DJ7JSKt5
>>742
そりゃないよ、かあちゃん
0744デフォルトの名無しさん
垢版 |
2019/03/22(金) 19:28:02.41ID:s6oj+Xdm
>>741
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。

1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす

たぶん、こんな感じでできたはず。
0745デフォルトの名無しさん
垢版 |
2019/03/22(金) 19:35:54.55ID:DJ7JSKt5
>>744
ありがとうございます。
しかし、もし50個URLがあれば50個新しくExcel自体を起動しないといけないのですか?
そんなことしたら激重になってしまうように思うのですが。
0751デフォルトの名無しさん
垢版 |
2019/03/22(金) 21:25:13.65ID:uvzdlIQp
なんか勘違いしてるやつがいるけど、VBAがマルチスレッドじゃないことと、IEを複数開くのはまったく別のことだからな

IEはOfficeとはまったく無関係の独立したプロセスだから、いくつでもインスタンス化できるし同時にネットアクセスできる
IEオブジェクトを配列で作っといて、ページの読み込み完了を待たずにどんどん開いてけばいいんだよ
0754デフォルトの名無しさん
垢版 |
2019/03/22(金) 22:13:49.76ID:LAgBLCyu
IEにタブをいくつも開いてもらって、みんな読み込んだところでおもむろに順番に処理すればいいってことだろ。
0756デフォルトの名無しさん
垢版 |
2019/03/22(金) 22:38:21.07ID:DJ7JSKt5
>>750

>>751
その具体的な方法をコードで例示する形で教えていただきたいのでござるよ。

いまだと
Do While readyState < 4
Do Events
Loop
の待ちを50個のURLで1つ1つ順番にやってて
1つのURLを読んでデータ取って閉じる、というのをやるのが社内ネットワークが遅いため(データベースからの読み込みも含まれるからの)1つあたり1分近くかかってる。
だから異常に時間がかかる。
一気に全部同時にやれないかなと。
0759デフォルトの名無しさん
垢版 |
2019/03/22(金) 22:57:51.11ID:HaipTOms
そもそも回線が細いのはプログラムでどうこうできないから上司を説得して諦めてもらうしかない
0760デフォルトの名無しさん
垢版 |
2019/03/23(土) 01:14:24.21ID:BU4e6Kdq
趣味でやってるんじゃなかったら
適当なダウンロードソフト使ったほうが良いんじゃない
0761デフォルトの名無しさん
垢版 |
2019/03/23(土) 12:00:24.62ID:36Js1rz1
動くかどうか試してないけど、こんな感じでいいんじゃない?
もう少し効率を上げるなら、読み込めたページからさっさと処理してもいいし

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
0762デフォルトの名無しさん
垢版 |
2019/03/23(土) 15:33:38.79ID:BqJUz3fJ
>>761
ありがとうございます。
試してみます。
最初のFor Nextループがものすごく時間がかかりそうで楽しみです。
あと先日は説明の簡略化のためにシンプルに書いたけど
実は開いたURL内で、ある条件があると、さらにその親URL内のAリンクの子URLも開かないといけない複雑な事情があるのです。
0763デフォルトの名無しさん
垢版 |
2019/03/23(土) 19:47:18.63ID:h2FSWEPH
>>761
Exit For抜けてますよ
フラグも i = pg-1まで行けたときに立たせるだけで十分だと思います

あと、非表示でIEを50立ち上げると中断した時のプロセスの掃除が大変なので、Ajaxで無ければXMLHTTP60を使うのも手かもしれません。
0764デフォルトの名無しさん
垢版 |
2019/03/24(日) 00:51:51.95ID:gZMjxNOF
>>752
まさかIEオブジェクトの読み込み動作がVBAのスレッドで処理されてると思ってるのか?
>>753
終わりじゃないので考慮点はある

コード書こうかと思ったけど、>>761さんが書いてるからまあいいか
読み込み完了の検出とかどうするか悩みどころではある
イベントハンドラの動的設定か、せめてWithEventsが配列にも宣言出来ればなぁ

まあ50も多重化してもオーバーヘッドかかるだけで高速化しない気がするから
数個固定で持たしてイベントハンドリングするのが現実的かもしれん
0765デフォルトの名無しさん
垢版 |
2019/03/24(日) 01:34:57.18ID:Y3S3b5Ai
この場合Do Loopを抜ける条件が全ページの完了だから、Exit Forはあってもなくても結果というかスピードは変わらないね
さっさと抜けたところで、またForループに戻るだけだし

個人的には「pg - 1」が何回も出てくるのが美しくないなあとか、ForとDoの順番を逆にした方がコンパクトになりそうだなあとか
0766デフォルトの名無しさん
垢版 |
2019/03/24(日) 01:38:23.22ID:Y3S3b5Ai
一括処理なら、この方がコンパクト
まあ、ホストの応答速度や、次の処理の内容次第では終わったページからどんどん片付けた方がいいだろうけど
For i = 0 To pg-1
Do
Loop Until ie(i).readyState >= 4
Next
0767デフォルトの名無しさん
垢版 |
2019/03/24(日) 08:29:39.64ID:myNgr9GS
>>765
> 個人的には「pg - 1」が何回も出てくるのが美しくないなあとか
C言語とかに慣れてるんだろう
VBA的には
ReDim ie(1 To pg)
ReDim url(1 To pg)
For i = 1 To pg
だろうね
可能であればieとurlをTypeで纏めてそれを配列にした方が見易い
0769デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:28:46.47ID:3PVCt58k
>>766
それだとサイズのでかいページで待ちが発生する

Do
For i
If ie(i)準備完了 And i.処理フラグFalse then
処理
処理フラグTrue
カウント
End if
Next
カウント=50 exit
Loop
0770デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:33:07.42ID:Mw3X0nZC
>>769
投げてからの待ちだからいいんじゃねえの?
俺はやったことないから知らんが、投げたらあとはIEが並行処理で取ってくるんだろ
で全部取ってから次の処理なら問題ない
でかいページでVBAが待っていても同時に他のページもIEが取って来てるんじゃねえの
だからでかいページで待っていてもそれが終わったら他の軽いページも取り終っていてあとは
ばたばたと進んで終了、と理解している
0771デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:52:55.88ID:Mw3X0nZC
>>769
ああ、すまん。それがわかってる上で待ち時間がもったいない、ということね
>>766もそこは注意書きはしているな
0772デフォルトの名無しさん
垢版 |
2019/03/24(日) 10:56:37.24ID:OZ1kvGmt
IEはマイクロソフトも使うなって言ってるのに
VBAって不便だよね
0773デフォルトの名無しさん
垢版 |
2019/03/24(日) 11:58:25.29ID:yYEn14s6
IE使えなくなったら、どうやってブラウザ制御するの?
UIAutomation面倒くさいかから、
0775デフォルトの名無しさん
垢版 |
2019/03/24(日) 12:34:48.16ID:4ve/ST91
IE使えなくなったらってもう使ってる人なんていない
セキュリティに甘いとこは使えるのか?
0776デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:28:35.85ID:Y3S3b5Ai
ちゃんと動くのか試してみた
たしかにIEが複数開いて、平行処理でページを取ってくるね
VBAのシングルスレッドとか完全に無関係やん
0778デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:36:50.26ID:PYh3zpOu
大昔からあるファイルシステムだって非同期読み書きできる
1000倍遅いネットワークで出来ないはずがないだろうが
0780デフォルトの名無しさん
垢版 |
2019/03/24(日) 14:55:03.02ID:gZMjxNOF
現実的には50並列で全ページ完了待ちするのはどうもなぁ

あと全力でループまわして完了待ちするのも無反応になるんじゃね
とりあえずDoEvents挟もうぜ

>>776
スレッド以前に、IEオブジェクトが別プロセスだから
アウトプロセスのCOM使うのはVBAで並列やる、おそらく安全で簡単な唯一の方法
まあCOM作る方は大変だがな

>>777
OSがサポートしてるだけで、VBAから使えるかどうかとは別の話
VBAで非同期並列やりたければ、基本的にはイベントベースでしかサポートされていない
0781デフォルトの名無しさん
垢版 |
2019/03/24(日) 17:00:18.75ID:cASdygc2
>>776
これ、1つずつ待つ部分がVBAでマルチにしたいって話だったけどCreateObjectで既に別プロセスだから全部投げてから全部の完了を待つので正解なんだよな。

勘違いしてマルチプロセスでやろうとしちゃったよ。
ついでにApplication.Runで出来なくて、迷ってたんだけど、またまた勘違いでApplication.OnTimeが正解だった。
でもOnTimeって戻り値が取れないんだよな。
0782デフォルトの名無しさん
垢版 |
2019/03/24(日) 17:02:38.91ID:cASdygc2
あと、ExcelVBAスレにあるようにInternetExplorer.Applicationじゃなくて別のオブジェクトの方が早いと思うよ。
0785デフォルトの名無しさん
垢版 |
2019/03/24(日) 21:00:07.33ID:IVIO7oct
取りあえず書いてみたんだが、1つずつ待っても速度が変わらん。
テスト用に繋げた所があんまり時間が掛からん所でReadyStateのループに入らんのよ。

取りあえずInternetExplorer.Applicationはやっぱり遅かった。
59個のURLから同じ場所にある特定のデータを取ってくる処理でMSXML2.XMLHttpなら5秒のところIEだと60秒くらい掛かった。
0786デフォルトの名無しさん
垢版 |
2019/03/24(日) 23:42:52.24ID:Y3S3b5Ai
IEを普通にUIを持ったアプリケーションとして開けば、クッキーや画面のレンダリングからアクセス履歴の更新やキャッシュの整理までいろんな処理が走るから、そりゃ実質GETだけのXMLHTTPと比べたら遅くなるのは当たり前と言うか

>>785
画像検索にそれぞれ違うキーワードを設定すれば、それなりに時間がかかるようになるから負荷のテストにはおすすめ
0787デフォルトの名無しさん
垢版 |
2019/03/25(月) 08:15:58.30ID:O3TyiYmg
>>786
そんなことは知ってるが、ここの話で具体的なのがIEだから、いやいや、IEはこんなに遅いですよと注意喚起したんだよ。

まあ、Script関連でIEじゃないと駄目な場合もあるけどね。
0788デフォルトの名無しさん
垢版 |
2019/03/25(月) 21:50:57.49ID:D+uIa6Au
真のエクセラーならieなんか使わずにwebクエリーとか使って何とかするべきだろうが
0789デフォルトの名無しさん
垢版 |
2019/03/25(月) 23:08:06.35ID:DuFQaNpH
getElementByもWebクエリも使ったことあるけど、
Webクエリはどうやって取ってきてるのか謎。
0791デフォルトの名無しさん
垢版 |
2019/03/26(火) 00:39:52.05ID:ke9zWH00
誰もSelenium basic使わんの?
IE使わなくていいしセッション維持とかも楽だぉ?
0792デフォルトの名無しさん
垢版 |
2019/03/26(火) 18:58:02.34ID:ADoE3fhW
readystateが信用ならんのがな
completeになっても完全に読み込めてなくてその後の要素取得処理に失敗とか高確率で起こるし
WinHTTP使うのが確実だと思う
0793デフォルトの名無しさん
垢版 |
2019/03/26(火) 22:23:16.17ID:0P7j5sat
>>791
x だぉ
o だよ
正しい日本語を使いたまえ
0795デフォルトの名無しさん
垢版 |
2019/03/27(水) 00:00:47.48ID:sk2gWEk1
>>794
x 結局Do LoopとOn Error Resume Nextで逃げるしかないっていう。
o 結局Do LoopとOn Error Resume Nextで逃げるしかないっていうことですね。
正しい日本語を使いたまえ
0798デフォルトの名無しさん
垢版 |
2019/03/27(水) 07:39:47.73ID:qB5RyyD6
では、教えてくれ。
正しい日本語の"正しい"とはなんのことだ。
先に言っておくが、国語辞典や義務教育は関係ないぞ。
0800デフォルトの名無しさん
垢版 |
2019/03/27(水) 12:48:07.16ID:Mdwmg5PN
>>798
国語辞典や義務教育関係ないと言うのならば口語体でも問題ないと思うが…。
例えば力不足、役不足のように意味を間違えて使っていては当然正しい日本語ではないが、今回の様な場合では相手方に伝われば良いということにならないか。
0803デフォルトの名無しさん
垢版 |
2019/03/28(木) 21:53:50.06ID:cIkPDI6N
>>796
x 口語体が理解できないやつが正しい日本語とか
o 口語体が理解できないやつが正しい日本語とかどういうこと?
0804デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:24:25.12ID:Q+Q3MpKo
長いのでWithするかSetしましょう。

With 口語体が理解できないやつが正しい日本語
  とか = ×
  とかどういうこと? = 〇
End With
0805デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:39:02.51ID:cIkPDI6N
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
0806デフォルトの名無しさん
垢版 |
2019/03/28(木) 23:57:12.09ID:OmRArJOr
日付フィルターを使うときにCriteriaに設定する値って、必ず一旦Double型に型変換したDate型データをもとにしてFormat変換しなきゃいけないのかな?
Date関数の戻り値をそのままFormat変換してもうまくフィルターがかからなくて危うくハマりかけたんだが、後学のために識者がいたら教えてほしい
0808デフォルトの名無しさん
垢版 |
2019/03/29(金) 00:47:46.11ID:MmeaYZo8
>>807
x まともなレスには異論返せないのな
o まともなレスには異論返せないのね
0814デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:25:26.20ID:Fw0ogXHz
VBAで実行時にシンタックスエラーが出るのはどういう場合だろう
デフォルト設定だと1行入力ごとに構文解析するし
0815デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:27:30.74ID:uS2atdcl
>>814
それ、1行ごとの構文解析だろ
For Next Do Loop If End If
のチェックまではしてないと思うぞ
0816デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:28:29.64ID:uS2atdcl
ああすまん。これってシンタックスエラーではないんだっけ
でもエラーになるよね
0817デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:41:55.36ID:Fw0ogXHz
Nextを書かなかった場合は
「コンパイル エラー:For に対応する Next がありません。」
だった

もしシンタックスエラーのエラーコード(変数Errの値)が存在すれば出る可能性があるってことだと思うけど、コードの一覧てどこにあるんだ?
検索してVBのは出るけどVBAのが見つからん
0818デフォルトの名無しさん
垢版 |
2019/03/30(土) 09:49:53.73ID:uS2atdcl
シンタックスって言葉自体は構文規則だけど、コンパイルエラーって出るんだね
0819デフォルトの名無しさん
垢版 |
2019/04/06(土) 00:50:26.14ID:ocPEvB9Z
ExcelVBAでListViewを参照設定で追加して
フォームに配置して使っているんですが、
別フォームからshowしてすでに項目をいくつか追加してある
ListViewのあるフォームを表示したときに
ListViewをアクティブ(そのままの状態から矢印キーで項目を選択できるようにする)
にすることは可能ですが?
例えば

Public Sub UserForm_Active()
With listview1
.ListItems(1).Select
.SetFocus
End With
End Sub

とした場合に、フォーカスは確かにListView1にあるのですが、
その状態では項目が矢印キーの上下で選択することができません。
ListView1.SetFocusではListView1全体にフォーカスはあるが
肝心の中身の項目にはフォーカスがない状態ということなのでしょうか?

なにかよい方法はありますでしょうか?
0823デフォルトの名無しさん
垢版 |
2019/05/10(金) 13:15:01.20ID:SsAAf7AE
VBA勉強中のものです。

Setステートメントを勉強しているのですが、オブジェクト型についてお聞きしたいです。RangeオブジェクトとかWorksheetオブジェクトなど、いろんなサイトなど見ても使いどころがよくつかめてないです。

どんなときに使うのか、教えてもらえるとありがたいです。
0825デフォルトの名無しさん
垢版 |
2019/05/12(日) 02:32:02.86ID:0u/cIV/f
>>823
オブジェクトなら同じものを頻繁に扱うときにコーディングミスをしにくくなる。

毎回、名前でアクセスしていると、ちょっとしたことで、別のものを間違って扱う可能性が高まって、実行時エラーを発生させやすくなる。

定数化していれば防げるが、定数のスコープを大きくしないといけないので、定数の値を変えるときにあっちこっちを確認しながら、直すことになり面倒なことになりやすい。
0826デフォルトの名無しさん
垢版 |
2019/05/13(月) 13:34:22.56ID:p6Zrf1zY
object型の初期状態はNothing
参照先が存在しない場合もNothing返るのがあってis式で判定できる
一方でvariantの初期状態はemptyなのでis式がエラーになる
0827デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:12:50.85ID:/95lNMvT
オブジェクトの値がNothingかどうかで判断するロジックはセンスがいいとは思えない。
0829デフォルトの名無しさん
垢版 |
2019/05/13(月) 23:46:53.76ID:4/CDP/BQ
自分で変数の値をコントロールしているのに、Nothingかどうかをあちこちで確認しているクソプログラマと1年前に仕事した。
0830デフォルトの名無しさん
垢版 |
2019/05/14(火) 08:31:35.00ID:BLcva127
>>827
ライブラリ側は何で判定すべきなんだ?
それともNothingを渡されたら挙動は未定義とするとか?
0831デフォルトの名無しさん
垢版 |
2019/05/14(火) 11:18:55.94ID:4FRIObo4
>>830
そのライブラリは他人が作ったものなのか?自分が作ったものなのか?
0833デフォルトの名無しさん
垢版 |
2019/05/14(火) 12:37:11.77ID:W+bs/bzK
ライブラリに状態を持つプロパティがあればいい。

他人が作ったものを使うしかなく、オブジェクトがNothingかどうかでしか判断できないのなら、そうするしかない。
0835デフォルトの名無しさん
垢版 |
2019/05/14(火) 16:16:33.74ID:E8REZJpG
いきなりライブラリと言われても何のことやらわからない。
0836デフォルトの名無しさん
垢版 |
2019/05/14(火) 17:30:53.68ID:UTGAJPws
>>835
>>827 が「オブジェクトの値がNothingかどうかで判断するロジック」って言ってるじゃん。
ある関数がオブジェクトを受け取ったときの判断方法の話だと思うんだけど、
自分はライブラリ作者なのでその場合どうするのがいいのか気になった。
0838デフォルトの名無しさん
垢版 |
2019/05/14(火) 22:22:18.25ID:jcYCvcdA
>>837
エラーとは限らないけど変数の状態に応じて処理を分けたいと言うのはある。
空のオブジェクトに対してはまた空を返すとかね。
>>829の言ってることはわかるんだけど、>>827>>828の主張がわからん。
Nothing判定はシンプルだけどTypeNameやenumだともっと分岐のパターンが増えちゃうじゃん。
0839デフォルトの名無しさん
垢版 |
2019/05/14(火) 23:23:54.78ID:+OBjJPst
>>836
世の中、変なやつがいて、オブジェクト変数に値をセットして、何も変わるはずがないのに、直後にオブジェクト変数の値がNothingかどうか判定するコードを書くやつがいる。
0840デフォルトの名無しさん
垢版 |
2019/05/14(火) 23:30:59.65ID:KmX6ljlC
代入が成功したかどうか確認するテクニックも存在するから、そういう分野からの転職かな?
具体的には、コンパイラの型チェックを使った裏技だったり、ハードウェアの故障チェックなんかで使われる
0841デフォルトの名無しさん
垢版 |
2019/05/15(水) 00:37:47.48ID:yOOg6UjC
直後であってもサブルーチンに分かれてるなら
入力情報のチェックを行うのは普通のこと
0842デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:24:21.58ID:MwugOkQt
なんか例のCプログラマがしつこいけど、いまどき関係ない別プロセスがメモリ上の値を書き換えたりするミスは、OSレベルでもCPUレベルでもあるので、持論を批判されていると思って反論しなくていいよ。

ここは漠然としたVBAのスレッドだから、見ているひとにはあなたの言うことは難しくて理解できないと思うよ。

スルー力がないのか、寂しくてかまってほしいのか知らないけど、要はクソコードを書くなと言ってるだけだ。
0843デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:28:07.88ID:MwugOkQt
なんでVBAスレで組み込み系のショボいハードウェアでのプログラミングを語っているのか?

ハードウェア、OS、ミドルウェア、プログラミング言語によって考え方やどこまで想定するのかは全然、違うからいっしょくたにしないでもらいたい。
0844デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:29:01.28ID:O3OiMSIx
一般ユーザー権限のアプリで別プロセスのメモリにアクセスできたのは、平成どころか昭和時代の話ですよ、おじいちゃん
希にOSやCPUのバグ騒ぎが起きますが、そんなのは例外中の例外なんで普通は気にしなくていいことです
0845デフォルトの名無しさん
垢版 |
2019/05/15(水) 02:37:35.16ID:MwugOkQt
Windows 95、98、98SE、MeがいつのOSかもわからないのか
0848デフォルトの名無しさん
垢版 |
2019/05/15(水) 20:12:16.23ID:XVltvZnu
せっかくのイベントなのにPrivateにしたら星飛雄馬のクリスマスパーティーみたいになるじゃん
0850デフォルトの名無しさん
垢版 |
2019/05/15(水) 20:49:39.00ID:WHH9UP0v
何か面白いこと言った?
全然わからない。
興味あるからなぜ面白いか教えて?
0852デフォルトの名無しさん
垢版 |
2019/05/16(木) 14:30:12.55ID:wWtnEH3A
コード書く画面を
背景は黒に、文字は白に、する方法を教えれ
0855デフォルトの名無しさん
垢版 |
2019/05/23(木) 22:41:23.89ID:ufKYoT27
Wordで文字置換をしたいのですが、特定のフォントの文字列を検索して、文字列は変えずにフォントだけ変えたいです。半角を全角にしたいのですが可能でしょうか。ヒントだけでも教えていただけると有り難いです。
0856デフォルトの名無しさん
垢版 |
2019/05/23(木) 23:01:54.16ID:ubNtK04k
>>855
できる
任意のRangeのCharactersのフォントを一字ずつ調べて、探しているフォントが適用されている文字が見つかったらその文字のフォントを修正すればいい
半角から全角に変換するにはStrConv関数を使用し、第2引数conversionには列挙定数のvbWideを指定する
0859859
垢版 |
2019/05/28(火) 16:00:47.95ID:JWvhlEsx
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 くみこ
0860859
垢版 |
2019/05/28(火) 16:01:28.69ID:JWvhlEsx
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
0863859
垢版 |
2019/05/28(火) 17:30:10.75ID:xKlK3b52
>>861
ファッ!それかも!
マジでありがとうです!
何かあったらまた聞きます
ホントありがとう、頭いい人!
0864デフォルトの名無しさん
垢版 |
2019/05/28(火) 18:33:24.92ID:1J9FOJWe
初心者です。
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を中心にお勧めの書籍などありましたら教えていただきたいです。
今の書籍は痒いところに手が届かず…
0865859
垢版 |
2019/05/28(火) 19:44:38.82ID:xKlK3b52
>>861
set temp = .findnext(temp)の下に
i=i+1を入れた所、できました。
本当にありがとう!助かりました(T^T)
0866デフォルトの名無しさん
垢版 |
2019/05/29(水) 00:12:19.46ID:S0wmSPvZ
>>864
定番は「最速攻略 Word マクロ / VBA徹底入門」
Word VBAの書籍やWEBサイトは選択肢が圧倒的に少ないから、基本がわかったらVBEのオブジェクトブラウザやネットでMSDNを見た方が確実
0872デフォルトの名無しさん
垢版 |
2019/05/30(木) 18:38:59.73ID:3bWSKYGB
>>870
いろんなソースで、色つけたり太字にしたり、用紙指定や段組みして印刷させる

炎上プロジェクトに突撃するのに必須
0873デフォルトの名無しさん
垢版 |
2019/05/30(木) 18:47:13.10ID:2aR1E9YD
>>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
0874デフォルトの名無しさん
垢版 |
2019/05/30(木) 19:32:14.84ID:2aR1E9YD
こっちのがスマートだった
'選択範囲内にあるテーブルの一行目以外をクリアします。
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
0875デフォルトの名無しさん
垢版 |
2019/05/30(木) 19:50:35.91ID:2aR1E9YD
もし文字編集でcell()下位の.Rangeが省略されてるのを知らないと
cell.Range.Deleteの文字削除とcell.Deleteのセル削除が
使い分けができないので注意
0876デフォルトの名無しさん
垢版 |
2019/05/30(木) 22:47:58.04ID:JR52NV0g
>>871
そうだろうけど、
他のOfficeでも出来るんじゃないの?
拡張って参照設定の事でしょ?

>>874
マジかよWord Tableって・・。
ExcelでSQLが使えたり、Officeは割と何でもありだとは思っていたが・・。
0879デフォルトの名無しさん
垢版 |
2019/05/31(金) 00:35:41.84ID:/aDGaFpI
EmptyはVariant型の初期状態(何も入ってない)
セルの初期状態でもある
確認方法
新規ワークシートに対して、イミディエイトウィンドウで
Print TypeName(Cells(1,1).Value)
とすると
Empty
と表示される

Nothingはオブジェクト型変数にオブジェクトが代入されていない(結びつけられていない)状態

NullはExcelだと出番がないと思っていい
主にAccessでデータを扱う時にNullが必要な場面が出てくる
0880デフォルトの名無しさん
垢版 |
2019/05/31(金) 01:16:13.09ID:gZfVve3x
複数セルのRangeからプロパティとってくるとき不一致だとNullになるくらいやな
0881デフォルトの名無しさん
垢版 |
2019/06/02(日) 23:52:18.62ID:I/vPFDmN
ユーザーフォームの、複数のテキストボックス、
例えばオブジェクト名をtb1、tb2とかにしてループ文に組み込むということはできますか?
オブジェクト変数というのが関係しそうな気がするんですが、
テキストを読んでも理解できない…
0882デフォルトの名無しさん
垢版 |
2019/06/02(日) 23:56:26.76ID:56udfPFB
>>881
すべてのテキストボックスでループ。
目的のテキストボックス群で名前を元に絞り込みすりゃ良いんじゃね。
0883デフォルトの名無しさん
垢版 |
2019/06/03(月) 02:05:13.53ID:OjX7Po3D
普通はテキストボックスのTagプロバティに区別できるキーワード入れといて
For eachでUserform.controlsやると思う
0885デフォルトの名無しさん
垢版 |
2019/06/03(月) 13:44:44.83ID:DCISZKmM
>>881
オブジェクトの配列作って、という事だと思うけど
使うとしたらオブジェクト参照を保持したまま色々したい時ぐらいかも
値の参照とセットだけなら皆さん挙げられているcontrolsでやりますね
0886デフォルトの名無しさん
垢版 |
2019/06/08(土) 00:31:30.90ID:ycKO1KOa
vba スタンダード 、accessのおすすめの問題集ってやっぱり公式テキストでしょうか。
0887デフォルトの名無しさん
垢版 |
2019/06/08(土) 11:47:13.10ID:pWKWNjKi
エクセル Cells(1,1)
ワード   Cell(1,1)
        ↑
      は? 何でワードにはsが無い?
0889デフォルトの名無しさん
垢版 |
2019/06/08(土) 16:27:53.67ID:pA8BerVC
>>887
Word.Selection.CellsとかRow.Cellsとかあるで
Tableには.Cell(1,1)しかないがな
ちなCellsはxy指定できんがCellはxy指定必須や
エクセルのプロパティのほうが異常なんやで
0891デフォルトの名無しさん
垢版 |
2019/06/12(水) 21:19:56.07ID:Hop9ON+a
vba エキスパート は、excel ベーシック以外は公式テキストまだだから受験は待ったほうがいいですよね。
0893デフォルトの名無しさん
垢版 |
2019/06/24(月) 19:31:10.71ID:XS1zoxjN
以前word VBAの質問をした者ですが、その節はありがとうございました。
お陰様で処女作のユーザーフォームが完成しかかっているのですが、最終問題に難儀しています。
やりたい事:「保存」ボタンを押す→ActiveDocumentと同じ場所に「記録表」というフォルダを作成し、
その中に「"氏名”」というファイルを生成する。既に「記録表」のフォルダがあればフォルダは作成せず、
そちらにファイルを生成する。
なお、不特定多数のユーザーが使う前提です(保存場所を手打ちしたらユーザー名で詰む)

四苦八苦しましたが、ひとまず確認用にdesktopに生成しようとしてなんかユーザーフォルダの滅っ茶根深い場所に生成されたり、
推測で打ってみたメソッドが全く機能しなかったり(フォルダの有無を確認するようなのって何だろう)
なんというか、Excelのfxボタンみたいにメソッドの内容を教えてくれるやつ、ないんですかね…
ちなみに職場のPCはスタンドアロンでヘルプに繋がらず、自宅PCにはOfficeが入ってないです。
0894デフォルトの名無しさん
垢版 |
2019/06/24(月) 22:54:40.46ID:klKakRL3
>>893
オフラインヘルプインストールできなかったっけ… 見てみて

F2キーでオブジェクトブラウザが表示される
これ無しで開発なんてやってられない
0896デフォルトの名無しさん
垢版 |
2019/06/25(火) 08:17:29.97ID:uunD1dKc
>>893
デスクトップはエクスプローラーの左のとこにカタカナで出てるとこと同じやで
深いとこにできても、そちらから近道すればよろし
0897デフォルトの名無しさん
垢版 |
2019/06/25(火) 08:27:47.11ID:uunD1dKc
>>893
〉フォルダの有無確認
昔は Dir()だったけど、今は filesystemobjectかな。
参照設定も必要なので使い方も含めてggッテください
folderexists()
0898デフォルトの名無しさん
垢版 |
2019/06/25(火) 10:33:29.10ID:aRzPCUod
公式オフラインヘルプがあったのは2013だな

2016もオフライン版があるけど英語
https://github.com/OfficeDev/VBA-content/

基本的な機能は2013からあんまり変わってないから、2013用のヘルプを入れてしまうという手もある
使い勝手は悪いけど、いつでも参照できるという利点はあるから
0899デフォルトの名無しさん
垢版 |
2019/06/26(水) 09:21:12.11ID:IYAeNPRu
Activedocument.Pathで所在フォルダのパスが出せる
これとフォルダ名とファイル名繋げた文字列つくればSaveAs2の引数にできる
0900デフォルトの名無しさん
垢版 |
2019/06/26(水) 18:32:58.67ID:pdVAutd4
質問です。excel2016の並び替え機能で
漢字、かな(あ〜ん)、アルファベット(a〜z)で並べ替えて漢字の中でも「本店」を最上位とできませんかね?

降順だと上記並びなのですが、かな(ん→あ)、アルファベット(z→a)になります。
Custumorder に「本店」を入力すると漢字中で1番下になります。

よろしくお願いします
0903デフォルトの名無しさん
垢版 |
2019/07/04(木) 12:19:45.93ID:Siuy47lc
Wordの表で、
ActiveDocument.Tables(2).Select
みたいに選択したいのですが、どれだけ表を分割しても、
全ての表が  Tables(1) という扱いなようでエラーになります。
ひとつ前に似たようなものを組んだ時には問題なくTables(2)になりましたが、
それと構文上は全く違いはありません。
どうしたら Tables(2)という扱いになるのでしょうか。
0904デフォルトの名無しさん
垢版 |
2019/07/04(木) 22:43:55.95ID:lDcVSkIh
ユーザーフォーム内のコンボボックスに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
0905デフォルトの名無しさん
垢版 |
2019/07/05(金) 02:42:43.50ID:grV1bh4s
取得するのが D:/画像一覧/*jpeg*.jpeg になってるとか
fName は iName の間違いじゃないのかとか
myList は String なのにSplitした後のものを代入してるとか
0906デフォルトの名無しさん
垢版 |
2019/07/06(土) 12:30:25.64ID:z73aGQye
>>905
返信遅れて大変申し訳ありません
3つのご指摘直して反映できました。
ありがとうございました。
0907デフォルトの名無しさん
垢版 |
2019/07/25(木) 16:22:05.73ID:eKMV/4VB
ExcelVBAのユーザーフォーム上で、PDFを表示、操作をしたいです。
ですが、ユーザーフォームにコントロールを追加しようとすると、
「要素が見つかりません」とダイアログが表示され出来ません。
どなたか解決策をご存じの方がいましたら、教えていただけますでしょうか。。

Acrobat pro DCはインストールしてあり、ExcelはOffice365を最新の状態で使用してます。
0910デフォルトの名無しさん
垢版 |
2019/08/14(水) 15:00:22.98ID:Jc+eFMLQ
ここで質問していいかわからないんですが、違ったら誘導していただけると助かります。

メッセージボックスを最前面にするために以下のコードを利用したいのですが、呼び出し元の下から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

よろしくお願いします。
0911デフォルトの名無しさん
垢版 |
2019/08/14(水) 19:26:49.04ID:uFuQVnLY
【呼び出し元】
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
0912デフォルトの名無しさん
垢版 |
2019/08/14(水) 19:27:35.96ID:uFuQVnLY
他にExecを使う方法もある
0915デフォルトの名無しさん
垢版 |
2019/08/16(金) 11:35:25.09ID:vco+QnrA
>>911
>910,>914です。
教えていただいたコードを試してみたのですが、
‘何か処理を書く
のところに
MsgBox hoge
と入れたのですが、「はい」「いいえ」どちらの場合も 0 が返されます。
どうしたらいいでしょうか
0918デフォルトの名無しさん
垢版 |
2019/08/16(金) 14:13:30.60ID:WTD6eyC3
>>915
【WSHPopUP.vbs】 のWSHObj.Quit fuga は間違い。エラー出してる。
Wscript.Quit fuga が正しい
0919デフォルトの名無しさん
垢版 |
2019/08/19(月) 10:24:33.34ID:ELmh1Bgt
>>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の戻り値を取得
に変更し、成功しました。

たいへん助かりました。
ありがとうございました。
0920デフォルトの名無しさん
垢版 |
2019/09/25(水) 10:50:56.65ID:L8CrQHgr
WordのアクティブXコントロールのテキストボックスなのですが
BackStyleを0設定すると背景色は消えるのですが
デザインモードを解除すると背景色が出てしまいます

これはバグでしょうか
0925デフォルトの名無しさん
垢版 |
2019/11/21(木) 09:09:00.43ID:IRESAa/B
Exchange / Outtlook VBAの質問です
初歩的な質問で申し訳ありませんが、お知恵を拝借できないでしょうか

任意の名前を持つ配布リストや連絡先グループに属するExchangeユーザーのSMTPアドレスの一覧を取得するにはどうしたら良いのでしょうか

配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません

なお配布リスト、連絡先グループいずれも個人ユーザーのみが登録されている前提なので、再帰によるメンバー取得は不要な状況です
0926デフォルトの名無しさん
垢版 |
2019/12/31(火) 13:22:12.18ID:CEriAQ2K
エスパー的にはexchangeユーザーのユーザー一覧と配布リストのユーザーの
名前を比較すればいいんじゃね
0932デフォルトの名無しさん
垢版 |
2020/06/27(土) 08:55:28.74ID:9qJBLgyD
Aex
0935デフォルトの名無しさん
垢版 |
2020/07/11(土) 22:25:50.10ID:R8+8lu0C
頼むからVBAでWin32 APIを呼び出すのはやめてくれ
そこまで要求するなら包括的な自作DLLを作ればよいと
0940デフォルトの名無しさん
垢版 |
2020/07/12(日) 14:43:36.83ID:HEMY1mlG
Win32API使える奴がDeclare文読むの?
そりゃ、間違ってるとかおかしなのも中にゃあるけど、普通そんなとこ見ないだろ。
0941デフォルトの名無しさん
垢版 |
2020/07/14(火) 21:09:03.79ID:66utiKuE
質問スレにも書き込んだのですが二つの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
0942デフォルトの名無しさん
垢版 |
2020/07/14(火) 21:45:01.80ID:euO1Ygvg
初心者です。どうかお力添えをよろしくお願いします。
0943デフォルトの名無しさん
垢版 |
2020/07/14(火) 22:53:58.63ID:euO1Ygvg
すいません 自己解決しました。単純なスペルミスでした
0944デフォルトの名無しさん
垢版 |
2020/08/03(月) 07:54:11.09ID:4AChPi7X
製品番号のフォルダ検索して中のPDFファイルを開くようなマクロ書いてるんだけど
先日Officeのアップデートしたら、件のマクロがしばらく応答なしになって
悪意のあるマクロ云々とか言われてExcel強制終了になった

それ以後そのマクロは激遅に
ブックのファイル名変えたりマクロの関数名変えたりするとしばらくは元の速度に戻るが
1日位経つとまた遅くなる

調べてみたら、VBScript.RegExpのExecuteメソッドが10秒位かかるようになってる
通常は30msで終わるような代物がだ

どうもShellやRunで一度に多数のPDFファイルを開いているのがお気に召さなかったらしく
ファイル名や関数名でアンチウィルスのブラックリストに載る?
そのあとはそれっぽい名前のメソッドが標的になり遅くなるような感じ

こういうの経験した人いる?
0946デフォルトの名無しさん
垢版 |
2020/08/04(火) 17:10:57.70ID:FjnHeWDC
会社のPCじゃなければそれもありだが…

paloalto trapsとかいう奴
毎回反応する訳じゃないのが嫌だし
編集中のデータも問答無用でごっそり強制終了しやがるふざけんな
0948デフォルトの名無しさん
垢版 |
2020/08/05(水) 09:06:26.86ID:FS19WAoY
>VBScript.RegExpのExecuteが10秒

>ShellやRunで一度に多数のPDFファイルを開いている
の関連がわからんね

この二つは分けて原因を探るべきじゃ?
0949デフォルトの名無しさん
垢版 |
2020/08/05(水) 09:37:11.18ID:FS19WAoY
マクロ付ファイルでPDF開かせるてのは相当に怪しいと捉えられる可能性は高いね
セキュリティ変更や除外設定なんてのは出来ればしたくないだろうし引っかからないような対策があればいいがな

ShellやRunでPDF開くんじゃなくExcelもしくはWordに取り込ませるようにすると引っ掛からないかもという気がしなくもない
0950デフォルトの名無しさん
垢版 |
2020/08/06(木) 06:47:20.91ID:SEE4FkRy
VBAから直接PDFを開くんではなく
バッチファイルを書き出し実行することで反応の確率は減ったが
アンチウイルスが反応しやすい型番とかあってよくわからん

正規表現のexecuteメソッドは「それっぽい」名前のメソッドだろ?
これがアンチウイルスが反応したときに動作してた関数から呼ばれた時だけ遅くなるんだよ
同じブック中の他の関数から呼ばれた時は高速のままだ

dir関数でフォルダ内部のファイル名取得して正規表現検索してる時だけアホみたいに遅くなる時がある
0951デフォルトの名無しさん
垢版 |
2020/09/01(火) 22:25:39.71ID:zpaWCruh
VBA開発を頼まれた いくら位金額を提示したら良いか誰か教えてほしい

内容は不動在庫を15店舗くらいあグループ店の売り上げデータから引取先の候補を検索するシステム
商品のバーコードから行き先候補を検索する予定。


この内容ってアウトソーシングするといくら位?
0954デフォルトの名無しさん
垢版 |
2020/09/02(水) 07:41:48.93ID:9bMNhGbM
>>951
マジレスするとVBAは安いので1人月50ぐらいかな。

内容の詳細が分からないが、大して難しいとは思えないので。

どんなに簡単でも50以下は有り得ない。
0956デフォルトの名無しさん
垢版 |
2020/09/04(金) 13:35:21.25ID:YrY1uJ8P
皆さま回答ありがとうございました!
0957デフォルトの名無しさん
垢版 |
2020/09/05(土) 14:34:31.84ID:NQbTfPgu
>>944
遅レスだけど

速度が遅い件は経験ありますよ
うちの環境で調べたらSYMANTECのエンドポイントは大丈夫で、MSのディフェンダーだと遅かった
Win10のバージョンも影響したかもしれないけど、現行サポート対象バージョンは、ディフェンダーだとすべて遅い
会社のPCなんでActiveDirectory、SYMANTEC、SKYSEAがスタンダードなんだけど、更新時の不具合があったんで一部のPCでディフェンダーを使ってて発覚した
VBSの内容は、多少分岐やループはあるけど正規表現を使って置換するだけの簡単なものだった
0958デフォルトの名無しさん
垢版 |
2020/09/09(水) 22:08:05.33ID:kLG5WjnA
ミッションクリティカルな仕事をVBAでやってるのに、
少し前から動かなくなって修正したくても前任者がこの世に不在+仕様書やマニュアル無し+社内プログラム分かる人いない
って状況割とよく聞くけど、まあ自分が担当することになったんだけど、これどーすりゃいいの?

何社かソフトウェア開発系の会社に話聞きにいったら、vbaはちょっと・・・とか、プログラムみてこれはちょっと・・・って反応だし
1千万超える金積むとなると役員に説明しなくちゃならないんだけど、なんでおまえがやらないの?みたいな反応だし
まあ、控えめに言ってこのまま止まり続けると会社潰れるから言い値で出すしか無いんだろうけど
こういう状況、ここに巣喰う人達はどうやって乗り越えたのかアドバイスやヒントください

転職、以外で
0960デフォルトの名無しさん
垢版 |
2020/09/09(水) 22:58:18.76ID:sZuFJhML
>>958
素人が作っためちゃくちゃなコードのデバッグや修正は仕事でもやってるからあんまり困ったことない
言語も問わず引き受けてる
0961デフォルトの名無しさん
垢版 |
2020/09/09(水) 23:15:38.01ID:kLG5WjnA
>>960
すげえ
社内システム作ってるところとかつてで色んなところに聞きいったけど数百万じゃ難しいって言われたんだ
分かる人には難しさっていうか、見積もりがわかるもんなんだな
参考までにどういうところを見て判断するもんなの?
偉い人に説明するときの参考にしたい
0962デフォルトの名無しさん
垢版 |
2020/09/10(木) 01:17:25.37ID:Uj/ZEArt
>>961
変数名、インデント、コメントの入り方なんかを見れば、制作者のレベルがだいたいわかる
その上でソースの行数、モジュール数がどれぐらいか
0963デフォルトの名無しさん
垢版 |
2020/09/10(木) 01:28:39.24ID:R4ATSmnt
マクロの記録をベースにしてるのは危険な感じがする
あとループの中にgotoが入ってるやつ見たときはちょっと感動した
0966デフォルトの名無しさん
垢版 |
2020/09/10(木) 12:15:12.05ID:dws80o57
住宅で喩えるなら  地場でイチから設計・施工をする在来工法のパワービルダーや
社内で設計した通り加工し現地で組み立てるだけのハウスメーカー 又は方式は
一緒だけどコスト削減に特化して現地の安い下請け使って費用を抑えるローコスト系

システムを売りにしてる企業は上で言うHMに近く、依頼すればひと声一千万は相場
PBはどんどん規模が縮小してるから探すのも大変 LCHMなら見付かるかも知らんが
要求に応じかねるレベルだと思われる

当時の社内の人間が内製したレベルならその条件、例えばExcelVBAと絞って
改修・修繕の可不可(得意かどうか)を先ず相手に問えば話が早いかも知れない
業務内容を伝えるだけだとうまく伝わらずに高額商品を売る方向に話が進み兼ねない
0967958
垢版 |
2020/09/10(木) 12:19:21.40ID:Oh+8RCfx
>>962
はえ〜・・・なるほどなぁ
変数名は一応業界の人なら意味が分かる程度
インデントはルールから逸脱してるのはほぼない、とおもう
コメントはあることはあるけど助けられたコメントはほぼないな
'ここで●×処理をする Sub ●×処理(・・・・・・・) みたいなw
行数はただの改行も含めると3万行くらいで
モジュールが4、functionが500、subが1500くらい

この辺が大量にあるから難しいって説明しようとしてたんだけど
数行(ステップ?)なら別にF8ポチポチしながら追えるんだよね
じゃあ足りないのは根気だろ、みたいに言われて循環複雑なんちゃらみたいなの調べてたけど
結局こんな数字だしても理解されないだろうしなぁってのと、単に俺が素人だからってのもあって今に至る

>>964
マジそれなんだけど、何をしてるのか誰もわかんないから何を作ってもらえば良いのかも説明出来ないっていうねw
世間で言われてる炎上案件よりよっぽどかわいいレベルなのかも知れないけど
マジであと数ヶ月放置して会社潰れればいいんじゃねーかとも思ってる
0968958
垢版 |
2020/09/10(木) 12:20:28.24ID:Oh+8RCfx
>>966
おっと、同じ人かもしれんけどありがとなあ
0969デフォルトの名無しさん
垢版 |
2020/09/10(木) 12:36:48.47ID:l+lun8zf
>>961
わかんねーから高めに見積もってんだよ
0970デフォルトの名無しさん
垢版 |
2020/09/10(木) 13:19:24.92ID:4mlwjCSe
>>967
他人の作ったプロシージャを2千個3万行解析してドキュメントを作成しながらデバッグなら1千万はまあまあ妥当かと
設備投資でたった1千万が出せない会社は遠からず潰れると思うよ
ほかの資産や設備だって千万単位の修理はいつ発生してもおかしくないし
0971デフォルトの名無しさん
垢版 |
2020/09/10(木) 22:45:47.73ID:Oh+8RCfx
>>970
詳しい人にそう言ってもらえるとたすかる
とりあえず素人がやるもんじゃ無いって話は集めたので素直に金だせやって資料作ってるw
しかし1千万つめばできちゃうってのもすげーなあ
個人にとっては大金だけど、会社にとっては中堅社員一人分/年くらいの費用だもんな
0972デフォルトの名無しさん
垢版 |
2020/09/11(金) 11:34:11.36ID:LThuGd0x
解析・デバッグ・ドキュメント作成でひと声一千万?
じゃ、せっかく解析できたんだしそれをベースに新システム製作費は?
パッケージから大きく外れるものだったらオリジナル新規作成?千万? 都合?千万?

せっかく途中まで分析し始めたようだし「わたしに二千万ください、これやります」でいーじゃん
0974デフォルトの名無しさん
垢版 |
2020/09/13(日) 14:01:55.06ID:AJy8UwEC
>>972
やり方教えてくれww
まあ1千万超えは最低限な感じだね
今起きてる障害を直すだけだけどね
0975デフォルトの名無しさん
垢版 |
2020/09/13(日) 18:15:28.87ID:/EQXGeQJ
業務止まってるのにのん気だな
せめて地方と業務とアプリぐらい概略書けば誰かがどこかを紹介するかも知れんぞ
アプリはAccessと踏んだが、どう?
どうせこのご時世、近場でなくともZoomやらでリモートしたりでのサポートだろうし
0976デフォルトの名無しさん
垢版 |
2020/09/16(水) 23:50:50.45ID:249cxrEP
結局余所に投げる方向で解決した
乗り越えられるものとそうじゃないものを見極めるのも大切と思い込むことにした
なお費用は想定の2倍近くになる模様w
みんなアドバイスありがとう
0977デフォルトの名無しさん
垢版 |
2020/12/20(日) 00:10:44.84ID:14Mj/Q6q
>>963
> ループの中にgotoが入ってるやつ見たときはちょっと感動した

Continue 文が無いメジャーな言語があってな。
GoTo Continue1
とか、書くときの隔靴掻痒感と言ったらもう・・・。
0980デフォルトの名無しさん
垢版 |
2021/05/14(金) 13:33:45.79ID:Kf/7Ycdt
WordのVBAで質問させてください。
文書内の2種類の括弧「」『』の中にある改行だけを削除するマクロを作りたいと思っています。

例えば以下のような文章に対してマクロをかけたときに
「み

ん」





「り




以下のような結果になるマクロです。
「みかん」





「りんご」

つづきます
0981デフォルトの名無しさん
垢版 |
2021/05/14(金) 13:34:48.74ID:Kf/7Ycdt
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
0982デフォルトの名無しさん
垢版 |
2021/05/14(金) 13:35:33.64ID:Kf/7Ycdt
自分なりに以上のようなマクロを組んでみたのですが、実行してみると、
最初の「みかん」の改行は削除されるのですが、そのあとの「りんご」の改行が削除されません
やり方をお教えいただけると助かります。
0985デフォルトの名無しさん
垢版 |
2021/05/14(金) 20:22:39.22ID:pWuJPMFY
RegExpオブジェクトを使えば。
面倒だから俺はどうしてもというとき以外は使わない。
0986デフォルトの名無しさん
垢版 |
2021/05/14(金) 20:24:37.07ID:6X3W89ka
Wordなら最初から正規表現もどきが使えるから、Excel VBAよりはちょっとだけ楽に文字列操作ができる
0987デフォルトの名無しさん
垢版 |
2021/05/15(土) 04:20:48.68ID:rI+eK0KL
>>982
正規表現でマルチラインを設定して改行を空文字に置換
RegExpオブジェクトの使い方は、他の言語より面倒な書き方だったりするけど文字を操作するなら必須だと思うよ
0988デフォルトの名無しさん
垢版 |
2021/06/10(木) 19:25:30.25ID:CLREf/YK
splitでいい感じに分割して判定してreplaceで改行無くしてくっ付けろ
「」は自分でつけたせ
0989デフォルトの名無しさん
垢版 |
2021/08/25(水) 17:06:39.36ID:qYcBJ8fd
あんま実験してないから文句いうなよ
まずはさ、アホでも考えられるような地道な形でやるべきだと思うわ
そのあとに、効率性とか考えて無駄排除したりすればいいわ

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
0990デフォルトの名無しさん
垢版 |
2021/08/25(水) 17:06:59.82ID:qYcBJ8fd
>>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
0992デフォルトの名無しさん
垢版 |
2021/08/25(水) 17:18:37.37ID:qYcBJ8fd
あれだ、最期の方に「だけが単独であると無限ループだわな
ループの条件にその辺の修正いれておいてくれ

もう寝る
0993デフォルトの名無しさん
垢版 |
2021/08/25(水) 17:34:31.79ID:qYcBJ8fd
おっきした
>>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小倉優子 ◆YUKOH0W58Q
垢版 |
2021/09/01(水) 00:17:27.14ID:7BIbcRgh
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 2294日 13時間 24分 43秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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