Excel VBA 質問スレ Part59
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part58 https://mevius.5ch.net/test/read.cgi/tech/1542577644/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 四角の領域を表す構造体にRECTというのがありますが、領域が10個あってしかも定数です その中にあるポイントがあるかどうかを判断するのに、 PtInRectを使いますが、10個のRECT領域をどうやって 定義するのか考えています Dim rect1 as RECT, rect2 as RECT ,,,,, rect10 as RECT とやって、これらに定数を代入するときにいちいち rect1.Top = 10 rect1.Left =10 --- rect10.Bottom = 1000 rect10.Right = 1970 とかやってたら大変です。 Cとかなら rect1 = CRect( 10,10,100,100) って出来ますが、VBAでは出来ませんか。 またやりたいのは、PtInRectなので、簡単に if PtInRect( CRect( 10,10,100,100), x,y) <> 0 then みたいにしたいのですが、どうしたら一番スマートに出来るでしょう? >>323 ごめん勘違い GetCursorPos() >>323 またまた勘違い 座標の指定はむりじゃね それぞれの四角形の位置関係に規則性はないんでしょ Topとか名前を付けないで配列の要素番号に対応づけるとか >>322 それです!ドストライクです!! エスパーさん手間を掛けて本当にすみませんでした。 二日考えてダメだったんですけど一回何か表示させる必要があったんですね。 あと次回は自力で出来るように頑張ります〜!! ありがとうございました! カンマ区切りのCSVファイルを2次元配列に入れたい。 Dim arr() arr=getCSVData(strFile) private Function getCSVData(byval ...)as string() Dim tarArr() //処理 getCSVData=tarArr end Function こんな感じで配列にして1次元が行、2次元が列に格納したいんですが ReDim、ReDim Preserveのタイミング等々が分かりません。 先に一度開いて行数と列数の最大を取得してからReDimでtarArrを2次元配列にし、もう一度開いて一行ずつ読み取ってカンマ区切りをsplitして配列に入れてからUBound分ループしてtarArrに入れる方法ですかね? >>329 多次元配列は最後の要素しか拡張できないから、左の要素はUbound(Split(1行目,”,”))で最初に確定させるしかない 右の要素はredim preserveで拡張できるから普通にループで増やしていけば良い >>323 クラスにしたらいいんじゃないの vbaで引数付きコンストラクタの実現は難しいけど、 四つの座標情報を引数に取るプロパティ関数を用意して、Rect構造体のプロパティを持たせるようにすればそれらしいことができるのでは >>331 VBAでもクラスって出来たんですね。 ちょっとググってみました ありがとう。 これは知らなかった >>323 構造体でできなくはない VBAの構造体、制限多いけどな Public Type Rect Top As Integer: Left As Integer: Bottom As Integer: Right As Integer End Type Public Function CRect(Top As Integer, Left As Integer, Bottom As Integer, Right As Integer) As Rect Dim r As Rect r.Top = Top: r.Left = Left: r.Bottom = Bottom: r.Right = Right CRect = r End Function Public Function PtInRect(Rect As Rect, x As Integer, y As Integer) As Boolean If Rect.Left < x And Rect.Right > x And Rect.Top < y And Rect.Bottom > y Then PtInRect = True End If End Function Public Sub test() Dim r(10) As Rect r(1) = CRect(10, 10, 100, 100) '... If PtInRect(r(1), 15, 180) Then MsgBox "In Rect1" End If If PtInRect(CRect(10, 10, 100, 100), 15, 80) Then MsgBox "In Rect2" End If End Sub 改行多すぎらしいので:で詰めて書いてる >>329 エクセルでCSV開いてシートをそのまま2次元配列に突っ込めば良いんじゃないか >>319 え? そうなの? それは知らなかった。 ちなみに最新はASP.netのcore2.1だと思うんだけど VisualStudioでASP.Net Coreプロジェクトを作る際、 .Net Coreと.Net Freamworkのどちらのプラットフォームを選択するか聞いてくるけどあれは何なの? >>335 ASP.NET Core 3.0以降ではFull .NETが切り捨てられることが公式に明言されてる 3.0はまだPreviewだけどね Dimってどこに書いてますか? 全部最初に書きますか? For i= 0 to 100 for j = 0 to 100 iとjを使った処理 next next この時、Dim j as Integer ってどこに書きますか? 「For i= 0 to 100」の上か下かという質問です。 定義は一番最初にまとめて全て書くと管理しやすい 個人的にはそもそも書かないけどな〜 >>330 自分でも調べてたけど、「最後の要素しか増やせない」って同じこと書いてありました。これは 例えば、行数読んだ結果がLcnt=10だとして まず ReDim(Lcnt,0)で作り 配列(0 to 10,0)ができ Redim Preserve(Lcnt,Ubound(Split(1行目)) 区切った値が5なら 配列(0 to 10,0to5)が出来てしまい、いっぺんに右の要素数が変更されるってことで合ってます? と言うことは、1行目が5列で次に読んだ2行目が3列なら右の要素数は3に減るって事ですかね? ifか何かで要素数は増える時だけRedim Preserveのが良いですかね? >>337 VBは上にまとめ C#は使う時 他の言語はしらん。あくまでイメージ。 スコープは短くが理想だから長くなって下部に変数が初登場ならFunctionとかCallで余分そうなものは排除。 だからそのループも逃がす >>339 あなたの用途に合ってるのは2次元配列じゃなくて配列の配列。 ReDim arr(0 To n) arr(i) = 別の配列 ` i : 0〜n みたいなことができる 「別の配列」のところに、csvの一行分を処理して配列を返す関数を当てはめればいい。 もちろんクラス化してもいいけどさ >>329-334 Ruby では普通に、2次元配列に入る require "csv" p CSV.read( "test.csv" ) 結果 [["id", "first name", "last name", "age"], ["1", "taro", "tanaka", "20"], ["2", "yumi", "adachi", "21"]] クラスって要素名を予め宣言しないといけないからcsvの要素が変わると対応できない? 教えてエロい人 要素名で名前解決する処理がないなら、レコード値を配列プロパティで受け渡すだけで良いと思う 名前解決が必要なら要素宣言しないといけないね 教えてください。 エクセルのマクロです PDFファイル(100ページくらいある)を、エクセルに、全ページをたて一列に貼り付けたいのですが、 どう書けばいいでしょうか RPAを買ってコピペを自動化するのが手っ取り早いよ なぜPDFを貼り付けるのか そのまま印刷すればええやん そのPDFは1つのファイルの中に100ページあるの? 1ページだけのPDFファイルが100個あるの? バラバラのPDFファイルを1つに結合したいだけならフリーウェアでできるよ >>347 印刷のためじゃなく、PDFをシートにはり、横にエクセルでコメント入れたい。 >>345 PDFを画像に分割→エクセルに貼り付け って流れになる PDFから直接どうこうは止めたほうが良い、PDFを触るのはかなりめんどくさい PDFを画像に分割するソフトがあると思うから、まずはそれを探して試してみて どういう形式で画像が出て来るかが分かれば、後はvba簡単に書けると思う >>349 そういやそっちの方が早いね >>345 「教えてください」で始まる質問をするのは馬鹿しかいない法則 分割するとは? 100ページのドキュメントだから100個のファイルを作成するということでしょうか。 分割しないで、ページを読み込み、貼り付けはできないのでしょうか? PDFを画像にするっていうのはプリンタで印刷するのと同じイメージだから基本1ページ1ファイルね >>356 できるけどめんどくさいんだって。 自分用ですら>>350 の手順踏む この件は誰もやらんって断定するから諦めたほうが良い どうしてもVBAとExcel上でやりたかったら 100ページのPDFを100枚の画像に変換するのはフリーウェアで一発でできる 画像をワークシートに並べるだけならVBAで簡単に書ける 上司の命令とかで他の選択肢がないなら、俺ならこうする >>345 >エクセルのマクロです なにがどうエクセルのマクロなのか全くわからなくて面白かった >>362 >>364 エクセルのマクロだけでいけるとおもったんやろ 実際出来なくはないと思うけどすげーしんどいって事にまで気が回らなかったことは仕方ない 「○○したいんですけど教えて下さい」 「なんでそんなことしたいの?バカなの?」 何でこんな回答いちいちすんだろ 答えてくてウズウズしてる自称プロが自分のわからない質問来てカリカリしちゃってるのか? なんでそんなめんどくさいことするの? 〇〇でよくね? とかよく見るけど、質問者が聞いてる事だけ教えればいいのにと思う。 >>366 大正解 vbaと実務の範囲を分かってない未熟者 >367 それを言うと 「〇〇はやりたくないんですw」 という回答が帰ってくるのがもう過去何度も QAに集中したいならteratailかstackoverflow.jpがオススメですよ 1ページ目が貼り付けられるけど、ページを指定できないのかな >>311 htmlに書かれているJavaScriptを実行したい時とか。 めんどくさいっていうか、AcrobatOLE使えないと無理じゃない? Excelだけで完結できる手法あるの? >>367 質問者が気付いてない、知らないだけの場合もあるから 上司から言われてるだけというケースもあるだろうな。 手順固定で指示する糞上司っているよね その手順がボトルネックになって糞の塊のようなツールが出来上がったりする >>373 ハンドアセンブルを覚える。 バイナリで書き出す。 >>376 組織はそれが普通。趣味で仕事やりますというわけには行かない 趣味で作り上げたとしても説明してレビュー受けないといけない。その労力って結構きついしいっそ言われたまま作り上げた方が精神的にラクね >>376 固定するのは百歩譲って良いんだけど説明も了解もなく決める人には困るね より良い方法を提案する機会がないままルールとして決まってしまう マニュアル化できるレベルの仕事しかできないって自虐だろ 1.質問に回答する。 2.質問者から、「その場合だと〜が上手くいきません。」と返事。 3.その場合は〜すれば良いと回答する。 4.質問者から「それだと〜」... 5.2-4を何度か繰り返す。 6.質問者に「そもそも君はその処理で何をやりたいんだ?」と聞く。 7.質問者の返事を聞いて、結局質問者の設計が糞だったと知る。 8.1-7をを何度となく経験してると、質問を見た時に設計の糞さ加減がかなりの確度で予想できるようになる。 9.質問者の聞いてることだけ回答すると糞設計のせいでドツボに嵌まるので聞いてることだけ回答するのは辞めようという結論になる。 10.質問者は自分の糞設計に気付かないので、質問にだけ回答すれば良いのにと思う。 こうやって質問者をひとくくりで決めつけちゃうような視野が狭い人が一番の癌なんだよな バカほどなんでも決めつけて単純化させようとする 勝手に単純化させた結論を赤の他人にいきなり押しつけるから当然理解されない 理解されないことを相手がバカだからと決めつけていきなり罵り出す 頭がおかしい人なのかな?と放置されると論破して黙らせたと思い込んで悦に浸り出す そしてプロ回答者としての自信を増して増長して居座る 大抵の事務仕事は本来単純なことをわざわざ難しくして仕事を作っているだけなのは事実だね VBAや最近だとRPAのような小手先の自動化ツールのは、本質的なプロセスの見直しに対するモチベーションを削いでいる面もある 営業はそれが売上に繋がってると信じてやまないので、 どうにもなんないのよ〜 >>384 お前が碌に回答したことが無い初心者なだけだろ。 いろんな所で回答してる奴らは皆同意する。 >>387 同意するわ 明らかに知識の乏しい初心者が妙に具体的に手段を特定して助けを求めてきた場合、 「そんなことはどうでもいいから目的を教えろ」と対応するのが最も確実で効果的で手っ取り早い >>383 >8.1-7をを何度となく経験してると、質問を見た時に設計の糞さ加減がかなりの確度で予想できるようになる。 この辺りになると回答でイライラする事が無くなるゾ プログラムって書き方って人それぞれ違うと思うけどみんな書き方どんな? EXCELのセルデータをComboBoxに格納 メイン文 caii addcbo(FilePath,1,Me.cbo1) caii addcbo(FilePath,5,Me.cbo2) caii addcbo(FilePath,8,Me.cbo3) Function addcbo(....) ※DAOでEXCEL開く 第2引数の列を下にループ 第3引数に空になるまで格納 End Function てな感じのコードってどうなの? 俺は先に2次元配列でシート丸ごと持ってきてから入れてく感じにしたんだけど、ここにいる人達はどう書く? caiiってcallの事か >>392 が綺麗と思うけど、大抵>>391 ぐらいで終わる >>391 おまえプロさんか? まだプロさん予備軍やったら気いつけや そこからプロさんに堕ちるんはあっちゅう間やで >>387 さすがプロ回答者の鏡 嫌なら別に回答者なんてやらなくてもいいんだよ? 質問者をひとくくりに見下すようなひねくれ者になってまでプロ回答者をやり続けてる目的ってなに? こんなとこで他人を見下してなきゃ自尊心保てないとかそんな感じ? >>384 こうやって回答者をひとくくりで決めつけちゃうような視野が狭い人が一番の癌なんだよな バカほどなんでも決めつけて単純化させようとする 勝手に単純化させた結論を赤の他人にいきなり押しつけるから当然理解されない 理解されないことを相手がバカだからと決めつけていきなり罵り出す 頭がおかしい人なのかな?と放置されると論破して黙らせたと思い込んで悦に浸り出す 質問に対する回答よりも糞みたいな煽り合いに熱中する奴ってなんなの 質問者は基本的に馬鹿 「インターネットは開くんですけどxxシステムが開きません」と言われてTraceやらブラウザ設定やらやった挙句、LANケーブルが挿さってないだけでインターネットはキャッシュでした、っていうようなオチが山ほどある 奴らの言葉を鵜呑みにしてはいけない ループから抜けるときにブレイクとかコンティニューないのこれ? >>400 exitがある Sub foo() For i = 1 To 1000 Debug.Print i If i > 100 Then Exit For End If Next End Sub >>399 ←こいつホンマもんのプロさんやんwww Traceてwwwwwwww 混沌とした質問ではなくてある程度整形された質問ならお互いに健全かもしれないね。 「例えば質問のためのテンプレ埋めてもらう」とかだけでもやり取りの回数減るんじゃないかな。 テンプレの内容はよくわからないけど、例えば「配列が解るか、オブジェクトが解るか、APIが解るか」とか書いてもらえれば質問者のレベルか解りやすいから罵ることもないだろうし 全体の流れの一部として困ってるのか、単純に言語仕様で困ってるのかだけでも質問者に必要なのがコンサルなのか解答なのか切り分けしやすいと思う。 【目的】 【何がわからないのか】 【どうなることを期待しているのか】 【何故それが必要だと考えたのか】 でいいよ 質問者のレベルなんてレスの内容見りゃわかるだろ >>405 >【目的】 >【何故それが必要だと考えたのか】 これは無くてもいいかも 多分あんまり良い情報は返ってこない気がする >【何がわからないのか】 これも無くて良いかもしれないけど、 まぁ一応質問スレなので 後は最初の状態が欲しい 初めと終わりがあれば何とでもなる それと反復頻度。一回だけなら一回だけ用の雑コードで済ますし、毎日ならもうちょい丁寧に書く ってわけで以下になっていると楽 【作業前の状態】 【終了時の状態】 【何がわからないのか】 【作業の頻度(一回だけ or 何度も)】 データ量も欲しいなあ 1万件なら雑コード、100万件なら処理速度も意識してコード書く 質問者が減れば珍回答で恥をかくリスクも減って回答者のプライドが保たれるので問題ない まぁプロ回答者どもが罵り合いやってますが、質問者の方はそんなの気にせず どんどん質問してくださいな w このスレの本質はプロ回答者選手権だからな プロ回答者の敵はプロ回答者 質問者など餌に過ぎない その餌を誰が一番上から踏み潰すかを競い合う ちなみにプロ回答者にもなると質問に答えたりしない >>413 なるほど! まさに>>413 さんのような方ですね なるほど プロ回答者ってのは「質問スレにおける回答活動」のプロって意味か まぁ別に目的の記述は無くてもいいけど 何を目的にしているかの記述があれば 代替案考えてくれる人もいるだろうし 欲しい解答が得られやすい場合もあるわな 逆に余計なこと言って欲しくないのなら 書かないのも有りだと思うけど 解答者がゲスパーして答えるのも また有りだと思うし >>400 ループから抜けるのは>>401 の人が言う通り Exitを使えばいいけど、次のループに行くような .Netで言うContinueはないので 分岐でループしているロジックの最後に持って行くしかないんじゃないかな? ここの質問を見ると、よほど変なもん作らされてるんだろうなって思う。 何に使うのかわからないようなのが多くて、 実務で使いそうなのがあまり出てこない。 実務では文字列解析とデータベースからの検索程度で難しくは無いんだけど 適当に組んだせいか妙に遅いのが悩み 高速化するテクニックとかないかな 二重Forループ ↓ VLOOKUP ↓ 高速VLOOKUP ↓ SQL これより速いのって、やっぱアセンブラ? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる