!extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ↑同じ内容を3行貼り付けること ExcelのVBAに関する質問スレ コード書き込みや作成依頼もOK 次スレは>>980 が立てること 無理なら細かく安価指定 ※前スレ Excel VBA 質問スレ Part76 http://2chb.net/r/tech/1651339421/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured 3行貼り付けても 2行になるんだな この呪文↓ !extend:checked:vvvvv:1000:512
効果があるのは1行だけど 次のスレ立ての人のためにやってるのだろうね
Excelの使い方すらわからない馬鹿な人と例のあいつはお断りです Ruby馬鹿の釣りに引っ掛かる人も馬鹿な人もお断り
1行目は本物の呪文 2行目は次回スレ立て時用の呪文 3行目は間違って消す馬鹿除けの保険
マクロで比較して、無い項目だけを追記するという事をしたいんです。 業務の日程と進捗を管理しているシートを作る際、毎回[元になる大日程表]を編集して自分の作っているシートに手動で転記しています。 これを自動化したいんですが可能でしょうか? 今思っているのは元データと自分のシートでは作り(テンプレ)が違うのでまず元データを自分のシートと同じ列体系にする(E列からG列は元データにはないステータス等の項目があるため) それを自分のデータのテンプレに貼り付け 貼り付けたテンプレシートと今のシートを比較して今のシートには無いデータだけを今のシートに追記する ということをしたいのですが可能でしょうか? またデータは機種ごとの納期順に並べているのですが対応は可能か、また機種を選んで(この機種だけを)比較して追記出来るのかも知りたいです。 機種ごとの区切りは空白をあけてB列に機種を書いて区切っています 区切りは難しいなら後で挿入すればいいかと思っています 1から5行目はハイパーリンク等があり実際にデータがある(始まるのは)のは6行目から800行目くらいです
細かい所はよくわからんが可能だと思う ただ丸投げじゃなくて 自分なりに考えて1回やってみて詰まった部分を質問しに来てくれ あとテンプレートとかはダミーデータ使ってスクショで見せてくれた方が分かりやすい
コード数が多くなってfunctionを乱立しまくって、日を跨ぐと半日くらい前書いたコードの確認作業に取られるんだけど何か言い手はないですか?
関数名で表された仕事だけ副作用なくこなし 関数内のコードレベルで何やってんのかまで 呼び出し側が気にしなくていい作りにする。
>>10 ・オブジェクトごとの操作/参照をクラスにまとめる ・テストを書いておく(Debug.Assert) でも確認作業に半日もかかるのはそもそものやり方自体がおかしいと思う >>10 わかりやすい名前を付ける コメントをしっかり書く プライドを捨てる >>13 私はコメントを書かない コメントは嘘をつく コメントとコードが合致していることを保証する方法がない そもそもコメントのメンテまで手がまわらない コメントはコメントに過ぎないんだよ。 コードと1対1で書くのも全然書かないのも極端だけど 仕様、要件、目的についての記載であれば嘘になりにくくメンテもしやすい。 コメントを鵜呑みにするのはだめだし、 「# x + y を sum に格納」みたいな意味ないのは論外。
コメント書くのは基本中の基本て新入社員時代のVBA研修で教わったけどなぁ。
俺も小学生の時に自転車乗るとき信号無視するなって教わったけど 無視しまくってますごめんなさい
ついこの間の参院選で、維新の会が横断歩道に車を止めて演説してたな。 許可とってやってるのかもしれないけど、危ないからやめてほしい。 ※多分許可とっていないでしょう、維新だから。 ※そういうところちゃんとしてるのは自民党だけです。
>>14 コメントはコードの内容書くんじゃなくて、なぜそうなのか、なぜそうしたのかを書いた方が役立つよ なぜならなぜそうなのかってのは 書く人によってそれぞれクセが出やすいからコメントあると嬉しい
>>10 先にfunctoinとコメントだけ書いておく 実際のコードはコメントに合わせてのんびり書けば良い 私の質問にいくつかの答えを提示していただきありがとうございます。一応目的を記したコメントは書いてます。 >>12 さんの提示されている ・オブジェクトごとの操作/参照をクラスにまとめる ・テストを書いておく(Debug.Assert) の意味が全くわからないのですが、どなたか分かる方はいらっしゃいませんか?クラスオブジェクトやデバッグの仕方くらいはわかります。 >>10 1日やっても完結しない巨大なジュールやプロジェクトの場合は 初めに全体の設計をやって仕様書つくるもんじゃね 必要なところはモジュールを分けてます ただコードを書く際にどことどこに影響あるのかとかを把握するのにいちいち時間がかかる感じです。 設計の段階でミスがある感じですかね?
>>30 ミスというよりも、不慣れって感じ functionの引数が妙に多くなったりすると、大体設計が変な事が多い 一旦散歩でもしてから見直すと吉 >>26 ごく当たり前のことを書いたつもりなんだけど… > ・オブジェクトごとの操作/参照をクラスにまとめる 例えば、シート内の情報を照会して加工するマクロを考えた場合に、 加工対象の情報をモデル化したクラスやシートAを独立した状態で操作/参照するクラスを作れているか (シート内のRangeやCellをそのまま操作したりしてないか) みたいな話 > ・テストを書いておく(Debug.Assert) いわゆるTDDです。thom先生の記事見た方が早い https://thom.hateblo.jp/entry/2019/08/11/120027 多少不完全でもこの2つがそこそこちゃんと出来てたら たとえ数ヶ月離れてたとしても全体像把握するのに時間はかからないはず > クラスやシートA シートAってなんだ…「シート」です
>>33 概ね同意だけど その辺キチンと考えて作れていたらVBA卒業だよ クラスに限らずメソッド、関数なんかも それが持つ役割毎に分けて作って それなりの場所に格納しておけばあまり迷子に なることもないよね。 ただ、VBAはモジュール毎にフォルダ作って 階層分けられないのがちょっとね。 それと1モジュール1クラスって制限が無ければ かなり良い感じで作れるのに残念。 モジュール毎にexcelファイルを分けるとすっきり
皆さんありがとうございます。 不勉強な所でのつまづきのようですのでまた1から見直してみます。 >>33 わざわざ教えてくれてありがとうございます。参加にさせて貰います。 初心者で意味不明な質問で申し訳ありませんが 在庫管理で 返却日が入った品物は行ごと削除して 別シートに貼り付けて整理したいのですが、 Do LoopにIf Thenつけて Cut Pasteを組み合わせれば できそうですか?
>>38 できるね でも返却日でソートしたほうがはやくね >>39 ごめんなさい 自分の知識だとソート云々のやり方が 分からないです ちょっと検索して勉強してみます >>41 失礼しました Excelのソートはわかります VBでソートして別シートに移せるのかと思いました ワンクリックで 別シートに移すが1番重要視したいことなので >>42 Excelの機能のほとんどはVBAでも使える 別シートに移してから、Excelのソート機能をVBAから呼び出すんよ >>42 マクロの記録有効にした状態でExcelの操作をして、 記録したマクロをエディタで覗いてみれば良い >>42 行操作はコストがかかる作業につながるから可能であればこういう方法でもいいかもね 1.返却日が入力されている行だけフィルタで表示する 2.選択行をコピーする 3.コピーした選択行を別のシートに貼り付けする 4.選択行を削除する 5.フィルタを外す これを実行前にマクロの記録を実行しておくとサンプルとなるコードができるから あとはそれをいつでも使えるように加工すればいいかと マクロの記録で吐き出されるコードって ActiveCell とか ActiveRange 前提だったりするから 実際には使い物にならんと思うが
>>43-45 皆様ありがとうございます 昼過ぎまでモヤモヤしてたのですが 急にソートの活かし方が分かった途端目から鱗でした お陰様で不恰好でしょうが無事完成できました 本当にありがとうございます! 新しいシート用意してソート用に使いたく無ければ EXCELにADO接続してSQLで取得した Recordsetをシートに貼り付けるという手もあるよ。 少し大掛かりになってしまうかも知れないけど そういう仕組みのモジュールを一つ作っておけば 後々同じようなことが出てきた場合に 結構楽になる。
そもそもExcelの使い方すらろくにわからん頭で思い付いたことだからまともに相手をしても無駄
相手のレベルに合わせた回答ができないRuby厨と同じだな
>>50 ADO接続なんてネットでちょっと調べればすぐ出てくる。 SQLだってSELECT 〜FROM [シート名$] WHERE〜 程度の簡単なもの。 つまり初心者であってもちょっと調べればすぐに分かる範囲。 相手のレベルというよりお前さんのレベルが初心者以下なのでは? VBAが消えるはユーザーが勝手に言ってるだけだが ADOは、公式にOLEDB非推奨が出たけど、取り消されたりしたからな
>>54 知らなかった 軽く調べてみたら、2018年にOLE DBの非推奨が取り消しになったのね 初心者にありがちなやつ Select,Selection Active◯◯ Copy,Paste 他は?
質問 本日になって急にExcelの描写がおかしくなった。 原因は、描写抑制のVBAがおかしいことを突き止めた。 どうやらFalseだけ実行され、Trueだけが強になって急に作動してなく抑止された状態が続く 同じような経験された人、解決方法しりませんか? Application.ScreenUpdating = False Application.ScreenUpdating = True
>>60 365だよね? 俺も画面が更新されず止まったままになってて挙動がおかしい でも実際は動いてるので、保存して開き直し 自分はそれでなんとか凌いだ >>61 そう、365です。 描画は止まってても実際は動いてるのも全く一緒ですね。 一度保存して開きなおすと治る?試してみます >>59 思い付くのは、Next iとかをNextだけで終わらせるヤツ。 特に若いヤツに多い。 >>61 保存したり閉じたり開いたり再起動したり更新したり色々試したけど直らず。 結局はApplication.ScreenUpdating関連を全て削除して一時的に回避することにした。 どうやらマイクロソフト自体が障害発生してるみたいだから描画バグの修正もしばらくかかりそう・・・ >>63 いや、Nextだけのほうがよくない? ループ変数を明示したい状況って ・多重ループになっていてどのNextかパッと見でわからない ・For(Each) とNextが遠い あたりが理由だろうけど、それってコードとしてあんまり綺麗な状態じゃないよね >>60 VBEのイミディエイトウインドウなりでApplication.ScreenUpdating = Trueを実行すれば良いだけでは >>66 自分もつけない派だけど他人に押し付けることはしない きれいかきれいじゃないかも人それぞれだから押し付けない 厳密な規約がないならマイルールで問題ないのでは >>67 Trueにしても更新されないままなんだよね MS障害で連携とれてないんか いや、Next iとかきちんと書いた方が第三者も読みやすいはずよ。 いわゆるマクロを教える側の人間はきちんと書いてる(若いトレーナーは書いていないのもいるが)
>>68 に同意 自分も付けない派だけど そもそもそんなデカいループ組むことは稀だし せいぜい2階層ネストするくらいだし それ以上ループをネストすることがあったら まず作りがおかしくないか、 別関数に切り出すかとかの方を先に考える。 ただ、だからといってNextの後に変数名が 付いていたからといって 「律儀な人だなぁ」と思うだけ。 別に付いてても付いてなくても 困らないからどっちでもいい。 むしろ繰返しの変数名に「I」とか「j」とか付けてる方が 「ああ、そんな時代もあったなぁ」と思ってしまうわ そこまでやるならコメントもシングルクォートじゃなくて 「Rem 」って書くべきだろうと。 自分は絶対イヤだけど。
>>66 C言語とかで for(int i=0; i<10; ++i){ hoge; fuga; }i; とかだったら卒倒して死ぬな Nextの後ろに変数書くかどうかで読みやすさが変わるようなプログラム組んでるなら そもそも他人に教えるようなレベルじゃないと思うわ あんなのは、まともにインデントすら組めなかった大昔のBASICの残骸だよ
>>75 それな Cに限らずJavaやC++やC#もみんなそんな書き方だし、自分はVB系のような書き方も明示的で良いとは思ってるけど、 その書き方でもあまり困らないから結局のところは慣れの範疇だよね。 i付けろとか、どうせ田中とかあの辺が言ってるだけだろ? なんでも鵜呑みにする奴ってなんなんだろうな
ついてようがついてまいがインデントさえ正しきゃ好きにしろで終わり
>>80 これな みんな、そんなにループのネストが多いの? functionに切り分けて配列を引数に持たせるのは無し? >>64 これちょいと前からなってたけどおま環かと思ってfalseにしないで回避してたわ Twitter見たら前からなってる人も居たみたいね CreateObject(“Internetexplorer.Application“)が突然エラーを吐くようになった 普通のIEはまだ起動できるのに 他の人どうですか?
それも365? 何かIEはもうやめてEDGEに移行してくれって 随分前からMSからお達しがあったからその関係じゃないかな? 素直にEDGEに移行すれば?
うへ、再起動したら治った 上の人ありがとうございます でも何でだろう MS公式アナウンスは2029までこの手法は使えるとのアナウンスだった 移行したいのは山々だがSelenium + Webdriverは面倒くさ過ぎ
こないだのオフ会楽しかったな >CreateObject(“Internetexplorer.Application“) IEってアウトプロセスだしCOMの開放忘れでリークしまくってて正常に起動できなくなってたに300ペリカ
Next iってVisualじゃないBASICでインデント付けずにフラットに書くことが多かった時代の名残でしょ
その環境だとNEXT IのIを省略した方が省メモリーじゃなかったっけ?
確かコマンドごとにコードが決まっててそれでメモリを削ってた気がする PRINTの命令コードは何番みたいに
>>99 あのー このレベルの懐古厨にマウントは無理だよ ? が勝手にPRINTになるやつね 行末;とか意外と難しいよね
>>103 合ってるよ ?はPRINTの省略でセミコロンはマルチステートメント マルチステートメントは改行(crlf)するより1バイト分お得 プログラムエリアが20kくらいしかなかったから可読性なんて贅沢の極みの状況だった マルチステートメントはセミコロンじゃなくてコロンな ちな今のVBAでも使える まあ、ソースを削れば早くなるなんてインタプリタ時代の遺物
>>106 あーすまん、フォローありがとう もうウロ覚えだわ~ >>103 のセミコロンはPRINTの改行抑止の話じゃねーの? >>110 a = 1; のどこに関数が? >>110 行末っていうか文末な >>111 >>103 はそういう意味かもしれんとも思ったが、それに対する>>105 は... PRINT AよりPRINT A;が早いからPRINTはセミコロンつけろっていうのは太古の昔にはあったなあ 如何にこのスレがじじいばかりか よく分かるレスだなぁ
・高度IT人材、富士通は最大年収3500万円へ ・AI人材の獲得に超本気 NECが新人事制度を9人に適用、富士通は最大年収3500万円へ ・【年収3500万円も】富士通、「ジョブ型」人事制度を導入 幹部社員から 高度IT人材 ・来年度から副業解禁 人材多様化へ―大同生命次期社長 ・第一生命HD、副業解禁 約1万5000人対象 ・第一生命HD、副業解禁 1万5000人対象―大手生保初 ・IHI、国内8000人の副業解禁 重厚長大企業も転機 ・IHI、社外兼業を解禁 社内副業もルール化
高田純次はすごいよな 昔話・自慢話・説教は嫌われるからしないってのを徹底してる 方やここの老害共は
2016使っててVBAが複数エクセル開いてると干渉して困ってたけど タスクバーのアイコンを右クリックして、alt押し続けながらエクセル起動すると 別プロセスで起動できることを最近知った
Windows 10 エクスプローラー [表示]-[列の追加]-[列の選択] 「詳細表示の設定」ダイアログが開いて 詳細 「コメント」をチェック。 エクスプローラーに「コメント」列が追加される。 フォルダに設定されたコメントをVBAで取得する方法があったら教えてください。
vba shell.application getdetailsof
エクスプローラーが突然アホになる健忘症を治す方法を教えてくれまいか
すまん.ワードVBA の質問すれどこにあるか知ってる人がいたら教えて.昔あったけど発見できない.かそってなくなったのかな.アクセスVBAとエクセルVBAしかないのかな.
>>123 ざっと見たところ、単純に文字列を検索して切り出してるだけだから、関数の使い方を工夫すればできそうに見える ここよりその作者に直接聞け エクスプローラーが突然ハゲになる症状を治す方法を教えてくれまいか
>>123 最近ウェブページ操作することが多くて参考にならないかと思ってちょいみてみた 情報取得だけならこういう方法も処理が軽いからありなのかと勉強になったわ 取得したHTMLからお目当ての文字列を切り出すのにGetText関数を重層的に用いるのな GetText自体は簡単なもので、切り出したい文字列の前と後ろにある文字列を指定することで その間に挟まれている文字列を取得するというもの 何度か繰り返しこの関数を使うことで、目的の文字列にたどり着く うまいこと前後の文字列を指定してあげないと切り出しが狂ってしまって目標にたどり着けないので、その辺はHTMLをじっくり見ながらやってみるしかない タグにクラス名とかIDとか細かく設定されてるから、その辺を前後の文字列にうまいこと含ませながらやるのかな 取得したい文字列が存在する複数ページに共通する部分を使っていかないとダメっていう難しさはありそう (なんでHTMLDocument使わないんだろう…)
>>123 XPathを知ってるなら、そっちを使えばいいんじゃないの? だいたいスクレイピングといえば、FindElementByCssとかFindElementByXPathをつかうもので、 なんでわざわざ別のやり方をやりたいのか意味がわからん。 VBAでシリアル通信を行う場合についての質問です。 CreateFileで指定のCOMポートを開き、WriteFileで指令を送信、ReadFileでデータを格納する流れだと思うのですが、 WriteFileで送る文字列の形式がマニュアルを見ても分かりません。 読み出しメッセージが「STX 10 R PV01 01 ETX BCC」の順だとしたらこれをStringで送ればよいのでしょうか? それとも対応するASCIIコードを並べて送るのでしょうか?
回答ありがとうございます。 WriteFileで1バイトずつコードを送っていき、終端のコードを送るとReadFileで返答を持ってこれるという認識でしょうか?
COMポート送受信なんて、普通はそれ用のコントロールつかうんじゃね MSCOMMとか今はもう動かのかな
>>135 Windows10 64bit でも一応動くみたいだけど一手間(ファイルを移動させたりレジストリを書換えたり)が必要みたい 詳しくは mscomm32.ocx windows10 とかでググって >>134 別に1バイトずつじゃなくても複数バイトを一気に送れるよ まあ送信速度に対してCPUの方がアホほど速いから性能上はどっちでも変わらんけど 念のための確認だけど STX が &H53 &H54 &H58 って思ってないよね 最近のPCはシリアルポートがついてない方が多いよね ハイパーターミナルってVISTA以降は入ってないし
回答ありがとうございます >>135 ,137 MSCOMMというものを使う方法もあるのですね 調べてみます >>138 ASCIIコードの対応でSTXが&H2、ETXが&H3ですよね 一気に送るというのは配列で渡すような形ですか? 基礎的な部分から分かっていないのできつい予感が つか通信する相手は何だよ? 相手側機器に、通信用のライブラリとかないのか?
>>141 相手はレコーダーと調節計で目的は現在値の読出しです 調節計のほうは専用のソフトがありますがレコーダーのほうはありません PCで両方に接続して2つから同じタイミングで現在値を読んでExcelに記録していくものを作ろうとしています 何でExcelで直接入出力する必要があるのか 馬鹿は発想からして馬鹿なんだよな
>>140 > MSCOMMというものを使う方法もあるのですね 可能ならmscomm32.ocx使った方が遥かに楽 Win32APIだとボーレートとかの指定はSetCommState()を呼ばないとダメだし あと送信はWriteFile()で書き込めばいいだけだけど受信は何らかの要因で読めない時にキャンセルできるようにしないと使い勝手悪いのでSetCommTimeouts()でタイムアウト設定して制御を戻す必要あるけどmscomm32.ocxだと受信でイベントが発生するからそういう処理が楽 > ASCIIコードの対応でSTXが&H2、ETXが&H3ですよね ああすまんそこは大丈夫なのね、失礼した > 一気に送るというのは配列で渡すような形ですか? そう Byte 型の配列を渡す > 基礎的な部分から分かっていないのできつい予感が 脅かすようで申し訳ないけど結構ハードル高いよ 特にReadFile()の方はバッファサイズを間違えるとExcel自体が落ちたりするし どうしても茨の道を進みたい/進まざるを得ないならまずはファイルに対してCreateFile/ReadFile/WriteFile/CloseHandleから練習した方がいいかも >>144 回答ありがとうございます 制限があるわけではないのでmscomm32.ocxを使う方向で行こうと思います 先が長そうな感じはかなりありますね・・・ まずはCreateFile、ReadFile、WriteFile、CloseHandleでファイルを操作するところからやってみます まずVBAでやるべきかどうか考えたほうが良いんじゃね 相手側がそれ用のコンポーネントでも用意してない限り、VBAでやるような案件じゃないぞ
>>123 です。 レスいただいた方々ありがとうございます。 スプレッドシートの ImportXML でXPathは理解しました。 HTML/CSSは書けますがそれ以外はさっぱりで…。 HTMLDocument、FindElementByCss、FindElementByXPathなど 調べていて出てきましたがどう書き出してどうエクセルに書き込むか 一から十までのものが見当たらず挫折しました。 >>129 さん!書き込み、非常に参考になりました。 <td></td> <td></td> <td></td> などは無理なようですが、どうにかclassなどが振ってあるサイトを探せました。 ありがとうございます。 >>123 if文で真偽値を二度判定するあたりなどは、もうさすがにやめてほしいわ。 >>147 Cells()だらけなのにExcelシートに値をセットしていないと思うのか? というか簡単に取れるけど kabu_kode = ThisWorkbook.Sheets("Sheet2").Cells(1, X).Value If kabu_kode <> "" Then driver.Get "https://finance.yahoo.co.jp/quote/" ; & kabu_kode Call Sleep(1000) '3秒待つ ThisWorkbook.Sheets("Sheet2").Cells(2, X).Value = driver.FindElementsByCss("h1._6uDhA-ZV").Item(1).Text '社名 ThisWorkbook.Sheets("Sheet2").Cells(3, X).Value = driver.FindElementsByCss("span._3rXWJKZF").Item(1).Text '株価 Set o_elem1 = driver.FindElementsByCss("dt") Set o_elem2 = driver.FindElementsByCss("dd") For Y = 1 To o_elem1.Count If X = 2 Then ThisWorkbook.Sheets("Sheet2").Cells(Y + 3, 1).Value = o_elem1.Item(Y).Text '凡例を書く ThisWorkbook.Sheets("Sheet2").Cells(Y + 3, X).Value = o_elem2.Item(Y).Text Next End If kodeが気持ち悪い そこはkodoかcodeだろ
ローマ字と英語が混ざってる時点で頭悪そうだなとは思う 匿名掲示板以外では口に出さないけど
盛り上がってるところ低レベルの割り込み恐縮ですが ランダムな値が格納されてる配列の頻度分布を調べたいです ワークシート関数使わないでできるだけ行数少なく書くならどうするべきでしょうか
>>155 VBAのシリアル通信で調べていた際にARDUINOという単語を見かけたことはありましたが同じようにシリアル通信ができるのですね 中身を見た限り基本的な部分は同じようにできそうなので参考にしてみます >>159 CSVで出力してPythonでmatplotlib使えば一発よ >>161 典型的なパソコンにちょっと詳しいだけの馬鹿 >>166 普通に Dim F(0 To 20) As Long Dim I As Long For I = LBound(A) To UBound(A) F(A(I)) = F(A(I)) + 1 Next ってやればいいだけじゃねーの? >>167 なるほど調べるのが整数限定ですからね 一般化して考えてたので思いつかなかったです ありがとうございました セルA1に 1:00:00 の ような時間データが入っています これを変数に格納したいのですが 上手く行きません 最終的に変数の左2文字 1: を 格納して他のセルに入っている 12:15:00 などの左2文字と比較 したいのです エクセルVBAは独学で詳しく わからないのですが、知見を お借りしたく質問させていた だきました よろしくおねがいします 24歳OL
VBAを知らないのではなくExcelのことをろくに知らないだけだな
>>169 VBA入門の最初の1ページからこのスレで説明しろと? コロンは除外したほうが比較しやすい Dim TimeA1 As Long Dim TimeB1 As Long TimeA1 = Left(Range("A1").Text,Instr(Range("A1").Text,":")-1) TimeB1 = Left(Range("B1").Text,Instr(Range("B1").Text,":")-1)
>>169 の質問は「1:」とコロンも取り出したいという話なんだからまずはそれを回答しないとだめじゃないか? そのうえで比較するのが違いがあるかなら1:00:00は「1」で12:15:00は「12」でもいいと思うから>>176 みたいな回答を補足したほうがいいと思うが なので回答としては Left(Range("A1").Text, 2) とでも答えてやればいいとおもうんだが 気持ち的にはめんどいからそれでいいんだけど、 まあ実際にちゃんとした相手に教えるとなればそれまでの経緯とその後の用途も聞いて、適したデータになるようにしないとだわね 文字列「1:」と数値「12」の比較なんてそのままでは出来ないから
>12:15:00 などの左2文字と比較したいのです って書いてあるのにかってに「12」を数値にしちゃいかんだろ なんかここで回答するやつたまに想像膨らませる奴いるけど仕事でもそんな感じなのかね 相手する人気の毒になる
>>169 本当に左2文字を取り出したいのなら 変数 = Left(Range("A1").Text, 2) だけど、もし時刻を比較したいんならこの方法はおすすめしない >>169 です たくさんレスいただき本当にありがとうございます 参考になるレスがたくさんで感謝しかありません 具体的な一例まで書いて頂けて助かります これからで教えて頂いた内容を参考に プログラムしてみます この度は本当にありがとうございました m(_ _)m@24歳OL @24歳OLってことは、 24歳OLは地点の名称ってことだったんだな
10進法で24ではなく16進法とか32進法で24だろ こんな釣りに引っ掛かって意気揚々と答える馬鹿ども
>>189 基数が変わると@の意味が変わるってこと言ってる? 社会人二年目が終わり、そろそろVBA・・・ってパターンの24歳OLもあり得るのでは?
遊びたい盛りの24歳がVBAになんか興味持つわけ無いだろ ましてやExcelすら興味ないんだから
年齢に食いついてるのは質問に回答すらできない人達でしょ
ネタに反応すんなよw セルの書式が標準だったら、本当に面倒くさいのがExcel。
お前ら何を言ってるんだ? RangeのTextプロパティなんて使える訳ないだろう 日付設定しているセルなんて幅狭められたら値が#になって終わりだ
なぜ質問してる条件が「1:00:00」といってるのに勝手に「#」と想像を膨らませて混乱させるバカがいるのかと思う 終わってるのは自分だろと 質問された条件だけで素直に答えろよ
>>201 バカはお前だ。 >>689 が「時間データ」と銘打っているのだからそこに入っているのは「文字列データ」ではない。シリアル値だ。 そのシリアル値が入ったセルの列幅を縮めてみろ。 まともに動かなくなるぞ。 valueでセル値を取得してFormatなりで文字列に変換した後で切り出しを行え言ってるんだ。 そんなことも理解出来ないこんな小さいロジックでバグるコードドヤ顔で晒してるような奴がよくこの業界で生き残ってこれたもんだ。呆れるわ。 あまりバカにかかわりたくないんだがTextでとると表示されている内容(「#DIV/0!」など)と同じものがとれるのはしってるわ ただそれは条件に含まれてないわけだから仮にそういう問題もあると思うなら お前から「#」になった場合も正しくとれる方法を回答してやれよ 粗さがしは得意で解決策を提示できない無能は自分の職場にもいるけど同じ匂いがするなお前
このクソ暑い日に本人そっちのけで戦う熱量に恐れ入るわ
>>204 既に回答済みだわ 集中力が無いのか 読解力が無いのか バカなのか 或いはその全てか そんなユーザーなら誰でも知っているような話をどや顔で言い争うのやめてくれませんか? 見てて恥ずかしいし建設的じゃない。
>>209 反面教師と思ってああならないように気を付けようぜ 相手の立場やレベルを考慮しないで言った通りのことしかできないやつは使えないって事なんだが 他人の話を額面通りにしか受け取れないのは、障がいだぜ 一度医者に行くことを薦めるわ
SeleniumBasic、WebDriverの質問いいですか?
>>206 なんでtextプロパティで取得する前提なのかがわからない。 うちの会社は、プログラミング禁止になったよ ちなみに代替手段はなし マクロでやってたこと全部手作業になった マジで物理作業量が跳ね上がってしまった
全体最適の観点では必ずしも間違った判断とは限らない 中途半端な小手先の最適化は業務自体を見直すモチベーションを奪うからな
>>225 へぇー経緯は? 作った後テストしてなかったとか IEEE754のせいで小数点計算がズレたとか? 馬鹿が内容も理解せずコピペで作ったマクロのせいで間違いが発生していた コピペ主体だからメンテ不可能だった そのくせ馬鹿は自分が他の人より偉いと思い込んでいた こんなところだろ
システム屋が作ったものではないと、そのひとしかわからないから、重要業務の担当者を外した巨大企業を知っている。 昔は我流でやるのが流行っていたから、プログラマでない人間が作ると、とんでもないものができているのが当たり前だった。
>>229 他人と共有するものは、それなりにきちんと書かないといけない(ドキュメンテーションも含めて)けれども、自分ひとりが便利に使う書き捨てマクロまで禁止にするなんて、どうかしていると思いますよ イノベーションイノベーションとうるさいくせに、そういうのを禁止するなんて矛盾していることに気がつかないのでしょうか? >>225 面白そう 口パクみたいな感じで、働いてるフリすりゃいいんだろ? 実際には裏でVBSでも動かしておいて 人間がやらなくてもいい業務をやり続けるのってすげぇ時間の無駄だと思うんだけど その業務から学ぶことなんて何も無いだろうし 目先の金を拾うだけの仕事は良くないと思う
属人化、なぜか暇そうにしてたからリストラ、腹いせにパスワードで業務が止まったと見た
公式な部署や担当を当てて書かせたんじゃなくて各々が自分用に書いてたんだろ コードが残らないようにしとかないと混乱するし業務効率が違いすぎて「不公平」だと騒ぐやつとかいたんじゃないの
過去にタダ乗りされて酷い目にあったから使ってても教えない
どうしたら上手く運用出来るかを考えずに一律禁止にしてしまうところがJapですね
個別最適を無視するトップダウンな判断ができるのはむしろ非Jap的だと思う Japはゲンバにクチダセナイからな
Excelユーザーは誰もがVBAを使いこなしてると思い込んでいたわ 初心者の頃
マニアじゃないから軍事用語なんか使われても強さがわからんわ ケロロ軍曹しか知らんし
Excelそのものも少数の人間だけが知っている運用ルールがあったりする。 わけのわからない表の解読に困ることもあるし、日本人はチームワークが得意だから、暗号のような記載ルールを勝手に決めていることもある。
表計算ソフトを誰がどんな使い方しようが関係ないし、なんとも思わない
セルを小さくしてドット絵のようにして図解を描いたことならある。
元帥(名誉職・総司令官)⇒ 名誉会長 大将 ⇒ 会長 中将 ⇒ 代表取締役社長 少将 ⇒ 専務 大佐 ⇒ 常務 中佐 ⇒ 平取締役 少佐 ⇒ 事業部長 大尉 ⇒ 副事業部長 中尉 ⇒ 本部長 少尉 ⇒ 副本部長 准尉 ⇒ 本部長代理 曹長 ⇒ 部長 軍曹(ケロロ)⇒ 副部長 伍長(ギロロ)⇒ 部長代理 兵長(ドロロ)⇒ 課長 上等兵 ⇒ 課長代理 一等兵 ⇒ 主任 二等兵(タママ)⇒ 平社員 副部長くらいかなw
>>248 ごめん、軍曹を舐め過ぎた 上等兵くらいでした >>248 尉官以上の士官とそれ以外は全く別の世界 本邦警察のキャリアノンキャリアは軍組織を元にしてる 民間での平から社長に登り詰めるみたいなのは不可能 元帥クラスって誰辺り? Office tanaka?
>>253 あの人以上はほぼいないだろうからそれでいいんじゃね 上等兵の俺はオブジェクト指向が解らんでつ かなり昔だが、会社の同期がその人の講習会に参加したときに、「私より高いテクニックを持った人はいたとしても、分かりやすく教えられるスキルを持った人はほとんどいないからね~、私はテクニック至上主義ではない、実用的なやり方を分かりやすく教えられるプロ!」 みたいな話をされていたそうだ。 他人に教えるのって1番難しいわね。
事実としてそうなんだろうけど自分で言うのはどうかと思う まあ講演会やるような人はこれぐらいの押しの強さが必要なんだろうけど
いっぺんでもやってみるとわかる、教えるのって難しい パソコンやExcelのことを周りからよく質問されるけど、いつも四苦八苦する
>>257 せっかく教えても肝心な質問した方が話聴いてなかったりするからな >>256 確かに。 まあアピールポイントに特徴ある人だと思う >>265 実務経験ゼロでも成り立つ 講演、物書き、教育は、実務経験ゼロの会社がたくさんある。 だから、実例がすぐに出ない。 スレにまったく関係ないけど思い出した 取引先からある事情でビジネスマナー講義の受講(講師はそこの女社員)を強制されたことがあって 最初ら違和感あった(俺の親が逝ったと告げても何の反応もなしとか)けど講義内容に矛盾があったので指摘すると猛烈な人格批判が始まって驚いた 他日ウチの社長がそいつの社長(中小同士で学生からの友人)に会いに行ったときにちょっと遅刻したことがあって 秘書気取りのその女が用事があるからと言いつつウチの社長を小一時間ほど待たせた 流石に何かおかしいと思ったウチの社長が事情を問うと「取引相手を待たせるのはトップ失格だそれを自覚させるためにやった」などと主張したそうだ つまり一種のコミュ障でコンプレックスある女が他人を見下ろすために知識の寄せ集めだけで副業に仕事をしていたって話 冒頭のある事情ってのも察してもらえれば
性格や考え方に問題あっても知識があるならいいんじゃね 実務経験があっても知識のない上司に相談して解決するならそうすればいいし そもそも自分に知識があれば全て解決できるわけなんだが
日本の企業は人材の性格も重要視するもんね。 能力あっても人間がクソなら採用見送ったり出世対象から外したり。
性格は欧米の方が重視されるぞ 文化的民族的背景が多様で自己主張も激しいから、クソ野郎は問答無用で切っていかないと無茶苦茶になる 日本はなんだかんだそこまで酷い人間は稀だからな
>>268 が不明瞭なので補足 寄せ集めの知識というのは複数著者のテキストを咀嚼せず文字通りコピペしてるって意味 例えばビジネスコミュニケーションでは科学的根拠に基づかなければいけないというパワポ資料の次ページでナントカ占いみたいな性格判断が出てきたりとか >>273 確かにそうだな ここはお前の力の魅せどころだぞ いや、言っている事は分かるから全然良いですよ ただ、要点だけまとめてくれたら読みやすいかなーと。 同志達たのんます。
VBAと関係ないおっさん達の自分語りはいつ頃終わりますか?
>>276 お前みたいに構うやつがいなくなるまで無理じゃね >>276 ほんと他で話せばいいのにと思うよな 質問来てもろくな回答もできないからこういう答えの不要なレスするしかないんだろ Excelできれば女子にモテるぞww とか言われたからExcel始めたけど ウソだったわ。 逆にキモがられるようになったら。
>>248 カプコンの1943思い出した ステージクリアで尉官が上がって最終的に特別中将だったかな よく考えたら社長クラスが一人で突撃w Excel出来るようになったのではなく他に問題があるのでは🤔
>>284 だまされたんだと思う、もうExcelやめた方がいいよ excel365でファイルを更新した形跡を全く残さない方法って何かありませんか? 弄る部分はマクロのコードのみです 業務を格段に楽にするマクロをいくつも組んでやったのに感謝も薄く図々しく給与にもビタイチ反映されなかったので このクソブラック企業を辞めるときに全部壊していきたいのですがバレるとアウトなので 変えないようにしたいのはファイル名の横に出る更新日時です
エクセルのVBAって2000から現在までの間に ここで大きく変更があって互換性に問題があるみたいなのありますか?
>>292 一応言っておくけどお前のやろうとしてることは犯罪だし、回答書くと犯罪幇助になるから >>293 2007 辺でグラフ周りが色々変わって過去のマクロでエラー出たことがある そこそこあると思うよ なので自分はバージョンごとにコードを振り分けたりした 実際に試したほうがいいんじゃないかな
>>293 64bit化、ワークシートの大きさ、ワークシート関数の増減など、バージョンごとにどんどん変わってる 何を問題とするかは人それぞれで、利用環境や目的にもよるので、ちょっと質問が曖昧すぎ >>292 こいつみたいなのがまさにこういうパターンだ 馬鹿が内容も理解せずコピペで作ったマクロのせいで間違いが発生していた コピペ主体だからメンテ不可能だった そのくせ馬鹿は自分が他の人より偉いと思い込んでいた 犯罪の質問なんて無視しとけよ 構うお前も同じなんだぞ
嫌がらせして辞めたところで迷惑を被るのは同じ作業してるポジションの人か後任の人だろうからやめとけ 査定をしてる立場の人達は痛くも痒くもない
うちのブラックに来たら誰でも同じことしたくなると思うけど 犯罪なのは分かったからやめとくわ あと言っとくけどうちにはマクロ組めるような奴はいないし 体系的に学んだ上きれいなコードで書いてるからくだらんレッテルはいらない
>>292 マクロ作るのもあなたの業務だったのでは? 会社で仕事して給料もらえてたのにそれ以上のことなんかないよ > 犯罪なのは分かったからやめとくわ 犯罪じゃないと思ってたのかよ... まじでヤベー奴やんw
気持ちは分かるが犯罪はいけないな。 次回からはそういうことに備えて マクロにパスワード掛けて 時間が経ったら期限切れのメッセージでも ポップアップして処理を中断させる ようにでもしておけばいい。 もっとも、自分の作業効率化のために 頼まれてもいないのに勝手に作ったというなら 根こそぎ消しても問題ないとは思うけどな どうしてもしたいというなら 法テラスにでも相談しに行けばいい。
If Date > 退職日 Then Exit Sub End If あとは全部インデントなくすとかコロンで繋げるとかプロシージャ名を処理内容と紐づかないものにするとか 色々引き継ぎの嫌がらせは考えたことあるけど、やったら何訴えられるかわからんからやらない
てか保守出来る人居ないなら何もしなくてもそのうち会社は面倒事に巻き込まれるだろ フォーマットがちょっと変わったり、新しい特殊な項目が追加されて使いものにならなくなったりするし
放置すればいいものを くだらない話には食いつく奴ばかりだね
123 10 123 11 123 15 空白 空白 124 18 124 22 空白 125 20 空白 126 15 126 10 みたいな並びのコードがあって、 上下のコードが同じ場合、コードの隣の数字を10%で割り戻した数字を計算したものと、10の数字をそのままにしたものを2つ持っておいて、コードが変わるところまでそれぞれ計算したら、コード単位で10%で割り戻したものの合計値と、割り戻してないものの合計値の差分を 一行挿入して差額として123のいくらと転記 空白行は無視。 差額が出ない場合(基本的にはないけど)は行の挿入はしない、 というvbaって作るの可能? 差額を持たせることまではできたんだが、 挿入のところでこれ無理では?と思って止まってます。
>>308 挿入/削除はいろいろ面倒だから簡単にやるには別シート(もしくは別列)に転記しながら処理して最後に書き戻すのがわかりやすいと思う スマホから入力してるから細かいミスはあると思うがこんな感じ Dim S1 As WorkSheet: Set S1 = WorkSheets(1) Dim S2 As WorkSheet: Set S2 = WorkSheets(2) ' 空のシート Dim R1 As Long Dim R2 As Long: R2 = 1 Dim N0 As Long: N0 = 0 ' 元の値合計 Dim N1 As Long: N1 = 0 ' 割戻し合計 Dim C0 As String ' 処理中のコード C0 = S1.Cells(1, 1).Value For R1 = 1 To S1.Cells(S1.Rows.Count, 1).End(xlUp).Row Dim C1 As String ' 現在のコード C1 = S1.Cells(R1, 1).Value If C1 = "" Then Goto Continue If C0 <> C1 Then S2.Cells(R2, 1).Value = C0 S2.Cells(R2, 2).Value = "差額: " & CStr(N0 - N1) R2 = R2 + 1 C0 = C1: N0 = 0: N1 = 0 End If S2.Cells(R2, 1).Value = C1 Dim N2 As Long: N2 = S1.Cells(R1, 2).Value S2.Cells(R2, 2).Value = N2 R2 = R2 + 1 N0 = N0 + N2: N1 = N1 + 0.9 * N2 Continue: Next S2.Cells(R2, 1).Value = C0 S2.Cells(R2, 2).Value = "差額: " & CStr(N0 - N1) >>310 ありがとうー!! 後半のC1:N0あたりの動きが読み取るのがちょっと難しいですが、 別シートに単純に一度書き写していって最後に読み戻すってのは目から鱗です 確かにそっちの方が問題なくできるかもしれないです 試してみます! >>312 > 後半のC1:N0あたりの動きが読み取るのがちょっと難しいですが、 If C0 <> C1 Then で、コードが変わった事を検出して変わったら S2.Cells(R2, 1).Value = C0 S2.Cells(R2, 2).Value = "差額: " & CStr(N0 - N1) R2 = R2 + 1 で、差分を追加して C0 = C1: N0 = 0: N1 = 0 で、新しいコードを覚える共に合計値を初期化してる こんなことがわからない奴が金計算をVBAでするなんて
テキストファイルからキーワードが含まれてる行をセルに書き込みたいです キーワードが8個あります 行=Bを「商品」か「価格」を""に置換して 元のBと違ってたら書き込むようにしたんですが もっと簡素な方法ありませんか? Open A For Input As #1'Aはテキストファイルのフルパス Do Until EOF(1) Line Input #1, B '1行分だけ読み込み If B <> Replace(B, "商品", "") Then i = i + 1 Cells(i, 1) = B 'セルへ入力 Else If B <> Replace(B, "価格", "") Then i = i + 1 Cells(i, 1) = B 'セルへ入力 End If End If Loop Close
>>313 ありがとうございます、 勉強中なので質問なんですが、 C1:N0 =0:N1=0の中の:ってどういう意味なんでしょうか? >>315 > キーワードが8個あります これはどうなったの? 単に複数のキーワードが含まれてるかを見たいだけなら Line Input #1, B '1行分だけ読み込み Dim K As Variant For Each K In Split("商品,価格", ",") If B Like "*" & K & "*" Then Cells(i, 1).Value = B i = i + 1 Exit For End If Next >>315 どんなやり方でもいいと思うけどキーワードを含むかどうかを関数にするといいんじゃない Function CheckKeyword(ByVal pValue As String) As Boolean CheckKeyword = True If pValue <> Replace(pValue, "商品", "") Then Exit Function End If If pValue <> Replace(pValue, "価格", "") Then Exit Function End If 残りのキーワードも同様に判定 CheckKeyword = False End Function これを使えば i = i + 1 Cells(i, 1) = B 'セルへ入力 の部分は1つでいいよね >>318 VBA マルチステートメント でググってくれ >>318 改行みたいなもん。たとえば N0 = 0 N1 = 0 という複数行のコードを1行にまとめることができる N0 = 0: N1 = 0 だけど、やらない方がいいと言われている 変数宣言と同時に初期化する用途に限って俺は許容してるな それよりif文を1行で閉じる奴が凶悪 ネストするとEnd ifの数が合わなくなる
>>324 変数宣言と一緒に初期値設定する人はよく見かけるしアリだと思う。 同様に実は特殊な場合に限りIf文を一行で記載することもある。 本来構造化言語で使わない方が良いとされているGoto文も特殊な場合に限り使うこともある。 VBAは結構何でもありの言語だからその辺、仕事場のコーディングルールや 作ってる人のマイルールによって随分違いが出てくる。 一概にどんな方法をとることが最善とは言えないから人の書いたソース見てると面白い。 Ifの中身が1行だけの時に全体を1行で書くのはマルチステートメントとは違うくない? If a = 0 Then b =0 あくまでコロンでつなぐ場合のことでしょ
俺も本来はマルチステートメントは使わないけど、5chのレスは行数制限あるからマルチステートメントにしてるだけ そもそもこの手の話は好みもあってどっちが正しいとかはないからそろそろやめようよ
○○ならアリって言ってるってことはそれ以外はナシって受け取る人もいるだろ 提供されたコードをそのまま使うだけしかできないならそれだけの話だし 自分のルールに従って直せばいいだけの話で人のコードにケチ付ける必要なんてないだろ
>>328 > だけど、やらない方がいいと言われている みたいな意見があるから >>331 おっちゃんそれVBAじゃなくてVB.NETのドキュメントやで Van.Netなら変数宣言と同時に初期値設定出来るから 引き合いに出すのもお門違いだな
中のVBAのコードだけGitに上げることってできるの? めんどいコマンドとか外部サービス使わずに そもVBEからコミットとかプルリクとかやりたい
>>335 すまん、VB.Netの間違いだった しかし俺は禿げてはいない。頭頂点しかな!! >>336 まあコードをエクスポートしたものを載っけておくくらいかな。 Bisual Sutadioみたいにエデイタ上から設定するのは無理だと思った。 て言うかコードだけ取っておいてもexcelのVBAの場合はexcelそのものに影響されるところも多いから excelごと取っておいてソースを比較したいときだけ何かのツールでソースの比較を行った方がいいと思う。 >>336 今のVBAでGitは見たことないけど 昔VSSで管理するアドインがあったから、アドイン作ればできるんじゃね >>338 マクロ入ってるエクセルはどうか知らんが、今のエクセルってXMLをzipで固めただけのはずだから Zip解答してソース管理に突っ込む手もあるかもしれん つかお前の誤字はわざとかこのハゲ いきなし禿げたんよ。 去年の夏位まではふさふさだった
Dim Eight As Typhoon Set Eight As Typhoon Debug.Print Eight.HPa
質問です エクセルでvba書くとハゲるというのは本当ですか? それともハゲじゃないとまともなコードにならないということでしょうか?
>>345 Set Eight = New Typhoon >>346 ハゲる→外に出られなくなる→VBAしか無い人生に陥る 禿が気になるなら頭ツルッツルにするという構想は無いのかね?
Dim Hair As Object Set Hair = Nothing
>>346 こら!良い大人ならスキンヘッドと言いなさい! スキンヘッドが似合う顔ならスキンヘッドにしてるんですよ・・・
>>355 QZ は逮捕・拘留11日を食らったってよ スキンヘッドは メガネがポイントだと思う。 閑話休題。 次の話者に期待
皮頭よりはハゲと言われたほうが人権を尊重してるだろ
>>349 →VBAの質問スレに書きこむようになる
きみたちハーゲマンに質問なのですが VBAの配列でJavascriptのようにpushやpopを使いたいときってどうしてます? わざわざredim使って要素数を変えるのはそれが頻繁になるときは使いづらいなと思うし。
ツルピカかつ、不精ヒゲだから女さんなんて絶対に寄り付かない。
>>360 VBA で残念に思う所の一つやね サイズの上限が決められるならその上限で確保してサイズは別途管理 上限が決められない時はReDimでちまちま管理してる あとReDimでサイズを0にできないのも地味に辛い >>361 >>363 レスありがとう、ハーゲマンたち。 じゃあしかたないんですね。 でもVBAでもpush, pop, shift, unshiftが使える配列のようなものをVBAのクラスかなにかを使って再現することは可能だろうか? >>364 可能、だが○○の機能がないから作れないではなく 目的の動作をするように作るんじゃね 質問が本末転倒している >>364 他の言語でもスタックやキューは長さの決まった配列だよ そこへオブジェクトを出し入れするときに端のポインタを動かすだけ 長さが足りなくなったら長さ2倍の配列を新しく定義してそっちへオブジェクトを引っ越し、オブジェクトの数が長さの25%を下回るようになったら長さ半分の配列を作り直してそっちへ引っ越し >>366 それは実装による リストで実装してる奴もあるし VB(A)の配列でpopが必要になる場面ってあんまないなあ 不要になったらemptyぶちこむだけだし
時間データ >>364 他言語はよー知らんけどdictionaryじゃあかんの? >>371 ああスマン。なんかへんな一言張り付いた。 Dictionaryでいいと思う。 キーに連番、スタックポインタ代わりに変数一個用意してやって、使い終わったらremove で消して。
やり方は色々あるのにVBAが使いにくいとか言い出す初心者w
だがしかしVBAにDictionaryはないのだよ WSHはいつまでサポートされるかなぁ VBAより短い気がしてきた まあ俺ならどうしてもキューかスタックほしいなら、.NET Frameworkのやつ使うかな
ああ、なるほど。いつ使えなくなるとも知れないとなれば先々を考えて使わないほうがいいかもね。たしかに使い方も特殊だし。>dictionary まぁ、それなら捨てsheet作って貼り付けるかな。2次元までなら。 そのかわり処理速度は格段に落ちる可能性はあるけど、待ってりゃいいならそれもアリか。
それって findfirst/findnext 一発で済む問題なのでは?いちいちマクロで書くのもウザったいですよね‥‥
使いにくいとか面倒とか愚痴るくらいならEXCEL使うのやめればいいのに
>>371 Dictionaryはとおの昔から使っておったのじゃよ。 しかし使い続けているうちにふと頭をさわるとなんとハゲてしまったのじゃ。 それは困ると思ってDictionaryに変わるいい方法を探求しておるのじゃ。 DictionaryがイヤならCollection使えばいいと思うけど。 まぁ別に普通に配列でもいいんだけどさ。 多少凝った作りにしたって関数化しとけばいい訳だし。
>>384 流石に無知すぎるから少し黙った方がいいよ Collection に Exists メソッドがあれば...
>>385 そうだね よく分かりもしないで無知とか決めつける無知は すっこんでればいいよね あまりマウントの取り合いは止めようぜ 意見交換の場なんだから
ここにいると神になった気分になるな お前らの見苦しさに対してもなんだか優しくなれそう
>>382 ふざけてるつもりは毛頭ございませぬ。 でもこれからもハーゲマンの名に恥じぬようVBAを探求していきたいです。 >>396 コラ、われわれハゲ族は、 励まし合って生きていかねばならぬ。 ハゲ増し合うことはするな。 なんという体たらく もうハゲはこのスレ出入り禁止でいいな
2つの表があって、表Aと表Bとして 表の作りは二つとも同じで、 コードと数字を持ってます。 二つの表のコードが一致してる場合は コード A B 101 50 60 102 40 100 103 30 104 50 といった感じで片方にしか存在しない場合は片方だけの行を追加して行くってvbaを作りたいんですが、何かいい案はありますか? AとBの表で数字の比較をしたいです for nextでやろうとしてますがうまくいいやり方が見つからずです
まずVBAを忘れます SQLで FULL OUTER JOIN します (゚д゚)
>>405 テーブルのリレーションシップを設定したらいいんじゃないかな 例えば以下の様なデータがあるとします 開始~終了:消費量 1月1日 0時~1月1日16時:500 1月1日16時~1月2日10時:1000 1月2日10時~1月5日 0時:800 1月5日 0時~1月5日0時:300 1月5日0時~1月6日0時:2500 1月6日0時~1月7日12時:1200 このように時間の区切りがバラバラ(かつ日跨ぎや0分間もある)のデータに対して、1月1日、2日、3日にそれぞれ合計いくらかを出したいです なお、例えば20時~翌6時で1000の様な場合は4h:6h=400:600として計上したいです どう計算するか方針すら思い浮かばないのですが何かアイディアありましたら教えてください
vlookupでできない? 普通にforループでも難しいことなさそうだけど、どんなコード書いたの?
>>408 まず問題を分割しよう まず(step1)日別にレコードを分割し、(step2)それを日付でグループ化して合計を出すと考えればいい step2は典型的なグループ化と小計なんで楽勝として、step1はちょっと面倒だから更に分割しようか 例えば、入力として一行の内容を渡すと、日別分割されたレコードの配列を返す関数を作って、その結果を結合すればいいだろう >>405 深く考えなくていいなら ①2つの表(シート)をそれぞれ参照して作業用のシートAを作る コード シート 値 101 A 50 102 A 40 ・・・ 101 B 60 102 B 100 ②シートAをソートする ③シートAの内容を読み込んで質問にあるようなシートBを作る 日別分割関数について補足しておこう この関数を更に分割すれば、下記のようになるだろう (1) 開始日時と終了日時の間の日付を全て取得する (2) 終了日時と開始日時の差を時間単位で求め、結果をHとする (3) (1) で取得したそれぞれの日付(dとする)について、下記を実施する (3.1) 開始日時と終了日時の間において、日付dに属する時間が何時間あるかを計算し、結果をhとする (3.2) 消費量*h/Hを計算し、結果をxとする (3.3) 日付dと消費量xのペアを分割結果の1レコードとする ここまで分ければ簡単だろう。もしまだ難しければこのように適宜分割するとよい。
初歩的な質問なんだけど、上下一致してる場合だけ転記して行くという場合 1行目は例外として省く処理いれて cells(r-1,1)=cells(r,1)とかってやってくと、不一致のものが現れた時に一致してた行の最初の値が転記できなくなるんだけどどうしたらいい? 100 100 101 101 102 とかって並びの時に、100の一番上が転記されないとか 102とかも転記されない 上下比較の時の最適解の比較方法を知りたい
>>405 結構面倒、前提条件として「表A, 表Bのコードは各々ソートされてる」かつ「表A, 表Bのコードは各々の表内で重複してない」のであれば... Type T S As WorkSheet: L As Long: R As Long: C As Long: D As Long: F As Boolean End Type Dim TA As T, TB As T Set TA.S = WorkSheets("表A"): Set TB.S = WorkSheets("表B") TA.L = TA.S.Cells(TA.S.Rows.Count, 1).End(xlUp).Row: TB.L = TB.S.Cells(TB.S.Rows.Count, 1).End(xlUp).Row TA.R = 1: TB.R = 1 TA.F = False: TB.F = False Dim S As WorkSheet: Set S = WorkSheets("結果") Dim R As Long: R = 1 Do G TA: G TB If TA.F And TB.F And TA.C = TB.C Then S.Cells(R, "A").Value = TA.C: S.Cells(R, "B").Value = TA.D: S.Cells(R, "C").Value = TB.D: TA.F = False: TB.F = False ElseIf (TA.F And TB.F And TA.C < TB.C) Or (TA.F And Not TB.F) Then S.Cells(R, "A").Value = TA.C: S.Cells(R, "B").Value = TA.D: TA.F = False ElseIf (TA.F And TB.F And TB.C < TA.C) Or (Not TA.F And TB.F) Then S.Cells(R, "A").Value = TB.C: S.Cells(R, "C").Value = TB.D: TB.F = False Else Exit Do End If R= R + 1 Loop Private Sub G(T As T) If Not T.F And T.R <= T.L Then T.C = T.S.Cells(T.R, "A").Value: T.D = T.S.Cells(T.R, "B").Value: T.F = True: T.R = T.R + 1 End If End Sub >>416 ありがとぅざいます! そうなんです 考え出したらこれかなり面倒だなと思って、、 同じような発想かもしれないですが 外のループはA表のコード番号の縦列の値を固定して、 内側ループでB表を縦にコードが一致するまで検知して 一致した場合フラグを立てて、一致したコードの時は一致してるコードの隣に値を転記。 内側ループを抜けた時点でフラグが立っていない場合はBにしか存在しない値なので、A表の最終行以降に転記 って考え方でいけました! >>411 ,414 ありがとうございます、そのヒント元に自己解決できました 1. 対象となる期間を配列に格納 2. データを1つずつ0:00で分解、按分は都度[その日の時間/全体の時間]で実施 3. 配列内の一致する日付に割振り 4. 2-3ループ >>415 102は一致する相手がいないけど、転記される必要があるのかな? ぱっと思いつくのは ポインタをrとsの2つを用意してr=1, s=1から始める 1. Cells(s, 1) == Cells(r, 1) の間だけ s を進める。 2. Cells(s, 1) の値が変わったところで a) s - r > 1 なら Cells(r, 1) を転記しながら s に追いつくまで r を進める b) s - r == 1 なら転機せずに s に追いつくまで r を進める 3. 1からの手順を表の最後まで繰り返す >>420 相手がいない場合も転記です そのやり方試してみます 単純そうでむずかしい… >>415 そこからどういうデータを求めたいんだ? 単に重複データ削除するだけで良い気がするんだが >>422 上下一致してるものだけ足し込んでいくということをしたいです 一致してなくても一個だけのはそのまま転記したい 空白は無視で 単純なコードでいけるかなと思ったら難しくて、、 >>415 の入力例で言うと 100は上下で一致してるから転記する 101は上下で一致するからこれも転記する >>421 の説明だと102単独でも転記する 転記しない入力例ってどんなのよ? 423の足しこんでいくというのは?もう何もわからない
質問する側がおかしいと(どういう結果にしたいかが不明の場合)回答する気も失せるよね上下一致と言われたら A B C D ならBを基準にA=BかつB=Cって自分はするんだが違うんだろ?
>>423 最終的に欲しい形を書け エクセルの機能に重複データの除去ってあるのはしってるのか? 足しこむとか転記とか何がしたいか意味不明なんだよね 単純にいま記載されている列の値について 1.同じ値が続く場合は最初の一つだけ残す 2.ただし途中にある空白は無視する(1、空白、1は同じ値が続いてるとする) 3.最終的に残した値で詰める または 残した値は別の列なりシートなりに転記する みたいな事をやりたいのか質問見ただけではわからんのよね この場合なら検索する行とセットする行を用意すれば簡単にできる話なんだけどね 仕事もそうなんだけど説明が下手な人ってやっぱり仕事もできない人が多い
足し込むというのが加算という意味であれば必然的に数値ということになるけど、、、 上の行と同じ数値なら足し算する=2倍するってことか? それとも上と下の行が同じ数値なら現在行と上下の3行の和にするってことか? なんかいろんな解釈ができる要望なんよね。。。
まぁ重複したデータを足し込むのか削除するのかはさした問題ではない。 ディクショナリやコレクションに元にあった値をキーにして まずキーと同じ値をキーに該当する値として設定して、 同じキーが次回来たときに無視するか足し込むかすればいいだけの話だからな 最後にそれをシートに展開すればいいだけの話。 そうしとけば足し込もうが重複削除だろうが簡単に対応出来る。 SQLを知っているならSQLでやってもいい。 問題は同じ値が飛び石で来る可能性があるのかということ。 例えば101、101、102、101の順序で来ることがあるのか? この場合、要件としては「上下で一致しているものだけ足し込む」ということなので上の例で言えば202、102、101と設定されるのが正ということになる。 これは上記した方法でやるのはかえってまどろっこしい。 そうしたら上から舐めてコレクションに値を格納、前回の行と次の行の頭が同じなら無視するか足し込むかすればいいし、値が違うならそのままコレクションに追加すればいい。 最後にそれをシートに展開する。 このように同じ数値が飛び石で来るかで作りがガラッと変わってしまう。せめてそこだけでもハッキリさせてくれれば。
もう終わった話なんだと思うけど正直質問する人はこういうデータをいじりたいという事は伝えても 結果としてこういうものが欲しいっていう事を伝える人が少ないんだよね だからいろんな解釈ができるからその辺もちゃんと情報を伝えてほしいわ
Unique関数の引数って二次元配列じゃないとだめなの?
excel2019 win10 設定シートに各項目を入力させたらそれに応じて別シートに計算結果を入力させるVBAを書いてる途中なのですが、 VBAソースを書いてる途中に設定シートにこんな数値も持たせたい、 入力画面のレイアウトをあれこれ変えたいと行や列の挿入をしたくなってしまうのですが そうするとVBAソースの方がずれたままになってしまうのですが、シートに挿入をしたら それにともなって既にかけている部分だけでもソースコードのcellsやrangeの値が更新されてくれたりしないでしょうか?
>>445 参照先は自動更新されない セルに名前を付けてその名前で参照すればよい おまいらが毛がどうのこうので喜ぶがらマジで頭ツルッツルにしてきたぞ
>>449 そのコレクションの中身はどうやって保守するのかね? >>451 お、おうw しかし真夏にはツルッツルもなかなか良いわ涼しい win10 excel2019 Sub y() Dim st As Range Set st = Worksheets("参加者").Range("A1:BA80").Find(What:="氏名") If st is Nothing Then else Debug.Print st.Row end if End Sub これをすると"氏名"文字列に一致したセルがrangeオブジェクトで貰えますけど 本当に欲しいのは氏名のx個下のrangeオブジェクトなのです。 氏名のセルと参加者の開始セルの相対位置は固定的です。 氏名はいろいろな名前があるのでマッチングしづらいので氏名で位置を探って取り込んでいます。 rowやcolumnくらいしか使いませんけど、すっきり感としては本当に欲しいのは氏名の開始セルのrangeオブジェクトなのです。 返り値のrangeオブジェクトをずらすということはできますでしょうか?
Set st = Worksheets("参加者").Range("A1:BA80").Find(What:="氏名").offset(1,1) こんな感じで解決しました。 動いてるのはまぐれでしょうか?
>>453 何やってるかわからんままコピペして動かしてる感をヒシヒシと感じるので Rangeオブジェクト Findメソッド Offsetプロパティ について理解できるまで解説サイト読んでください あと、>>445 についても回答付いてるんだからなんかリアクションしてください >>455 何度か書き込もうとしたんですけど、書き込みエラーになってしまっていました。 なんだかレスアンカーが不正とか出てきてたのでわからなくなりました。 レスアンカーをつけちゃいけないみたいな制約? >>445 に回答いただいた方ありがとうございました。 これも書き込めないかもしれませんが。 RangeオブジェクトのOffsetメソッド?は結合セルがやっかいなのですね。 結合セルでない時のエラー処理を加えると結局コードが汚くなっていくジレンマでした。 オブジェクト型がなかなか理解できません。 dim wf as object set wf = worksheetfunction とやってもwf.でエクセル関数を使えるようになるわけではないみたいですし。 ありがとうございました。 Function wf() As WorksheetFunction Set wf() = WorksheetFunction End Function こっちで呼び出し短縮は出来ました。初めて使いましたfunction
名前付きセル範囲を使うためにnamesコレクションを理解しようとしてるのですが、 activeworkbook.namesをfor eachに入れると現在は1個しか出て来なくて 値が =#NAME? こんなのです。エクセルの方から名前の管理を開いてもこの名前は出てきませんし、何も出てきません。 何なのでしょうか?この値は? なにも設定されてない時の値かと思ってワークシートのあるセルに名前の設定をしみたのですが、 やはりこの値は残ったままでした。 RefersToでもvalueと同じく =#NAME?
わからないまま、vbaから非表示を表示させるコードをコピペして削除しておきました。 こんな名前作った覚えはないですが
そっか、うんうん、非表示を表示ね、良かったね はい次の方
Range型と配列の違いが後一歩わからないのですが、 Sheet1にA1=10,A2=20,A3=30,B1=40,B2=50,B3=60....みたいにしてar(2,2)と近い感じにしてます。 Sub Sample1() Dim ar(2, 2) As Variant ar(0, 0) = 10 ar(1, 0) = 20 ar(2, 0) = 30 ar(0, 1) = 40 ar(1, 1) = 50 ar(2, 1) = 60 ar(0, 2) = 70 ar(1, 2) = 80 ar(2, 2) = 90 Debug.Print TypeName(ar) Debug.Print TypeName(Worksheets("Sheet1").Range("A1:C3")) End Sub arはvariant型の配列でWorksheets("Sheet1").Range("A1:C3")はrange型のオブジェクトになるんですよね。 感覚的にはどちらも配列を渡している気分なのですが、セル範囲参照のrangeだからrange型オブジェクトになるってだけですか?
for each のinの後に配列をおいても、range型オブジェクトをおいても 同じように中身を取り出してくれるから混乱してしまったのかもしれません。
もし Dim ar(2, 2, 2) As Variant なら3次元の配列としか言いようがない
本人は切実なんだろうけどイマイチ何を理解しようとしているのかが汲み取れない。 とりあえず、シートは二次元配列みたいなものと思えばいいんじゃないかなぁ。 バリアント型の変数に範囲指定したrangeを代入したら配列が出来上がるんだから。。。 って、こういうの説明するのって余計に混乱させそうで怖いのよね。
Rangeオブジェクトと配列、全く異質のものなのに同じ代入インターフェースがつかえるのが不思議なのでしょう 女学生は貧困で給食費すら払えないのに上級国民は交通費で200万円貰えるのですから
>>464 配列には数字しか入っていませんが、 Rangeオブジェクトには数字以外に色や罫線やハイパーリンクなど色々な情報が入っています。というかワークシートのセルそのもの(オブジェクト)です。 >>464 オブジェクトにはデフォルトプロパティというのがあってな オブジェクトを参照してるつもりでも、実はそのデフォルトプロパティを参照してるんだよ Worksheets("Sheet1").Range("A1:C3")はRange型だが、 そのデフォルトプロパティは2次元配列なのだよ >>473 やってみて聞いてるの?自分でやるのが面倒臭いからとりあえず聞いてるだけ? いや、そもそも何でそんな事やりたいのか?? という質問自体がさ
よそのサイトなんだから作った奴にきけばいいのにと思う今日この頃
>>476 あれ総スカンだったんですか? 外部データの取り込みでcドライブのファイルを取り込んでいるのに そのエクセルのファイルを他の人にコピーして渡したら同じ場所にファイルを配置しているのにファイルが読み込めないって聞いただけなのに笑 あっちでも総スカンだしここでも総スカンなんだからもういいでしょ レベル低いよあんた
向こうの総合相談スレはこのスレと違って厳しい人ばかりだからな。
>>483 VBAのスレよりも質問スレは厳しい人ばかりなんですね 少しでも的外れな質問したら総スカンだからな。 初級者だろうが容赦ないのが向こう。
replace関数でワイルドカードを使用してるのですが、 うまく置換していくれないのでなぜですか? やりたいこと A1セルのKKK1111というデータを2222に変換したい replace("A1","*" & "K"& "*","2222" )
REPLACE(文字列, 開始位置, 文字数, 置換文字列)
ありがとうございました。 ユーザー定義型と連想配列を知って少し前進しました。 検索掛けてもなかなかでないので教えてください。 dim i for i.... 使い終わったらiを未定義に戻したいんですが、 宣言の反対?になるような未定義に戻す関数?ステートメント?はありませんか?
プロシージャ内で宣言した変数ならプロシージャを抜ければクリアされるしマクロ全体が終了すれば全てクリアされるからあまり気にしない。 privateやpublicで宣言したオブジェクトなら明示的にnothingをsetすることはあるけど、イマドキのPCでメモリ解放もあまり気にする必要はない気もする。 エラーで止まったときを考えると念の為しておくくらいかなぁ。
初心者なのでプロシージャ内で処理の順番を変えたくなる時があります。 使う直前に宣言したいのでプロシージャの初めに宣言は出来ればしたくありません。 コピペでソースコードを入れ替えて処理の順番を変えるとforが1回目とfor2回目が入れ替わってしまう事があります。 だから毎度forを使う前は、foreacheもそうですが、宣言が必要かをプロシージャ内を戻って探します。 forが終わるたびに未定義に出来ればいいなと思ったのは使い終わった変数名が後からかぶっても 使い終わった時点で未定義に戻しておけばエラーも不具合も出ないからです。 他の言語だとあるのであるかなと思ったのです。
会社のパソコンでvbsからエクセルvbaを起動させメール本文、添付ファイルを作成し添付、outlookでメール送信をしたいのですがOutlookが起動しません。 エクセルから手動でvbaを起動すると正常に動作するのですが、vbsから起動するとタスクバーのエクセルが点滅し停止します。 特にエラーを吐いている様子はありません。 何か思いあたる部分があればご教示ください
漏れの推測だけど、 >タスクバーのエクセルが点滅し これは、バックグランドで起動しているのでは? それで、エクセル内のマクロなどが起動しないとか?
>>498 定義済みが未定義になるわけじゃないけど ブロックスコープとかいうやつだな 残念ながら旧VBやVBAにはない。VB.NETにはあるけど VBAの一番狭いスコープはプロシジャ なので、プロシジャの先頭に宣言まとめとけって作法がある >501 vba自体は動作しております。 手動でvbaを起動するとエクセルが開き添付ファイルなどを作成し、Outlookで送信するのですが vbsでの起動だと添付ファイルまでは作成するのですが、Outlookが立ち上がらず、タスクバーのエクセルが点滅して動作が止まります。 ネットで調べても事例が出てこず、会社のパソコンなのでシステム管理者に制限をかけられているのか… 何か調べる方法がありましたら教えてください
printfデバッグでどこまで動いているか確かめましょう!
>>496 始めに宣言を書いている方が探しやすいと思うけど 要らなさそうなものはまとめてコメントして確認すればいいわけだし >>500 手動で実行できるなら、VBSで起動しているときのユーザとその権限があやしい つかエラー吐いてないんじゃなくて、ちゃんとエラー捕まえられてないだけだと思うが あとスクリプト系からのメール送信はいろいろセキュリティ周りでチェックされるかもしれん とくに会社で管理されてるようなPCなら、ちゃんと管理者に許可とってからやれよ メール送信用のc#のexeつくって呼び出させるようにしたことならある あとsendgridAPIよぶの 前者は他にも使い回したな。.NETcoreだった気がするからいつまで使えるやら
>>498 あるものもある、例えばPowerShellにはそのものズバリのRemove-Variableなんてものがあったりする >>503 >タスクバーのエクセルが点滅して動作が止まります バックグランドで起動しているだけじゃ、エクセルのマクロが実行されないのかも printf デバッグで、どこまで動いているか確かめるべき! エクセルのマクロの、Outlook の起動コードの前後で、何かを出力すれば? Outlook の起動前に、端末・ファイルへ出力する Outlook の起動コード Outlook の起動後に、端末・ファイルへ出力する >>505 なるほど。そういう方もおられるのですね。 EXCEL VBAのプロシージャはあんまり長くしない方がいいよみたいなサイト読んで影響受けてます。 コードの書き方って結構こだわりを持っている方がいるようで、自分はそれに影響を受けやすい方です。 自分もこだわりたい方なんだと思います。 EXCEL VBAを知って、宣言は直前が基本ですよみたいな記事読んで強く影響受けました。 だから使い終わるごとに未定義に出来れば毎度宣言しなおせるからすっきりするのになぁみたいな気持ちでした。 EXCEL VBAとしてはfor やfor eachに使うような変数は先頭宣言にしてやっていこうと思います。 ちゃんとfunction分けてたら直前でいいけど、 大抵クソデカ関数ひとつか、グローバル宣言祭りだろうからなあ
>>512 > EXCEL VBAとしてはfor やfor eachに使うような変数は先頭宣言にしてやっていこうと思います。 とりあえずそれで動くところまで持って行ってコードが固まったらこだわりのコードスタイルにリファクタリングすればいいかと >>512 >他の言語だとあるのであるかなと思ったのです。 他の言語って具体的に何? 答えられない?逃げる?それともまた言い訳? >>512 個人的に、VBAに限定した話で宣言は直前とかいう記事はあんまり信用できないと思ってる 最近の言語ならそれで良いんだけどね あまり複雑化しても辛くなるしな シンプルにシンプルによ
>>516 どういうこと? 最近の言語と違って ・ブロックスコープがない ・宣言と同時に代入できない 以上VBAの特徴2点を差し引いたとしても、 先頭宣言が直前宣言より優れている所なんかひとつもないと思うんだが 変数はImmutableにするのが最近の言語でしょ こうなるもうどこで宣言しようが関係ない
>>519 まあ>>520 に同意しつつ、一番の理由は、 VBAでの一般的なスタイルに反するからなんだが ブロックスコープがないのに直前で変数宣言するのは、 違うブロックで宣言された変数と宣言が被るリスクが上がるだけなんだが むしろ直前宣言が優れている点ってどこだよ? >>522 > 違うブロックで宣言された変数と宣言が被るリスクが上がるだけなんだが そんなものどこで宣言しても同じだろ > むしろ直前宣言が優れている点ってどこだよ? コードを追う時に見える範囲に宣言あれば型とかも分かるだろ >>522 ・別functionにしない ・設計が出来ない ・順番がコロコロ変わる こういう場合は直前の宣言がいいんだろうな インデックスとはいえ変数を使い回すのはNGなのです! VBAだとしても許されません!ロボコン0点
質問でもなく他人のコードの変数をどこに書こうがどうでもいいのに書き方に熱くなる人はバカなんだろうね まあそういう技術的な部分に関係ないところしか語れない程度が集まるスレなんだろうけどw
>>529 マジでアホなの? PowerShellって書いてあるだろw >>530 へー、shellコマンドと言語の違いがわからない人か 納得 >>531 PowerShellって結構リッチなプログラム言語ですけど? 頭大丈夫? >>524 そうね。ブロックスコープは確かに便利。 ただ、匙加減の問題にもなるけど ブロックスコープに慣れるとついつい 単一責任原則の考え方がおざなりになりがちで 密結合なものを作ってしまい易くなる。 なので、あくまで俺はだけど EXCELのVBAに関してはメソッドや関数の 頭に変数定義を行うようにしている。 それでコードが読み辛くなるようであれば その時点でリファクタリングの対象になるという考え。 ここの回答者は上級者なんだからVBAの事端から端まで知っていると思っていたんですけど?? なんでこんなに荒れているのですか?
VBAで単一責任て そもそも表計算ソフトで画面やDBモドキ作ってる時点でおかしいと思わないのか
だって回答者に回れるって事は知り尽くしてるって事なんでしょ? ちょっと詳しいだけじゃ回答できるはずないもんね?
>>534 なので、の前後の関係がよくわからん > EXCELのVBAに関してはメソッドや関数の頭に変数定義を行うようにしている。 それこそ余計蜜結合になるかと 誰が上級者と認定したん? ここのカキコに資格試験なんかあるかいな・・・ 回答が使えるかどうか、正しいかどうかが全てじゃ。
どこで宣言するか問題って、画面上部をスクロールせず固定出来るようになれば解決するんだろうな。 エクセルは出来るんだから、VBAの画面も出来るようにして欲しいものだ。
>>543 VBEは昔ながらのUIなので垂直スクロールバーの上部を下にドラッグすると同一オブジェクトコードの水平分割表示ができるけれど >>541 分かり辛かったかな? 平たく言うと変数が何に使っているか分かり辛くなるような長いコードをひとつの関数やメソッドに書くなということ。 そもそもひとつの関数やメソッドにはひとつの役割だけ持たせるべきで、そうした場合、変数が何に使ってるか分からないくらい長くなること自体あまりないし、 それで長くなるようであればそもそもの作りがおかしいのでリファクタリングの対象とする、ってことなんだけどね。 VB/VBA/ExcelもAccessもOfficeごと窓からポイッ
>>545 > 平たく言うと変数が何に使っているか分かり辛くなるような長いコードをひとつの関数やメソッドに書くなということ。 それ変数の宣言位置とは違う話だろ まあ先頭に変数宣言するメリットを説明できないならいいや、バイバイ >>547 なんで? どうせ同じ関数内で同じ名称の変数なんて作れないんだから 全部纏めて同じ位置にあった方が「この変数はこのシチュエーションのときにこう言った意味で使う」とか命名し易いじゃん。 使ってる変数名を再宣言しようとして「あ」となることもないし、 同じ変数をバカみたいに使い回して本当は値変えると不味かったのに変えちゃったりとかアホなことも減るよ。 ま、そもそもそんなこと気にするくらい長いコード書いちゃいけないんだけどね。 そちらのレベルに合わせて話してもそれだけのメリットはあるよ。
Wordがどうしようもなく使いにくいので、 Excel VBAで代わりのツールを作りたいと思います。 こんな考え方は邪道でしょうか?
WordVBAを何故つかわない? マウロ記録がないOutlookVBAやPowerpointVBAなら一瞬気持ちがわかるが
loopのカウンタを使用後に消さないと 順番入れ替えたらバグるとか気にする初心者にはvba向いてないと思う
ワードにできることはエクセルでほぼ出来るからワードの使いかた忘れてしもた しかし困ったことはない
>>548 > 全部纏めて同じ位置にあった方が「この変数はこのシチュエーションのときにこう言った意味で使う」とか命名し易いじゃん。 コボル臭が... w まあ使ってる近くにあれば宣言なども簡単に確認できるメリットより命名のメリットを重視する人もいるんだね > 使ってる変数名を再宣言しようとして「あ」となる んだから > 同じ変数をバカみたいに使い回して本当は値変えると不味かったのに変えちゃったりとかアホなことも減るよ。 なんてなるわけないと思うけど? Excel → Markdown → Word アウトライン変換のマクロを作れば大分マトモになる予感 Excelの列で見出しを識別する感じで
intersect( activecell.ListObject.HeaderRowRange,activecell.EntireColumn).Address テーブル上にアクティブセルがあり、そのセルの列ラベルのアドレスを調べたく こんなのを書いたのですが、もっと他にイケてる書き方はないでしょうか
activeCell.End(xlUp).Address は? 上に隣接する別のテーブルがないことが条件だけど
>>557 それだとテーブルが1行目開始でなくて テーブルの項目名の部分にアクティブセルがあった場合は テーブルから離れた位置にカーソルが行ってしまうな バイナリデータの書き込みについて質問です。 hello という文字列をいったんバイナリにしてファイル書き込みするような プログラムを書いているのですが、書き込みすると h e l l o というように変なゴミが入ってきます。 vbaではバイナリデータの書き込みは完全にはできないということなのでしょうか。 該当コード https://ideone.com/MDI6yW 書き込みすると変なゴミデータが見えなくなってしまいましたが、要するに 正確に半角英数字でhelloという文字が再現できないのです。
>>560 どういう内容なのかダンプして確認しないのかい? >>559 Option Explicit Sub main() Dim bs(4) As Byte bs(0) = Asc("h") bs(1) = Asc("e") bs(2) = Asc("l") bs(3) = Asc("l") bs(4) = Asc("o") Dim fn As Integer: fn = FreeFile Dim fpath As String: fpath = "C:\指定のパス\output.txt" Open fpath For Binary As #fn Len = 1 Dim i As Integer For i = LBound(bs) To UBound(bs) Put #fn, , bs(i) Next i Close #fn End Sub >>562 for each で受ける変数をvariant型にするとうまくいかんということですか? open の変数にLen=1(1バイトごと)っていれられるんですね。 >>563 Len = 1 にしても無駄 あと、EachはVariantしか使えない >>564 ところがバイナリダンプしてみると1文字あたり2バイトしか書き込まれてないんだよな その説明の通りだと3バイトずつ書き込まれるはずなのに >>564 今回はもう結果が出ているけれど、入出力を行ったら確認しないのか? 出力結果から意図するものとどう異なるかによって予測できる場合もあるだろ >>564 正直説明一々読むの大変なのでここで聞いてそのあたりをつけようと思ってます。 >ステートメントは極力使わず、関数にした方がいいと思う ちょっとここがよくわからないんですがどういうことですか。 >もう少し言うと、実現したい事を直接聞いた方がいい。 vbaの練習のためにとりあえずbase64エンコーディングを実装しようとしてました。 エンコーディングはできました。デコードでつまづいて格闘してましたが、デコードもとりあえずできました。 つぎは、bmpファイルを読み込んで1x1pixcelに縦横絞ったセルのシートに画像表示させるとか やろうと思ってます。 >>567 結局やりたいことはライフゲームとか、画像処理だろう vbaは、事務処理特化なんだ。本当にやめたほうがいい。 vbaでクリエイティブな事をやろうとすると、めちゃくちゃ遅い 入出力用のセルがすごく見やすいのはわかるんだけど、別言語でやったほうがいい 具体的に言うとC#かvb.netがいい。 jsならそのままアプリにも移行できる とりあえず入門したいんで、アルゴリズムわかるやつ実装してるだけなんであんま考えてない。 最終的には機械学習実装できりゃいいなと思ってるんで、bitmap表示実装できたら vbaでそこまでやるレベルになるかなと。
他人が何をやろうと勝手なんだから質問にこたえないなら放置すればいいと思うけど 説教野郎って減らないよね
>>567 >正直説明一々読むの大変なのでここで聞いてそのあたりをつけようと思ってます 死ね いや、普通に頭くるだろ? ダメダメな使い方してると
>>569 ライフゲームってなんなのかグーグルで検索したら 結果ページ上で勝手にライフゲームが始まってたわ さすがグーグル >>575 気づいたときにはライフがゲームオーバーになってるよ 本当だ ブラウザの背景でライフゲームが動いてるw 無駄な機能多すぎるだろGoogle
https://excel-ubara.com/excelvba5/EXCELVBA228.html エクセルの神髄さんのところにあるクイックソートの引数について質問です lngMinとlngMaxを必ず指定しないといけないようなのですが、 どんな数字を入れればいいのですか? vBase = argAry(Int((lngMin + lngMax) / 2)) こうなっていて、argAryインデックスの2倍を超える数値は入れられないようです。 インデックスとしての真ん中であるなら関数側でuboundとかlboundとかから計算すればいいように思いました。 バブルソートやインサートソートと違ってイマイチやってる事がわからないので、 lngMinとlngMaxの引数にいれるべき数値がわかる方おられましたら教えてください。 >>578 配列のうちでどこをソートするか指定できるようになってるんじゃないですかね >>578 ソートしたいレンジの最初と最後のインデックス クイックソートは最初にピボットを決めてそれより小さいものをピボットより前に、大きいものをピボットの後ろに移動して、ピボットの前の区間と後ろの区間をそれぞれクイックソートする方法を繰り返す ピボットの決め方は色々あるけど、その人は配列の真ん中のオブジェクトを選んでるだけ。ランダムに選ぶと平均的には最も良い結果が得られるけど、もうひと手間かかる ユーザーフォーム内のコマンドボタンではfunctionの呼び出しはできない仕様でしょうか? 似たようなコードのボタンがあり、特定ブックを取得するための同じコードを全部のボタンに書いています ごちゃごちゃしてしまっているのできれいにしたかったのですが、functionが呼び出せず変数が空でエラーになってしまいます
>>581 呼び出し出来るよ。そのエラーになったコードをここに書いてもらえれば原因がわかるかと。 >>579 やってみたら確かに!驚きです。 >>580 クイックソートって発明品みたいなものですよね。 人間が手動で並べ替えても慣れる程にクイックソートみたいなやり方が高速になっていくんですかね。 皆さんありがとうございました。 >>582 フォームが3階層くらいありますが 1.モジュールからフォームの呼び出し Sub commentForm() rowBtn = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row colBtn = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column 大分類.Show vbModeless End Sub すみません、1つ目フォーム呼び出しのモジュール内に以下のコードがあります Public ShIndex As String 2階層目で3つの大分類の選択 2.分類選択 Private Sub CommandButton1_Click() 'コマンドボタンのタイトル反映 ※エクセルのセルを反映させています。 中分類.CommandButton1.Caption = Worksheets("2-1").Range("C1").Text 中分類.CommandButton2.Caption = Worksheets("2-2").Range("C1").Text 中分類.CommandButton3.Caption = Worksheets("2-3").Range("C1").Text 中分類.CommandButton4.Caption = Worksheets("2-4").Range("C1").Text 中分類.CommandButton5.Caption = Worksheets("2-5").Range("C1").Text 中分類.Show vbModeless End Sub
3.さらに次の分類へ Private Sub CommandButton1_Click() ShIndex = "2-1" 'コマンドボタンのタイトル反映 ※エクセルのセルを反映させています。 中分類1.Caption = Worksheets(ShIndex).Range("C3").Value 中分類1.CommandButton1.Caption = Worksheets(ShIndex).Range("D3").Value 中分類1.CommandButton2.Caption = Worksheets(ShIndex).Range("D7").Value 中分類1.CommandButton3.Caption = Worksheets(ShIndex).Range("D11").Value 中分類1.CommandButton4.Caption = Worksheets(ShIndex).Range("D15").Value 中分類1.Show vbModeless End Sub
4,最終の選択ボタン コメントアウトの範囲内をfunction(wbSerch)として、値を返して変数を使用したいです Private Sub CommandButton1_Click() Dim wbRepName As String '########## ここから ########## Dim i As Long Dim wb As Workbook Dim wbFullPath As String For i = 1 To Workbooks.Count Set wb = Workbooks(i) If wb.FullName Like "*検索ワード*" Then ' * *に挟まれた文字を含むブックを検索する wbFullPath = wb.FullName Exit For End If Next Dim pos As Long pos = InStrRev(wbFullPath, "\") If (pos > 0) Then wbRepName = Right(wbFullPath, Len(wbFullPath) - pos) End If '########## ここまで ########## Dim rowRep As Long rowRep = Worksheets("シート名").Cells(rowButton, "Q").Value Dim num As Long num = 1 If Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 1, "H") = "" Then Workbooks(wbRepName).ActiveSheet.Range(Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 1, "H"), Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 2, "H")) = _ Worksheets(ShIndex).Range(Worksheets(ShIndex).Cells(3 + (num - 1) * 4, "E"), Worksheets(ShIndex).Cells(3 + (num - 1) * 4 + 1, "E")).Value End If Workbooks(wbRepName).ActiveSheet.Range(Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 4, "H"), Workbooks(wbRepName).ActiveSheet.Cells(rowRep + 7, "H")) = _ Worksheets(ShIndex).Range(Worksheets(ShIndex).Cells(3 + (num - 1) * 4, "F"), Worksheets(ShIndex).Cells(3 + (num - 1) * 4 + 3, "F")).Value End Sub
コードをアップする際に一部書き換えで変数が微妙に違うのは許してくださいw
>>589 大量のコード張るなら、どっかコード張るサイトあるからそこ使ってくれ >コメントアウトの範囲内をfunction(wbSerch)として、値を返して変数を使用したいです やれば良いとしか 自分でやって動かなかったっていうコード出せよ エラーが出たならエラー内容も Functionが呼び出されないんじゃなくて、呼び出したけど値を返してないか 返された値をちゃんと受け取ってないんじゃないかと予想したがな >>589 色々気になるところばかりですが、Functionだけについていうと Public Function プロシージャ名() As String '処理 プロシージャ名 = ファンクション内で作成した文字列 End Function という感じで作って、呼び出す側は下記で wbRepName = ファンクション名 >>592 ありがとうございます やっぱりそれでいいんですよね とりあえず動かないのは困るので、関数を呼び出すコードは削除してしまったのでまたやり直してみます 適当にネットで検索して継ぎはぎしているのですが、これはやめた方がいいみたいなところがあれば教えていただけると >>592 ありがとうございます やっぱりそれでいいんですよね とりあえず動かないのは困るので、関数を呼び出すコードは削除してしまったのでまたやり直してみます 適当にネットで検索して継ぎはぎしているのですが、これはやめた方がいいみたいなところがあれば教えていただけると 継ぎはぎっていちばんやってはダメな事でしょ 不具合でたら修正困難
>>594 お前みたいな奴がVBAを使うのはやめた方がいい このスレも含めてネットをなんでもかんでも鵜呑みにしないように。
むしろガンガンコードのコピーでも継ぎはぎだらけでも何でもやれ それで痛い目を見れば二度とやらなくなるだろう ただし、他の人に迷惑を掛けない範囲でな
どんなにひどいコードを書こうが仕事は結果がすべて 過程を見て部分点がもらえるのは高校まで
>>604 馬鹿はメンテナンスのことを考えない こういう馬鹿がいるからVBAが禁止の会社が出てくる VBA禁止はメンテがどうのこうのじゃなくて スキルが低い人間が酷い結果をもたらすコードを書いてしまうからじゃね 下手に書くと他人の労働の成果が一瞬にして無に帰すからね
そもそもエクセル側でVBA使ってごちゃごちゃやる職場がセンス無い エンジニアが管理画面を作ってVBAでやってた処理をそっちでやって、事務系の人は管理画面からcsvを落としてそれをまんま使うぐらいが良い
CSVって発想がだめだね プロは引用符も不要になるTSVを使う うんこ
いや事務員にはcsvがちょうどいいよ tsv開けませ~んとか言われるだけ もっと目線を合わせろ技術キモオタ
TSVはメモ帳で開いて全選択のコピペでシートに貼り付けできるんだよ 見事に馬鹿が露呈したな
いやいや そこは用途に合わせようよ PDFやEXCEL出力した場合が良い場合もあるよ
なんで事務員がエラーの対処法を知らないんだよ。。 毎日いじってるから一通りの対応はできるだろ?
ボタンの押し方で仕上がりが変わる。 優秀な事務員はボタンの押し方が素晴らしい。 日本の技術は世界一。
>>608 いいえ、コードは汚いしドキュメントを残さないので、便利であってもレガシーとなってしまうからですよ VBA のファイル・テキスト処理などは、Ruby に比べて、圧倒的に可読性が悪い。 作った瞬間から、修正できない産業廃棄物となるw だから、常に廃棄して新規開発しているw
VBAで複雑なものを作ろうという思考がおかしい 適当に組んで動きゃいい程度のスクリプトだろ
VBAに飽きたらVBSがいいよ VBAの枷から開放される
>>621 いいえ、レガシーとなることの問題は認めるけど、それは禁止になる理由とはならないわ 他人がどんなに良いコードを書いてあろうが、容赦無く切り捨ててイチから書き直すのがプログラマーだと聞いたからよ
そもそもなんだけど どんなPG言語使ったって綺麗に書く人は綺麗に書くし ぐちゃぐちゃにする人はぐちゃぐちゃにする
自分の書くコードと自分に影響する人が書くだけ気にすればいいのに 無関係の人が書くコードなんてきたなかろうがどうでもいいのにな
>>627 プログラマーはプログラムを書く人だし、設計すればエンジニアだし、営業や事務処理をすることもあるよ 会社員ならわかると思うが他人のコードは他人の給料、自分のコードは自分の給料になるってわかるよね? ならねぇよ。 コード書くだけで給料貰えるとかいつの時代だよ?
コピペばかりのヤツってある意味恥ずかしく無いのかや? 知識ありませーん! あるのはコピペのスキルだけです! と、言っているようなモノだぜ。
コピペを極めるとオブジェクト指向になるのかもしれんな
コードのコピーじゃなくアプリをコピーして販売したら違法だからな
でも現実はコピペ野良マクロ職人が各職場に溢れているんでしょ?
何もかもは覚えられんからそりゃみんな多少はコピペするでしょな。 問題はちゃんと意味わかって使いこなして、修正や変更の対処ができるかどうか。
アマチュアはコピペと卑下するけど プロは既存コードの利用と言って車輪の再発見で悦んでいる給料泥棒はクビにする って誰かが言ってた
>>643 そうやってすぐ他人と同一人物と決めつけるヤツの方が余程バカだと思うけどな。 あ、思い込み癖のある病気かゴメンゴメン。 アルゴリズムは脳内コピペで使ってる でないと例えばクイックソートなんて一生思いつかんし
参考という意味でならコピペすることはあるね。 訳も分からずただ貼り付けて使うのは論外だと思うけど。
gitやらスニペットやらの今時機能たちを使う試みはよく見ますが 皆さんはどうされていますか
回答の出なくていい話題ばかりでレスが増えてうんざりだな
>>650 そして一番の問題はそれなのにお前が来て文句を書きなぐることか VBAと他言語できる人にしつもん 今までVBAしか知らなくていま他言語勉強してます VBAだったらエクセルのシートに書いとけば良かったデータとか 一体どこに書いとけばいいのかしら プログラム内の配列とかじゃ電源切ったら消えちゃうでしょう やっぱデータベースソフトとか別にいるの? 言語はPythonとC 記録したいのは株価の過去データとかです
ちなみにSQLとかあるのは知ってますが 数千行程度のデータでもそんなの使わなくちゃいけないのでしょうか また別に勉強しなくちゃなんないし、面倒くさい もっと楽な方法ないもんかと(´・ω・`)
データベースの導入が敷居が高く億劫と思うのならば Pythonから慣れているexcelファイルを操作すればよい そしてプログラムを組んでいるうちにいろいろ面倒で非効率である感じ データベースの素晴らしさに気づいたときにデータベースを始めればよい 確かにpythonとデータベースを同時に学習するのは大変だよね
>>655 > もっと楽な方法ないもんかと(´・ω・`) はい、解散! >>654 VBAで作ったのをGoogleスプレッドシートに移行しつつある。 シートを複数人で同時参照できるとかメリットも多い。 csv,tsv,xml,データベースとか色々あるだろ そういうのが難しいと思うならやめとけ
>>654 Python のオブジェクトとしてデータがもう手元にあるなら pickle でそのままディスクに残せる。もしくは csv か json に出力するか データベースでもsqliteならサーバー立てる必要もない >>651 そう そしてお前らもここも終わり ~終了~ >>654 「とか」に何が含まれるかしらんけどその程度のデータならDBなんて使わなくても 今まで通りExcelブックでもいいし、テキストファイルでもなんでもいいのでは 今時の言語(ツール)ならそれぞれのデータにアクセスするライブラリもあるから 質問にある内容だけなら言語なんてなに使っても問題ない >>655 自分ができる中で楽な方法を探すならまだしもできないことだらけで楽な方法なんてないんじゃない お金があるなら外注で作ってもらえば楽かもね 世間にあるIT企業はそういうもんだし 皆々様がたありがとう とりあえず>>656 氏の方針でいく >>657 君はなにもわかっていない 他の商売は知らんがプログラマーの場合 「面倒くさい、なんか楽な方法ねえかな?」からスタートする Zed Shawがそう言っている >>664 お前なにを勘違いしてるのか知らんけどプログラマーは 「楽をするためには苦労をいとわない」 という生物だぞ 単に楽をしたいなら>>662 が言うように外注しろよw んなわけない。 そういうのは、安月給でヤリガイ搾取されてるような交渉力のないゴミムシ。
このスレを含めてインターネットを鵜呑みにしてはいけません!
>>655 vba、C#、python、web系色々と勉強してきたけど、 単純なデータの入出力だけならエクセルvbaがダントツで一番楽 超絶高機能なエクセルってものがあるのにわざわざ他言語を選ぶ理由がない なおスプレッドシート+jsでも良い プロのバックエンド・エンジニアなら、 YouTube で有名な雑食系エンジニア・KENTA の初心者向けRuby on Rails サロンが有名。 他には、RUNTEQ、東京フリーランスのデイトラなどもある バックエンドは、Linux, Docker, AWS, データベース(DB)などが必須。 データベース・スペシャリストの資格があれば、部長クラス RailsのO/R マッパーでは、DBの設計の仕方・組み方ばかり勉強する。 第3正規形、1対多・多対多とか、検索用インデックスの作り方など
>>670 釣り?それとも真正馬鹿? それもいつものキチガイRubyクズ? VBAももうすぐ無くなると言われてから延命してるな
>>669 ほんとうにそう思う データをシートに書けばいろいろ考える必要なくアクセスできるもんね IDEでそういうとこが簡単にできるシートを作って欲しいもんだ この人もRubyがいいと言っている。 VIDEO 完全に時代遅れ。 もうむちゃくちゃ。 自分を客観視できていない。 >>675 小規模なデータしか扱ったことのない馬鹿 ↑ なんか幼稚な煽りしてる奴いてるなあ そんなことしてて楽しいのか
このまえ2000万レコード扱った時はC#でSQLite使った
そろそろExcelもビッグデータを扱えるようにしないと時代に取り残される 最低2億レコードぐらいは一発で実用時間内で処理できないと
>>679 どうだった? 更新、遅くならんかった? >>678 内容を理解できない馬鹿は黙っていればいいのに >>680 アクセスでさえテーブル容量に2GBの制限bェあるらしいのbナ、エクセルにbサんなもの求めbトも仕方がないbフでは? 2GBでも、中小企業の在庫管理には十分だし。 エクセルの使い道がない人は、無理して使うものでもないと思います。 >>683 てか、VBAスレでその質問するからには、エクセルとの比較で聞いてるんだろうけど そもそもエクセルでこのボリュームのデータ扱えないから比較できない データベースファイルだけで4GB超えるから >>686 SQLiteで2000万レコードについて聞いてますよ。 以前試したときは、ファイルが10GB超えるあたりから性能が悪化したんだけど、今はどうなのかなと思って。 win10 office2019 VBAの相談なんですけど、test.xlsmというファイルで練習をしていて エラーが出てエクセルが落ちてしまいました。 そのあと、復旧したファイルでコードチェックをしてエラーが出ないようになりました。 しかし、test.xlsmファイルを開くと「セキュリティに問題がある」うんぬんという警告が そのファイルでだけ出るようになりました。 ささいな事ですが気になっています。 もしかして特定のコードを含んでいると出るのでしょうか? ループ処理が多いとか。
トラストセンターで有効にしておけば警告は出ないよ、って言うかこのスレにいる人ならほとんどこの設定にしてると思う あとは1番下の「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」がクリアされててtest.xlsmにコードを触るようなコードが入ってる場合ぐらいかな >>692 ありがとうございます。 もともとそのチェックはどのファイルにも入っていませんでしたので、 触るコードを書いてるという事かと思います。 どんなコードが該当するのですか? バグに気付けていない可能性もあるので、知りたいです。 オブジェクトモデルっていってもdictionaryを一回重複チェックで使ってるくらいで、 後はsetしてるのは条件付き書式とかworksheetとかworkbookとかrangeくらいでしょうか。 たいした事はしてないのですが、結構長くなってるので特定しづらいです。 >>693 > どんなコードが該当するのですか? そんなもん説明しきれんわ そもそも > しかし、test.xlsmファイルを開くと「セキュリティに問題がある」うんぬんという警告がそのファイルでだけ出るようになりました。 のスクショなりを上げなよ コードを新規作成したtest 2.xlsm にコピペしてみりゃ一発だろうに
>>679 Ruby on Rails では、2千社・2億レコードでも全く問題ないと、外人が言ってた Railsでは、開発環境ではSQLite も使うが、 本番環境では、MySQL, PostgreSQL Heroku では、PostgreSQL >>676 セレブエンジニアの小松和貴は、反SES/Java で有名。 Java土方はうつ病になるから、やるなと言ってる rubyみたいなオワコンを持ち上げるキチガイは消えろ
なんだかんだで、納品物はエクセルで!とか言ってるからいつまでもVBAやめられなくて辛い
>>702 Excelやめてなんのソフトを代替にしたいの? >>704 うちの会社の経理は紙の帳面だぞ 古代エジプト時代と変わらん >>706 パピルスと現代の紙とは異なる 髪はその頃と一緒だが >>702 そんなに辛いなら転職したらいいんじゃね >>695 ありがとうございました。 それで徐々にコードを消していったら判明しました。 助かりました。 ユーザー定義型を配列に入れて使っているのですが、nameでソートしたり、 idでソートしたり、ageでソートしたり、その都度いろいろなプロパティでソートをしたいのです。 いままでは一旦二次元配列に入れてソートしていましたが、二次元配列のkeyposにあたるような key elementsみたいに引数で渡す事はできないのでしょうか? Sub Sort(ByRef User as Usertype,ByRef Property asここがわかりません) なんというかworksheetオブジェクトとrangeオブジェクトみたいな関係みたいな 最悪プロパティ毎に違う名前のソート関数にすれば一応好きなプロパティの値でソートして返せるのですが こんな感じで
別の方法としてADODBでメモリ上にテーブルを持つのもある テーブルにぶち込んでしまえば、ソート、フィルター、その際の項目指定とかどうにでもなる その分のメモリは必要だし、テーブルに対する出し入れの処理はあるので 配列の大きさやソートの頻度で使うかどうか考える
>>713 そちらを見に行ってEnumの便利さに気付きました。 二次元配列のfor for ネストでやってるような処理、列が増えるほどだんだん わからなくなりますが、enum使えば二次元配列の利便性も残しつつ ユーザー定義型みたいに使えますね。 二次元配列の悪い所はだんだん自分が何を指定してるのかわからなくなるところだったので、 Enumと相性抜群ですね。 せっかく教えてもらった高度な手法は今回は見送りさせて頂いて、簡単なEnum&二次元配列でやってみようと思います。 感謝です。 元データがどこにあって、それをソートしてどうしたいのかわからんが 普通に考えればエクセルシートに展開すれば良いんじゃないかと思うんだが
たぶんEXCELのソート機能を使わず自分でソートしたいんじゃね
遅いとか記述が冗長とかサーバーサイドで動かせないとかテクニカルな問題はいくらでもあるけど、 最大の理由は競プロやるような人はVBAなんか使いたがらないから
>>718 年末のAdvent of CodeはVBAだかExcelだけかでやってる人たまにいる 素人にやらせると、見かけは安上がりだけど結果的に高く付くことが多い
じゃあここのスレの方ならプロだから安心して頼むそうかな?? 金額以外は
RubyはそれだけではDBとなるものを持ってないからEXCELやACCESSのVBAとは比較できない。 もっとも、同様にDBを持たない言語と比較するなら セーフティーでガベージコレクションの概念がなくスピードの速いRust辺りと比べるとゴミ同然
エクスプローラーでフォルダーのプロパティを開いて カスタマイズタブのところに「フォルダーの種類」が全般とかビデオとかになってるけど。 これをVBA/VBSで変更できる? フォルダーのtypeを見ても全部「ファイル フォルダー」になる。
>>727 レジストリ操作でやりたいことができたわ。 VBAん中でロック解除して 処理終了間際にロックし直しってんじゃだめなの?
SheetSelectionイベントとIntersect使うだけでは
>>730 worksheet_boforedoubleclick みたいなイベントプロシージャでできる ありがとうございました。 >>731 の方法で簡単にできました。 VBA実行時に保護を解除して、終了時に再度保護をかけることで、 すんなりといけました。 A1:10もしくはA100に入力された値を配列に格納しています。 動的配列です。 Select Case 文字列A case A1:A100のどれかに一致するなら case B1:B100のどれかに一致するなら みたいな書き方って出来ないのでしょうか?
>>736 恐らく出来ない。 ただ、Select Case の後の文字列の部分をTrueとして、 A10:A100の中に該当文字列が有った場合、 Trueを返す関数を作成して、Case文の後ろに記載して その条件に当たったかを判別して、Case文の下に その条件下での処理を記載することは可能。 Caseにある条件のA10:A100にとある文字列が 有った場合とB10:B100にとある文字列が 有った場合と下に続く処理が同じなら、 先程言った関数の引数に対象範囲と検索対象文字列を 持たせておけばCase文を使う必要すら無い。 戻り値がTrueかFalseかをIf文で判断すれば良い。 その辺は実際の状況に合わせて上手く作ってくれ。 select caseにtrue?? 知らなかったわ何それ??
Do With End With Loop よりも With Do Loop End With の方が計算が早い(PCにとっては楽)と考えてよいでしょうか
>>736 Private Function F(R As RangeRange, S As String) As Boolean Dim C As Range For Each C In R If C.Value = S Then F = True Exit Function End If Next F = False End Function ... Select Case True Case F(Range("A1:100"), 文字列A) ... Case F(Range("B1:100"), 文字列A) ... Case ... End Select >>740 たいていのプログラムだと有意な差はでないから気にせずに作りやすい方で作れ 有意な差がでそうならまず測定 >>740 これも恐らくの話で申し訳ないけど、 元々Withで設定されているインスタンスが既に生成されているものであれば、その格納アドレス先を読むだけなので Withがループの外にあっても中にあっても処理コストは変わらないと思う。 変わったとしても繰り返し実行での誤差と見分けが付かない程度と思われる。 逆にインスタンスが生成されておらず、With New 〜 のようにWithでインスタンスを生成する場合は ヒープエリアのメモリにそのインスタンスを展開するため、Withがループの外に有った方が処理コストは低くて済む。 ・・・はず。 >>739 ケツの穴をガバガバにして全通しするいやらしい関数だよ Select Case True Case オナラ よし通れ Case うんこ よし通れ End Select >>746 汚ねえな。。 こっちは夕食のカレー食ってんだぞ。。 >>747 If 文でラップとか意味わからんこと言われてもw ヘイヘイヘイ~! もしも~オブジェクト変数でぇ~宣言したぁ~値がぁ🎵 ラップ調
>>738-742 ありがとうございました。 変数Strの中の値が配列Listのどれかと一致するかということだったので、そのCountIFがまさにその通りでした。 それようの関数書いてSelect case True使わせていただきます。 >>752 Select Case True の話持ち出しといてなんだけど 最初のCase の条件に引っ掛かってその下の処理を実行した後でも 次のCaseの条件に引っかかったらその下の処理も実行するからそれだけは気をつけてね >>753 そんなことないのでは?と思って試したけどやっぱりそんなことなかったんだが 普通はcaseの条件の中に入ったら次のステップはEnd Selectにいかないか? Dim ncount As Long ncount = 0 Select Case True Case 0 = 0 ncount = ncount + 1 Case 1 = 1 ncount = ncount + 1 Case 2 = 2 ncount = ncount + 1 End Select Debug.Print ncount これは1になるんだが >>754 多分breakいれなきゃいけないCとかと勘違いしてるんだと思う Select みたいな文で複数の選択肢が条件満たした場合に複数の選択肢を実行する言語って PowerShell ぐらいしか知らんけど他にもあるんだろうか?
>>756 cとかそうだったはずだし、たぶん複数実行するほうが多数派なんじゃね c#も、文法上は複数実行することになってるけど、break書いて抜けないと怒られるという よくわからんことになってるし CもそうだしJavaもそうだしPythonもそうだしJavaScriptもそう
>>757-758 C/C++ はそもそも複数選択肢が条件満たすことはないよ(たいていの処理系でコンパイルエラーになる) fall through と勘違いしてるでしょ >>754 これってコンパイル時に畳み込みで定数化されて同一のラベルが複数あってエラーになるとかしないのか >>759 ああ、まさにfall throughだった つかそうなると、fall throughじゃなくて 複数一致したら複数ブロック実行するような言語って知らないな PowerShellってそうなのか? >>761 VBAのCaseは定数以外にいろいろ書けるから 他言語やってる人が暇潰しに見に来る場所って印象があるよね 質問も簡単だし答えるほうに余裕があるので他スレと比べると寛容というかギスギスしてない
Excelでデータベースを作り、各レコード?事に 〜月〜日 〜 〜月〜日 〜 みたいなログを表示したいのですがどの様にすればできるのか教えていただけませんか?
>>768 入門書買って自分で勉強したらどうかな あ、EXCELが入っているPCを持ってないと無理かも テキストボックスにセルの値を参照するとか、繰り返しの処理とかlookup関数とかindexとmatch関数はわかります あとはこのリストが欲しいです
>>771 漠然としすぎていて適切に回答できない 書式設定のこと?ファイル出力? どこにそれを表示したいの? >>768 そもそもそのログの日付とやらはどこから持ってくるつもりなのか >>773 すみません VBAのユーザーフォームで検索用のテキストボックスを作り、 検索結果に該当したレコード(行)を選択(抽出)?して それをテキストボックス2やリストボックスに表示したいです 〜番(ID) 名前 テキストボックス(リストボックス) 〜月〜日 何をした みたいな表示画面が作りたいです >>775 〜番号 名前 〜 〜 〜 の様な感じで列に追加していくやり方で作ろうかなと考えています >>776 まずワークシート上でlookup,index,matchで検索、表示できるものを作る。 それからフォームのテキストボックスに入れた値をワークシートの検索用のセルに書き込み、結果をフォーム上のテキストボックス、リストボックスに書き込むVBAを作る。 >>778 ありがとうございます まずはそこからですよね どこでつまずいているかを書かないで答えだけほしいとか言われてもね
>>768 こんなんVBAでもなんでもなくシステムを作りたいっていってるようなもんでしょ 金払って作ってもらえよ >>768 なぜそれをエクセルでやりたいと思ったのか 今のレベルだと一から勉強レベルだと思えるが c#かせめてVB.Net覚えたほうがいいんじゃない セルの内容(日付のところは文字列型(頭にアポストロフィ)で入れてる) ID 名前 日付 イベント 1 名前1 2012年3月14日 Aをした 2 名前2 2012年3月15日 Bをした 3 名前3 2012年3月16日 Cをした 4 名前4 2012年3月17日 Dをした 5 名前5 2012年3月18日 Eをした 6 名前6 2012年3月19日 Fをした ※Sheet1のマクロ Private Sub Worksheet_SelectionChange(ByVal Target As Range) With UserForm1 y = ActiveCell.Row .TextBox1 = Cells(y, 1) .TextBox2 = Cells(y, 2) .TextBox3 = Cells(y, 3) + vbNewLine + Cells(y, 4) End With End Sub フォーム(UserForm1)を作って下記コントロールを配置 TextBox,TextBox1,TextBox2,TextBox3(Multiline=true),CommandButton1 UserForm1のマクロ Private Sub CommandButton1_Click() Sheets(1).Range("A1").AutoFilter 2, "*" & UserForm1.TextBox.Text & "*" End Sub ファイル開くイベントとかボタン作って下記マクロでフォームを表示 UserForm1.Show vbModeless 聞いた限りではこんなのしか思い浮かばない
VBAのPicture.Insertでリンク貼付けさせないようにクリップボード利用でPasteで貼り付けてみたら画像が異常に重くなりすぎて使い物にならない…。 おとなしくShapes.addPicture使うしかない?
>>768 Listobject作ってListrowsを都度登録する仕組みを作って目的のListrows()を呼び出すユーザーフォームを作ればいいんじゃないっすかね。 まず質問者は何ができて何ができないのか気になるが何もできないんだろうなと推測してる なのでここで丸投げしてバカなお人よしに作ってもらおうとしてるんだろ
猪木が死んだ、時代が流れていく 思えばPCとの付き合いももう40年か 戦時中はと口癖のように言っていたジジイ共も消えてアマチュア無線なみにニッチな趣味だったPCが主流になるとは不思議なものだ
>>784 もとの画像が大きいんじゃね、表示用の画像を別途つくってから貼り付けてみ >>783 わざわざありがとうございます 助かりました >>787 おいおいいつだよって思ったら昨日かよ >>786 それでいいと思うんだよな それが社会の基本だし、暇な元事務のNEETはそれで快楽を得つつ勉強になり、 転職への自信になるだろう VBAは作業を登録して自動化するくらいで覚えておいた方がいいですよね
>>788 800kの画像でやってみたけど15Mぐらいまで巨大化してしまう やはりAddPictureで代用してみる VBEに書いたコードの整列っていうかコードを整えるっていうか自動インデントっていうかそんなショートカットキーがあったと思うけどなんだっけ?
>>791 変な枷付けること考えんと 好きに作っていいんやで イベントで質問 余所で作ったエクセルにVBAで改造加えてるんだけど 1マス入力だけするSheetにActiveXのコマンドボタン付けたら Worksheet_SelectionChange が発生しなくなった コマンドボタン押したイベントは拾ってるので EnableEventsがFalseってわけじゃない(イミディエイトで確認済み) デザインモードを解除してもWorksheet_SelectionChangeイベントが起きないので しょうが無いからまた一から作り直したんだが この現象って頻発するもの? ググってもOfficeの修復かEnableEventsしか解決策が出てこない
>>792 Sub Macro1() ActiveSheet.Pictures.Insert "C:\Work\Sample1.jpg" End Sub これで400KBのpngで試してみたけど なぜかxlsmファイルのサイズは15KB 何か別の要因とか >>792 オプションの詳細設定-イメージのサイズと画質 ってどうなってる? Dim ar(2) As Variant ar(0) = 1 ar(1) = 2 ar(2) = Split("1,2,3,4,5", ",") Dim i For i = 0 To UBound(ar(2)) ar(2)(i) = CLng(ar(2)(i)) Next i splitで作ったジャグ配列の中身をlong型に変換したいです。 variant変数に一度入ったらもう無理ですか? 一応他の変数に入れる事で型変換には成功するのですが。 余計な変数を二つも用意してstringで作成されたのを一時的なvariant型ノーマル配列に おさめてmそのあとで本当に使いたい配列のジャグ配列に入れていくというのが どうも汚い感じで腑におちません。 アドバイスもらえると助かります。
>>801 ありがとうございます。 ジャグ配列はRedim出来ないのがデメリットですね。 動的な配列の中にジャグ配列なのですが、なんとか先に不確定な親配列の中にある 不確定な数のジャグ配列を一時的なLong型配列に作って そこからさらにsplitなしでなんとか作ろうとあれこれしてたら よっぽど>>800 の方法の方が処理がわかりやすくなってしまい徒労に終わりました。 諦めます。踏ん切りつきました。 >splitで作ったジャグ配列 >動的な配列の中にジャグ配列 ジャグ配列って用語の使い方が微妙に間違ってる気がするが... そもそも文字列を分割して配列作ってるんだから文字列の配列になるのが当然で Variant上等でやるなら、それを使う側がVariantで受ければいいだけでは? まあ俺ならどうしても文字列をSplitしてLongにしたいなら Longの配列返すSplitのラップ関数作るけど
>>797 それでいくとうまくいくんだけどね、 通常のPictures.Insertだとリンク貼付けなのよ。他人に送付したら見れない。 だから一旦クリップボード経由でPaste使ってやってるんだがそれだと容量がヤバくなる。 そもそも何でもかんでも配列で処理しようとするのがちょっとねぇ。 例えば列に当たる要素毎に違う型を使いたいなら ちょっと仕組みは大きくなるけどADODBのRecordsetを使うことや 1行の列データ単位の値を格納するクラスを作ってそれを行単位としてディクショナリやコレクションに追加して行くことも検討することを視野に入れると 結局後で読みやすく汎用性の高いロジックが組めたりする。 処理速度優先なら配列一択だからそのときのシュチュエーションに合わせて使い分けだね。
構造体ではできんの? ジャグ使う機会無いからなんとも言えんが
すぐDBとか持ち出す奴いるけどコスト考えたらそう簡単にDBなんか使わんと思うけどね 普通に配列処理用の関数のみのモジュールでコード管理すればいいだけと思うわ
例えば、誕生石を取得するGetBirthStone関数を作ろうとすれば引数は「日付 as Variant」と「月 as Integer(Long)」のどちらがいいでしょうか?
そんなもんVLOOKUPで誕生石シートを検索すれば十分 VBAを正しく使うコツはVBAを可能な限り書かないことだよ
>>816 Date型でも大丈夫ですか? 一応、最初の部分はこう書いてみました If Not IsDate(日付) then GetBirthStone = CVErr(xlErrValue) Exit Function >>817 いや、むしろVBAだけの方がメンテしやすい データとロジックは分ける方がいい >>815 元のデータが何によるかで違うけど「月 as Integer(Long)」でいいのではと思う 仮に元のデータが日付でもGetBirthStone(Month(日付))で済む 月を渡すようなケースがありえないなら日付を渡して関数内でMonthを使うでもいい 月だけでいい 特定の日付に依らずある月の誕生石を知りたい場合に 意味のないDate値用意しなきゃいけなくなるから可読性が落ちる >>817 誕生石みたいに改訂されたことがニュースになるくらい固定されてる内容ならコードにベタ打ちでいいと思う 祝日みたいに毎年変動するものとか、組合せの数が多すぎる要素ならシート管理の方が扱いやすいと思うけど >>815 その程度のこと自分で決められんようでは時間かかってしょうがないだろ >>815 Function getBirthStone(日付 As Date) Application.Volatile True getBirthStone = WorksheetFunction.Choose(Month(日付), "ガーネット", "アメシスト", "アクアマリン", "ダイヤモンド", "エメラルド", "ムーンストーン、真珠", "ルビー", "ペリドット", "サファイア", "オパール、トルマリン", "トパーズ", "トルコ石、タンザナイト") End Function こんなかんじ? >>803 ラップ関数作る解決方法最高です。 頭固かったです。 他にも導入できそうなところが見つかり助かりました。 感謝です。 >誕生石みたいに改訂されたことがニュースになるくらい固定されてる内容ならコードにベタ打ちでいいと思う >>823 を見ての通りこの手は表記ゆれが問題になる事が多いから 可能な限り外部データにした方がいい インプットボックスで入力される値が数字かどうか判断するコードってどう書けばいい?
・符号(+-)を許すか ・ドット(小数点)を許すか ・カンマ(桁区切り) を踏まえて文字の妥当性チェックすればいいんじゃないの
あと自分はWorksheetFunction使うの好きじゃないけど WorksheetFunction.IsNumber でもいいかもね
全角は?漢数字は?ローマ数字は?欧米式の桁区切りは? 入力検査は考え始めるとキリがない分野の一つだぜ
>>833 さんきゅーそれだ てかVariant型が数値かどうか調べられるんだな~ 書き方解ったらvartypeとかtypenameでも行けそうな気がする ちょい試してみよ >>834 語弊があるといけないから言っておくと、 IsNumericはあくまで数値として扱える値(数値に変換出来る値)かどうかを判定するよ。 だからString型でも”123”みたいのはTrueを返すからそこは注意してね。 考慮点はまだあるぞ IsNumericって "\3"とか"3e3"とか"&habc"とかもTrueだぜ
じゃ足し算する関数を別に作ってノーエラーで戻ってきたら数値 Sub Main() '全角数字も数字と見なす If Suujikana(StrConv(InputBox("入力せぇ"), vbNarrow)) Then MsgBox "数字だよ" Else MsgBox "数字じゃないよ" End If End Sub Function Suujikana(moji As Long) As Boolean On Error GoTo er moji = moji + moji Suujikana = True Exit Function er: Suujikana = False End Function
このやろ、variantにしたら+で文字列つくりやがって こんのやろぉ
これでいい?らめ? Sub Main() '全角数字も数字と見なす If Suujikana(StrConv(InputBox("入力せぇ"), vbNarrow)) Then MsgBox "数字だよ" Else MsgBox "数字じゃないよ" End If End Sub Function Suujikana(moji As Variant) As Boolean On Error GoTo er moji = moji * moji Suujikana = True Exit Function er: Suujikana = False End Function
>>836 まぁその辺は数値として受け取れるとも言えるからね。 その辺除外したいなら最初に“¥”や“e”や“&h”が含まれていたら数値ではないって分岐入れとけばいいだけじゃないの? >>840 自分も同じこと考えたけど型の制約が緩いと面倒くさそうなので思考を放棄した、よく頑張ったな そういえば昔型はあるのとないのではどっちが良いのかって記事を見たことあるな 結局型がないと論理エラーが出ないように型をちゃんと理解する必要があるって書いてた
別にVBA使わなくてもワークシート関数でできるじゃんって意見どう思う?
>>845 内容によるけどまあワークシート関数でできるならその方がいいだろうな A1に入力されているものが消えたらB1以降の入力セルデータが右から左に自動で繰り上がってくるようにしたいのですがこれで大丈夫ですか? これをA20くらいまで適用したいんですけど教えて貰えませんか...? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("A1").Address And IsEmpty(Target) Then Application.EnableEvents = False lastrow = Cells (Rows.Count, "A").End(xIUp).Row Range("B1:F1"&lastrow).Copy Range("A1").PasteSpecial xIPasteValues Range ("A"&lastrow).ClearContents Application.EnableEvents = True End If End Sub
"B1:F"&lastrow 下から4行目は何の処理かな g列以降にデータがないなら、a列削除でもいけそう
xIUp >> xlUp >> xlLeft xIPaste >> xlPaste excel だから xl だよ 本から手入力したのかな
文字列にしてTrimして 右から一文字づつAscでコード調べて数字判別してる
>>845 関数なんか使ったことない 全部マクロでできるし ワークシート関数も便利なものは便利で、 パフォーマンスについてVBAより良い場合があるものもあった記憶がある まあ使い分けだな
あたりまえだかパフォーマンスはワークシート関数の方が高いよ そもそもマルチスレッドで動くし
問題はたくさんのセルに関数を入れまくると超遅くなることだ
>>845 できるだけ関数に寄せる方が良いと思う あまりに複雑になりすぎるなら、vbaでも良いって感じ >>856 それVBAでやったらそのセルの分ループで回すことになるからますます遅くなるわけで... ワークシート関数は自動計算で実行する マクロ(vba)はイベントで実行する
>>845 ワークシート関数で済むならそれに越したことはない 複雑になりすぎてVBA使うのと変わらんレベルになるくらいなら、状況次第でVBA使うこともある よく検討してみてExcel仲介する必要ないならVBSなんかも視野に入ってくる 他のより良い手段があるならそっちにする ケースバイケースという当たり前の結論 だがそれが大事
そういや何気にVBAの中でCallByName使うとJavaScript 使えるらしいね。 使ったことないけど。
>>865 さあ? メソッドチェーンが使えるくらい? まぁ無理して使うもんでもないような。 現にJavascript知っててもVBAに混ぜて 使うような状況なんてなったことないし、 大体記述がめんどいし。 >>866 ありがとう やっぱりほとんど無いよね。 メリットはネイティブの手段でJSONがパースできるようになる事なんだけどVBAで必要になることはほとんどないか ちなみに似たような方法でHtmlFileからIEのjavascriptを呼ぶ方法もある
正規表現をRegExpオブジェクトで利用することはネイティブですか?
正規表現をRegExpオブジェクトで利用したらハゲますよ
すみません、質問させてください range内の空白セルを除いた部分を一気に配列に入れる方法ってありますか? 例えばA1、B2、A3、B3に1が入っていて、Range(Cells(1,1) ,Cells(2,2))を選んでいる状態で配列ArrにArr(1,1)=1、Arr(1,2)=1のみを入れる。ということです 「Range(Cells(1,1) ,Cells(2,2))を選んでいる状態」というのはFunctionで関数を作ったときにこの範囲を選んでいるという意味です CurrentRegionを使ってもA2、B2の空白まで配列に入ってきてしまって困ってます
selectionでforeach回せばできる気がするけどな
すみません、先程の質問の意図はvba 100本ノックの以下の問題を解いていましたhttps://excel-ubara.com/vba100/VBA100_062.html 最初に範囲内を配列にすべて入れてdictionaryで出す方法を考えたんですけど、範囲のところがA1:C5とかならいいのですが、A:Cだと、すべての行まで配列に入ってしまって、それの行すべて処理するようになってしまったので、数字が範囲内の最終行までを配列に入れることができれば処理速度も変わるので、そういう方法があればという質問でした 作成依頼です。 G列に空白セルがあった場合、その空白セルの隣のセルに入力されている値をクリアにする。 というコードを作成いただけないでしょうか。 よろしくお願いします。
隣とはどっちだ あまりにも指示が不明瞭でバカが書いたとしか思えない文章 スルーで決定
>>881 マジレスするとここは質問スレであり 作成要請スレではありません。 作る方法等を聞けば教えてくれる人もいるかも知れませんが、作ってくれと丸投げにした場合、 その見返りを要求されるか一蹴されるかして終わるのが関の山です。 自分でそう言った趣旨のスレを探すか立てるかした方が賢明と思われます。 >>884 消す方だったか、"クリア"って書くのかと思ったぜ >>888 甘い 空(そら)と白(しろ)で合わせて空白まで読み取らないと 4000件くらいのデータのExcelファイルから A. 特定の数十件の社員データを除いたデータファイル B. Aで除いた数十件の社員のデータのみのファイル を作成しなければなりません 元のファイルを2つFileCopyして ・Aから対象社員のデータをUINONメソッドでRangeに格納して一括削除 ・Bから非対象社員のデータをUINONメソッドでRangeに格納して一括削除 もしくは ・Aから対象社員データをAutoFillterしてBに貼り付け →Aから対象社員データ削除 を考えてますがどちらが速いでしょう 元の書式を活かしたExcelファイルが必要なので CSV出力やExcelファイルにデータのみ転記することはできません
何度も繰り返し行なう作業とか面倒な作業ならVBA使うメリットもあるけど、その程度ならシートコピーとフィルターでさっさと手作業で済ませた方が手っ取り早いのでは?
>>890 画面の書き換えだけ止めとけば、たぶん、どの方法でも大差ないと思うよ Unionは重いから、削除は一括じゃない方がいいかも 気になるならベンチマークとってみれば? >>886 >コード書き込みや作成依頼もOK 1をよくみような 個人的にはコード作ってとか書かれてたら困ってるんす金くださいと言われてるくらい嫌なので余計に作らないわ~ 書くのは勝手だけど
誰もお前には頼んでないのに、俺は作らない宣言しちゃう人って自意識過剰すぎません?
>>881 1:30で書けたけど・・・ これぐらい書くのにみんなどれぐらい時間かかるもんなの? Sub foo() 最終行 = Cells(Rows.Count, 7).End(xlUp).Row For i = 1 To 最終行 If Cells(i, 7) = "" Then Cells(i, 6) = "" Cells(i, 8) = "" End If Next End Sub >>890 回答待つより実際に作って比較した方が早くない? >>897 いい回答だと思う 自分でやればわかることを他人に聞くのってほんとバカなのかなと思う >>881 Ruby で作ってみた。 未入力の列はnil となるので、a, c も未入力となる require 'csv' input_text = <<TEXT ,a b,b ,c TEXT output_text = String.new CSV.filter( input_text, output_text ) { |row| row[ 1 ] = nil unless row[ 0 ] # nil の時 } print output_text 出力 , b,b , >>895 で、誰もお前に意見聞きたいとか頼んでないのにどうしてそんな自意識過剰な反応してんの? ちょうど今日別々のシートの範囲Unionして二次元配列にしようと思ったらエラーだったな 同一シートじゃないと無理らしいね 二次元配列同士を結合したからまあいいけど
>>896 Nextのズレが気になって気になって今日は眠れないわ マウスで範囲指定した複数のセルから値を受け取ったり書き込んだりする方法はありますですか? "A1:C3" と指定した状態でそこに有る数値をVba側で受け取って一つ一つ何かをしたあと、 また今の指定した範囲のセルに書き込むとかです。 一つのセルであれば、ActiveCell.Value とすればいいですよね。
>>906 Application.Selection.Valueで出し入れできる 基本的に2次元配列を操作することになるが、 単一のセルだと配列にならないとか 複数の領域が選択されていたときにどうするかとか 細かいところを考えることになる >>908 大変重要なキーワードを提示いただきありがとうございます。 とりあえずの目的は達成できました。 また、これで詳しい内容をググりに行けますです。 外出先でもスマホからマクロ実行したいからGASでプログラムやろうかと思ってる
GASいいよね Googleスプレッドシートは単一のブックを皆で共有してつつき回すのが前提だから、 Excel VBAでよくあるようにデータとマクロ用ブックを分けて部署別の複数のデータファイルをVBAでまとめて集計するみたいなことをする必要性が低くて、 そもそもGASを書かなくて済むケースが多かったりする 外部APIとのデータ連携が必要なときくらいだな
>>914 それってWeb版EXCELと何が違うの? もちろん違わないよ 全く同じことがWeb版Excelにも言える まあExcelにしちゃうとせっかく共有してても結局ローカルコピーを作るバカが必ず出てきて邪魔になりがちだから、間違った使い方をするのが難しいという点では好ましいかもね
それはWEB版を使いにくいと思ってる人が居るってことでは?
試しにAndroidスマホからボタン(図形)をクリックしたけどgasを実行できなかったよ なんか色々と制約があるみたいだし、JAVAやC#でスマホアプリ作ったほうがいいな
どんどんスレの趣旨からはなれtrくなー そもそもスマホアプリ作るならAndroidでC#使うならXamarin使うことが前提になるしiPhoneならSwiftかObjectiveCだろ WindowsPhoneならxamlとC#かVB.Netで作ること出来たけど死滅しちゃったからなー Javaは実行時に中間コード翻訳が挟まるから重いし やっぱりスマホはiPhoneをSwiftで開発するのが最強だろうな AppleのMacで開発することが前提になるからちょいお金が必要になるけど。 ExcelのVBAやってる人はMac買うんなら別途Windows も必要だな MacのEXCELはVBAまともに動くことを期待しない方がいいから。
質問ですが、 シートに動的に追加したボタンに対して、共通のクリックイベントを追加したいのですがやり方がわかりません。 教えてほしいです。 activesheet.buttons.addで追加したボタンに対して、 クラスモジュールで作成したクリックイベントを結びつけたいです。
動的にボタン作成しながらそのボタンに対して共通のクリックイベントを結びつける方法です
>>926 .OnAction プロパティにプロシージャ名を設定 基本的にはボタンのOnActionにマクロ(Subのメソッド)名を設定すればいいんだが クラスモジュールのメソッドとか直接指定できないんじゃないかな 間に標準モジュールかますとかすれば行けると思うが
マクロの記録でもやればおおよそやりたい事のひな型のコードはできると思うんだよね そういうやり方で解決できない人ってなんだろと思う ActiveSheet.Buttons.Add(168, 108, 186.75, 66.75).Select Selection.OnAction = "Macro1" マクロで作ったこれを参考にすればいいんじゃないのと思うが Addで作ったものをObject型の変数で受け取ってその変数のOnActionに代入するだけでしょ それにググればこの程度はいくらでもでてくるんだけどね
>>928 確かに。 何でクラスモジュールのメソッドに紐付けようとするか謎だよな。 そもそもそれにはインスタンスが生成されていなければならない訳だし VBAのクラスはそこまで万能では無いからシングルトンパターンでよく使われるみたいに自分で自分を生成することも出来ない。 そうすると前もって生成したインスタンスのメソッドに紐付けるしかない訳だけどそんなことVBAのクラスで本当に出来るのか?と思ってしまうわな。 クラスのモジュールではなくてもいいんですけど、何かしらの共通メソッドを呼び出せるようにしたいです。 動的に作った編集ボタンが100個くらいあって、編集するフォームを呼びだす共通メソッドに紐付けたいです。
初心者向けサイトに出てくるWithEventのやつじゃないの クリックならいけるけどEnterとか一部はだめだから使わなかった
>>931 それは同じ関数呼んで引数で関数内で何とかするんじゃダメなの? だから何人も.OnActionだって言ってるのにアホなん?
目的や使用場面が不明だけど、それは1Sheet上にボタン100ヶ必要なものなのか? そのボタンは、どう配列・配置されるものなのか マス目に10×10とかなのか、タテとかヨコにぞろぞろ100ヶなのか 何らかのデータの塊の傍にボタンを動的に配置し、それを押すことでひな型の編集フォームを呼び出すというのか >>934 とか上に書かれてきたサンプルを参考にして苦心して作れたとしても、結果として「それ違くね?」には成らないのか 設計の妥当性が問われる 「動的に編集ボタンをつくる」ための何らかのイベントが在るわけだし、だったらそれに結びつけた方が無駄が少ない とも >>936 確かにねー でもリストの行の横っちょにボタン付いてて そのボタン押すとその行のデータ読んできて処理するとか ExcelのVBAじゃなくてもよくあることだし そう考えると100どころか1000くらいくっついてても それがユーザーにとって使いにくいとは言い切れない ケースもあるから何とも言えないね ポタン100個つけるならフォームは考えないでワークシートでselectionchangeでいいと思う
ボタンって最大何個ぐらい貼り付けできるんだろ? メモリがあれば10万個とか貼れんのかな
>>938 >>939 確かにボタンにこだわる必要はないですね セルクリック時にフォーム呼び出したらいいですね Excelのイベントに onclick とか無いけどな OnDoubleClick ならあるけど 余計な位置でクリック・ダブルクリックした時に そのたんびに編集フォーム出るのを対策必要かな 違うイベントに関連付けた方がいいのかな
まあワイだったら単純にするために、 セル(か行)を選ばせて、 ボタンではその値を参照してフォームに渡させるって感じで作るけどな シートにオブジェクト何個も置くのはワイ的に無し
>>946 そのあと「これは効率が悪い」と気付いて修正するならいいけど、それしか考えられず500,1000と増やし続けているおじさんがウチの会社にいます。 >>945 セルを選択させてボタンを押してその行の値をユーザーフォームに引き渡すの? (;・∀・)1000個やった。。プログラマはすげぇやって思ったけど効率いいやり方あるんか。
似たような処理ならforでもdoでもいいから1000回ループさせればいいわいな
問題なく動いているのを変に直してバグ入れる人よくいる
wordVBAについて質問したいのですがここでも良いですか? win10 2019版ですが、ページ番号5のページ全体を選択状態にしたいのですが、ググって見つかったrectangles(1)の手法は2019ではうまくいきません。 解説サイトがExcel VBAに比べてとても少ないので困っています。 ご存知のかたいませんでしょうか?
>>958 956が頭おかしいだけだから気にすんな VBAのスレはこの今に存在するし、Excelって書いてあるのに無視して質問してる 更にはあまりにくだらないないようであるし この手の連中はつけ上がるからな
Excel初心者です。 カレンダーから日付入力のアドインをチェックボックスを使って表示・非表示したいのですが可能ですか? また、スクロールしても画面内の同じ位置に表示し続けることは可能ですか? できればコードを教えてほしいです(*_ _)
おまいら親切すぎるんだわ どんだけお人好しなんだ?
>>967 って思うじゃん? ここで回答すると、違っていた時やもっといい方法があるときに上乗せして回答される すっげーいい勉強になるんだぜ 優劣つけたがる奴多いけど 技術的な解決方法の話(こういう方法もあるぞ)だったらマウントいうのはおかしくないか?
質問に対しての回答例ならマウントという表現はおかしいと思うが その後の雑談は確かにマウントの取り合いに見える
僕が一番VBAをうまく使えるんだって言いたくなるのはわからなくはない
>>969 頼むからマウント取ってください! とにかく俺の上のスキルを見せて欲しい。なんでもしますから! >>971 実際、確実に上って人はいくらでもいるよ お前がぐちゃぐちゃ入ってないで解答教えてやれや 971がやきもきしてるぞ
>>966 カレンダーアドインは使ったことないんでわからん カレンダー程度なら自作できるので融通の利かないアドインは好かんのです 汎用性のある日付入力カレンダーの自作は結構大変だろ 休日祝日の更新処理が面倒で自作はあきらめた
>>978 > 休日祝日の更新処理が面倒で自作はあきらめた それ汎用性のある日付入力カレンダーでやることじゃないだろ... 日数算出するの面倒いよな うちの会社は祝日が全部休みじゃないし
結局、日付入力はカレンダー形式やめてテキストボックスとスピンボタンで適当に誤魔化した
>>966 アドインでは無くてユーザーフォーム作ってそこにボタン配置してシート上のセル操作ならやったことある [BttnF] という名のユーザーフォームを呼び出すのに、A1セルにボタン [cmdBttnF] を配置(ウィンドウ枠の固定でA1はずっと表示してるから) Private Sub cmdBttnF_click() With BttnF .StartUpPosition = 0 .Top = 100 .Left = 800 .Show vbModeless End With End Sub これだけで、画面スクロールしてもシート上の同じ位置に居続けるし、もちろんフォーム掴んで動かし回してもいい ×で閉じることもできる うっかり閉じても、又A1セルにあるボタン押せば表示できるし >>966 少しだけ補足すると、質問の文章がきちんと書かれていないので回答しにくい部分があって EXCELのバージョンとカレンダーアドインについての情報がないので私の環境での説明では質問者のものと異なるかもしれない アドインの表示/非表示はVisibleとかの表示関係のプロパティーは調べないのか スクロール範囲は「ウインドウ枠の固定」かユーザーフォームとかが考えられるんじゃね >>966 「カレンダーから日付入力」のアドインは個人用アドインに取り込まれて 毎回それをダイアログから追加するか貼り付けたまま使い続けるかの使用方法しかない様子 マクロの記録で一連の操作をしても望む動きしないし、ユーザーフォームに貼り付けるとか コピペとかいろいろ試したけど、どれもできず断念 作者に交渉して「こういう使用方法したい」と改善依頼するしかないような 誰か他の案プリーズ 質問です。 VBAの処理の途中経過をログのようにコマンドプロンプトに表示させたいのですが、 どうすればよろしいでしょうか? 高速だと尚嬉しいです。
>>987 表示だけならユーザーフォームにテキストボックス貼り付けるだけでいいんじゃね >>987 debug.printでイミディエイトウィンドウじゃだめなの? フロートさせることもできるからわざわざコマンドプロンプトに投げなくてもいいと思う ありがとうございます。 フォームか、イミディエイトウィンドウを独立に出すのですね。 VBAを別のシステムから呼び出すのですが、エクセルをアクティブにしていなくても前面に出てきますでしょうか?
Excelを他のシステムから呼び出すならVBAではなくてOfficeアドイン(COMアドイン)
すみませんいろいろとあるのですが、とりあえずイミディエイトウィンドウで試してみます
よく分からんけど、VBSなら呼び出しも黒窓も両方できるぞ。
>>996 コマンドラインプロンプトからvbs経由でエクセルのマクロ叩くのはいいけど、そのマクロからDebug.Print的なのを画面に書き出すのはどうやるの?マクロからテキストファイル開いてログを書き出す方法ならわかるけど ドラマや映画の中でよくある、でっかいマルチモニター複数枚に 犯人画像や防犯カメラ映像、それに並べてプロファイリングや位置情報やらの隅っこで 黒窓の中に意味不明な文字列がズラズラ流れてるような そんなのを作りたいんだと思う おれはつくりたい
>>998 イメージとしてはそうです。 ありがとうございます。 黒窓だとログっぽさが出て使う人がわかりやすいかなぁと思っていた次第です。 Microsoft同士なのに単純には出来ないんですね ログっぽさとかw VBAだけでやろうとせずにPowershellでも使ってファイルに出力したログをずっと表示するような仕組みでいいんじゃないの 画面に流しても見逃したらログのいみなくね?
lud20230204222325ca
このスレへの固定リンク: http://5chb.net/r/tech/1658009255/ ヒント: 5chスレのurlに
http ://xxxx.5ch
b .net/xxxx のように
b を入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Excel VBA 質問スレ Part77 YouTube動画>1本 ->画像>5枚 」 を見た人も見ています:・Excel VBA 質問スレ Part67 ・Excel VBA 質問スレ Part66 ・Excel VBA 質問スレ Part68 ・Excel VBA 質問スレ Part61 ・【RIFT】 Rift: Planes of Telara 質問スレ Part5 ・Counter-Strike: Global Offensive 質問スレ Part3 ・【TESO】The Elder Scrolls Online 質問スレ Part27 ・【TESO】The Elder Scrolls Online 質問スレ Part46 ・【PS/XB】Elden Ring エルデンリング 質問スレ Part3 ・【TESO】The Elder Scrolls Online 質問スレ Part24 ・【TESO質問】The Elder Scrolls Online 質問スレ Part1 ・【TESO】The Elder Scrolls Online 質問スレ Part6 [無断転載禁止] ・【TESO】The Elder Scrolls Online 質問スレ Part25 [無断転載禁止] ・【TESO】The Elder Scrolls Online 質問スレ Part15 [無断転載禁止] ・【PoE】 Path of Exile 質問スレ part22 ・【PoE】 Path of Exile 質問スレ part14 ・【FFBE】 FINAL FANTASY BRAVE EXVIUS 質問スレ6 ・【PoE】 Path of Exile 質問スレ part33 ・【PoE】 Path of Exile 質問スレ part23 ・【MGO】METAL GEAR ONLINE 質問スレ Part14 ・【FFBE】 FINAL FANTASY BRAVE EXVIUS 質問スレ7 [無断転載禁止] ・【PoE】 Path of Exile 質問スレ part15 [無断転載禁止] ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 36匹目 【アナデン】 ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 33匹目 【アナデン】 ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 8匹目 【アナデン】 ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 13匹目 【アナデン】 ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 25匹目 【アナデン】 ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 30匹目 【アナデン】 ・【ソロ専用】アナザーエデン 時空を超える猫 質問スレ 39匹目 【アナデン】 ・【PC】Terraria 質問スレ Part17 ・PSVita 質問スレ part1 [無断転載禁止] ・au Xperia Z1 SOL23 質問スレ part3 ・Florensia -フローレンシア- 質問スレ Part1 ・Tasker 質問スレ 17 ・【臨】 質問スレ 【床】 ・d払い 質問スレ Part1 ・iTunes 質問スレ Part19 ・ChMate 質問スレ Part55 ・ポケモンGo 質問スレ Lv.66 ・ポケモンGO 質問スレ Lv35 ・ポケモンGo 質問スレ Lv.59 ・ポケモンGo 質問スレ Lv.68 ・メギド72 質問スレ Part515 ・ポケモンGo 質問スレ Lv.40 ・Warframe 質問スレ RANK32 ・ポケモンGO 質問スレ Lv27 ・ポケモンGo 質問スレ Lv.65 ・ポケモンGo 質問スレ Lv.44 ・ポケモンGo 質問スレ Lv.64 ・ポケモンGO 質問スレ Lv14 ・ポケモンGo 質問スレ Lv.67 ・Fallout4 PC 質問スレ 25cap ・三国ヒーローズ 質問スレ Part6 ・スター・ウォーズ 質問スレ EP6 ・スター・ウォーズ 質問スレ EP9 ・Tree of savior 質問スレ Part4 ・au by KDDI 質問スレ Part.240 ・au by KDDI 質問スレ Part.234 ・Tree of Savior 質問スレ Part39 ・【PC】Warframe 質問スレ RANK41 ・スター・ウォーズ 質問スレ EP4 ・スター・ウォーズ 質問スレ EP5 ・【PC】Warframe 質問スレ RANK57 ・Tree of Savior 質問スレ Part25 ・Fate/Grand Order 質問スレ Lv.22
03:10:22 up 4:13, 1 user, load average: 8.90, 8.60, 8.58
in 0.082350969314575 sec
@0.082350969314575@0b7 on 011317