Excel VBA 質問スレ Part78
レス数が1000を超えています。これ以上書き込みはできません。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
ExcelのVBAに関する質問スレ
コード書き込みや作成依頼もOK
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
Excel VBA 質問スレ Part77
https://mevius.5ch.net/test/read.cgi/tech/1658009255/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured 3行貼り付けても
2行になるんだな この呪文↓
!extend:checked:vvvvv:1000:512 1行目は本物の呪文
2行目は次回スレ立て時用の呪文
3行目は間違って消す馬鹿除けの保険 とりあえず建てたよ。
あと進行よろしくお願いします。 初心者はなんで自分の能力でできないことをやりたがるんだろうね そりゃ自分でできることだけやってても伸びないからじゃね >>5
子供と一緒で自分の能力でできることを知らないからじゃない? 出来なかったことがやれるように成ったらうれしかろ? 次のステップは踏みたいじゃん 階段途中で足止め食うよりは
https://chie-pctr.c.yimg.jp/dk/iwiz-chie/que-13121424663?w=999&h=999&up=0
前スレの最後の質問は、ログっぽさ出そうと苦労しても出力が一瞬で終わってガッカリすると思う
よっぽどひつこいloopとかさせて延々と処理し続けるコード書くなんてのも無駄の極みだし
出力に遅延処理させる? Excel上ではとっくに結果出てるのにログっぽい画面ではダラダラ出力し続けさせる?
うん、悪くない 関係無いが、マトリックスのOPの象徴をマトリックス・コード デジタル・レインとか呼ぶらしい 今更知った >>5
それ以前に使うソフト間違ってねえか?
てのばかりだしね。
出来ること出来ないことの判断がさ。 >>5
そもそも自分の能力で出来るならこのスレに来ないし >>5
判断すらできないし、それを指摘する人もまわりにいないんでしょ 自分でできない処理をやりたいと考えるだけならいいが
自分で調べたりしないで質問したらやってもらえるとか思ってるんじゃないか しばらく前からそういう層は増えてる 黎明期のような、積極的に見知らぬ世界に飛び込もうって勢いじゃなく
仕事でやらざるを得ないからしょうがなく操作する、でも分からん、教えて
検索しようとしても、やたらと広告メインのサイトばかりヒットして、ロクな情報に辿り着けない ンなもん使えねー に成る
便利も度を超すとアタマがパーに成るだけ 老獪なじじい共は相手が美少女だとでも思い込んで、手取り足取り懇切丁寧に教えてあげて
やる気(ぜってーモチベーションとか言わない強靭な意志)を引き出してあげるよう、つべこべ文句垂れてないで、やよ励め まあ興味ある質問ならこたえるし
質問がよくわからない、質問者もよくわからないなら無視するだけだから質問するのはかまわないけどね 質問です。
ボタンを押して時間が長く掛かる処理を実行する際、
他のとあるボタンを押したときにピタッと処理を中断するプログラムって書くことは可能ですか?
エスケープキーとかで中断させようとすると、中々中断されなかったり、固まってしまうことがあるもので・・・
以下の条件は満たして欲しいです。
・中断用のボタンを押すまでの処理実行速度は落とさない。
・中断用のボタンを押すとピタッと止まって実行している処理を中断してプログラムを終了する。
※尚、途中でDBを読み込むなどVBAに依存しない処理は含まれないものとします。 >>15
無理
時間のかかってる部分にDoEventsを入れるしかないし、スピードは落ちる >>16
なるほど、やはり無理なnですね
諦めがつきました。ありがとうございます。 >>15
作り方によるが、長くかかる処理がLoop回数が多いようなパターンであれば
1.長くかかる処理の中に、ある条件が成り立てば以降の処理をしないで終了するようにしておく
2.Doeventsを長くかかる処理の中に入れる
3.ボタンを押したときに上の条件が成り立つようにする
なら一応それっぽくできるかも win10 office2019
ループの外で
Dim ar() as long
してある配列を
そのあとのループの中で初期化してかつ、空のままUboundでも使いたいです。
今はLong宣言を諦めてVariantにしてループ内で
ar = array()
してそのあと空のままUboundに使ってもエラーにならないようにして使っています。
Redimで初期化してLongの空配列でもUbound出来る方法で、誰に配っても問題なく動くというのはないでしょうか? 俺も3回読み直したけど何がしたいかわからんかったわ 初期化って何?Erase??
空ってどういう状態???要素数の宣言なし????
じゃあRedimで初期化して空配列ってなに?????
なんだよなぁ >>19
たとえばUBound2とかいう名前で、空だったら-1を返す、そうでなければ
UBoundの値を返すといった関数を作って、渡した人にはUBound2を使ってもらうとか。
あるいは空に戻すときに、ReDim ar(-1 to -1) as longのようにするとか。
実際には空の配列ではないけれど、 UBound(ar) < 0 のような形で判定できる。 自分は基本的に動的配列は>>23の様な初期化条件をきめておいて操作してるわ
使ったことなくて今ためしたけど
if (not ar) = -1 then
の様な式で要素数未定義が判断できるけど
こんなことしても事故のもとだからなぁ >>23
ありがとうございます。
UBound2というのは変数でしょうか?
ttps://qiita.com/Q11Q/items/a2d61545d9e5c4e15f22
渡すというのは完成したマクロファイルを他のパソコンで動かすという意味です。
dim Ary()
Ary = Array()
この初期化がとても便利で空のままUBound(Ary)してもエラーになりません。
その代償でVariant型にせざるを得ないのが気になってしまって。
-1 to 1という初期化方法はいいですね。
とても参考になるレスをありがとうございました。
これで失礼致します。 VBAはだいたいの機能が備わってるけどこういう基本的なところが抜けてたりするから
>>19はよくある疑問なんだけどそういう機能が無いので>>24みたいな非公式なTipsが編み出されたりしてるわけで 無理やり異常が出ないようにコードを組めてもその際の実行結果って正しい結果になっているのかな? 裏技を使わないと書けないコードってのは元の設計が間違ってる
言語仕様をきちんと理解してないだけ >>29
理由が解ってれば辻褄が合わせでもいいんじゃない?
個人的にはエラーの原因が解らないからと例外処理で済ますのが一番ダメだと思う VBAを1から覚えるなら「エクセルの神髄」というサイトで勉強すれば早いですか?
https://excel-ubara.com/excelvba1/
楽天RSSをりようして、株価データを取得・操作のため学ぼうと思っています。 >>33
そういう目的達成のためなら
金出して人に作ってもらうのが一番早い >>34
最終的には頼みますけど、自分である程度は理解していなと
ちょっとしたカスタマイズや金額の相場がわからないので
まずは自分でやってみようと思いました。
最低限の知識くらいはと。 あー、昔そういうの作った気がすると思ってほっくり返したら出てきたわ
https://uploda1.ysklog.net/uploda/7e9d14b129.jpg
確か全銘柄から値が急激に上下した銘柄をピックアップしてた
知ってると思うけどHPからとってくるデータは基本時間遅らせてるからデイトレするなら役に立たないよ
昔はどっかの証券会社でAPIかなんか提供してたはず、今はわからんす
真髄とかってチラ見だけどサイト良いね、ただ印刷とかグラフとか重要じゃないものも等価に説明してるんで
自分にとって必要なものから覚えていった方が良いかも >>36
たいがいのトレードアプリは素人が思いつくような機能は全部入ってるから、オーダーメイドやカスタマイズの必要なんかない
わざわざ作ってもらうのは金の無駄だし、今から勉強するのは時間の無駄 まぁそうなんどけどね
株は簡単に言うと多数決で勝つ方を読むゲームだから公的な提供データをみた他大多数がどう考えるかを先読みする力が必要
そして先読みするにはみんなと同じことやってちゃだめな部分もあるのよ HP で公表している、明地式3点チャージ法だけやっておけば?
乖離率が大きい、売られ過ぎ銘柄の戻りを狙う。
急落の瞬間に買って、上がればすぐに売る
ほぼ、100%当たるけど、
相場が大暴落する時だけだから、なかなか発生しないけど >>38
有料の奴って大抵VBAの部分って見せてないだろ
飯の種だし Python で有名なYouTuber・キノコードは、
一目均衡表など、株価の指標の作り方の動画とか出していなかったか?
株価などは、Python, Ruby だろう。
GUI は、HTML, CSS, JavaScript。つまり、ウェブアプリ。
簡単に動くのは、Jupyter Notebook
VBA では作らない 仮にMS OfficeでそれらしいことをするならVBA よりOfficeアドインの範疇なのでVBAではなくてC#やJavaScriptが基礎になると思う >>37
一応念のため
この表は数秒おきに自動作成されるものでオリジナルの計算をしてる
シート名見ればわかるかもだけどVBAで出来ないわけじゃない
逆に>>38でも書かれているけど既存のチャートとかはもうあるんだからそれを使うのが良いと思う 板情報集計値は俺のしる限りどの証券会社も公表してないから自分でやる意味はあるかも
それで勝てるかは知らんが スレチと知っててこんなことも知ってるっよって自慢したいのでしょう
他に友達いないかわいそうな人ってわかってやれよ >>47
注意されたんで話やめたんだけど?
自分がボッチだからってスレチを冗長させるようなことはやめてくんないかな ま、そういうこった
ガッツリやりたいなら.NetでASP.NetのC#か
数学的な要素が強いならPython辺りの板へ行けばいいだろう。
どうしてもEXCELでやりたいならWebのEXCELの方が向いているからOfficeScriptだな。
多分そんな板立ってるか分からんから
自分で立てるか似たようなJavaScript板へ行けば。 >>38
別に時間の無駄ってことはないだろ
そうやって他の人の真似して少しづつ勉強してくんだからよ 質問の回答でもなんでもないレスなら雑談スレにでもいけばいいものを >>50
目的はトレード、手段の一つとして質問者が選んだのがVBA
VBAを勉強するのが目的ではないし、VBAは最適解でもない >>52
そんな事全く書いてなくね?それはあなたの思い込みでしょ
そもそも「まずは自分でやってみようと思いました。最低限の知識くらいはと。」って書いてあるんだから
あなたが判断することではない
つまり質問だけに答えてればいいんだから余計な事は言う必要ないし、答えたくなければ黙ってろカスってことね 別に厳格なルールはないけどな
ここって質問ないときはこうやってダラダラとやってる感じじゃん
そこを個々の主観で縛っていったら一番窮屈な人にあわさるがそれがお望みか? 他人に注意をするときには客観的によくよく吟味してからにしないと結局荒らすことになる
それは誰も本意ではないだろ? メソッドの後ろにスペースを入れると、引数候補が表示される時とされないときがあります。この違いはどのように考えれば良いでしょうか。
例えば、worksheets.addでは候補が出てくるのですが、activeworkbook.closeでは出てきません。 補完機能に期待した事ないや
同じく候補が出る時と出ない時のパターンが分からん >>57
> activeworkbook.closeでは出てきません。
普通に出るぞ
Microsoft(R) Excel(R) for Microsoft 365 MSO (バージョン 2209 ビルド16.0.15629.20200) 64ビット 言葉の使い方として正しいのか知らんけど
メソッドの形ならスペース
関数の形なら括弧 webbrowserでSSL認証ってどうすればいい?
C#でwebview2なら出来たんだけど、
VBAなのでwebbrowserじゃないと駄目なんだわ。 >>63
知らん
C#の環境があるならアドイン作ってVBAから呼び出せばいいじゃない >>57
うろおぼえだけど、戻り値がどうなってるかによる
Worksheets.Addは明確にWorksheetsコレクションのAddメソッドのことなのでインテリセンスがちゃんと機能する
ActiveWorkbook.Closeは、ActiveWorkbookが確実にWorkbookオブジェクトを返す保証がないので、Closeメソッドのインテリセンスが機能しない
dim wkBook as Workbook
set wkBook=ActiveWorkbook
wkBook.Close
とでもすればインテリセンスは機能する ExcelVBAからプログミング初めてそろそろ別言語が気になってるんだけど、どのくらいまで習得したら一区切りによさそう?
今は基本的な構文とか覚えてクラスを勉強し始めようかなって所なんだけど それで食べていくなら食べていけるだけの事を覚えるまでだし
趣味でモノづくりしたいならつくれるまでだし
ただなんとなくなら適当にどうぞ
そもそも人に聞くことか?w 別言語じゃないと出来ない事が出てきた時。
EdgeがDom操作出来ないから、仕方なくC#の勉強始めたわ。 雇用形態による
客先IT 土方奴隷なら、Java, PHP だし、
モダンでリモートワークなら、Ruby on Rails
YouTube で有名な雑食系エンジニア・KENTA の動画でも見れば?
半年で、Railsのポートフォリオを作って、転職する >>66
できれば研修とか受けて短期間で集中して勉強するのがおすすめ
言語の習得に区切りとかはない、自分で納得するかどうか >>66だけど答えてくれた人ありがとう、結構臨機応変にって感じなのね >>66
高速化して、オブジェクトの構成覚えて、イベントでなにか記述して
あとはifとfor、foreach、
これだけ使えたら大抵のことはできるだろうから、phpでも使ってみるといいと思う クラスモジュールを使ってなにか面白いこと便利なことできないかなあ
今のとこコンストラクタで画面更新や自動計算を切る呪文を唱えるクラスくらいしか作っていないんだが 実務ではクラスモジュールなんて殆ど使わないよ
標準モジュールで機能別に関数をまとめるとかだな
それよりエラートラップや値渡しと参照渡しの違いとか覚えたほうがいい
C#やJavaだとクラスの設計ができるレベルじゃないときついが 一般事務ならそれこそvbaのみで十分だろ
職場のパソコンで環境構築とか不可能だし
Excelなら必ず入ってるからな >>77
そうだなぁ
きちんとクラスの特性とか多態性とか
基本的なことを押さえていれば
何となくこんなシチュエーションのときに使うって
分かると思うからその辺調べてみれば?
もっとも、VBAでクラスのこと説明してるとこ
あまりないから、JavaとかC#でクラスって
どんなもんかググれば大概出てくるんじゃないかなぁ
VBAのクラスはかなり制限あるし
その辺のこと興味持つようになったらボチボチ
他言語にも手を伸ばす時期だと思うよ
あと、「こんな使い方するんだ」ってのが
知りたければ「デザインパターン」でググってみればいい
これもなんかのヒントにはなるよ Qiita, Zenn, Note, Wantedly、食べチョクなどは、Ruby on Rails。
時価総額100億円ぐらいを目指す、ベンチャー企業がRailsを採用する。
米国では、1兆円超えのShopify, Airbnb, Gitlab などもある
他には、ガーシーが使う、Mastodon はRails 6。
作者のドイツのオイゲン・ロホコは、PHPからRailsに変えた。
Rubyの方が可読性が高いから
米国年収では今の円安で、Rails, AWS Solution Architect などは、2千万円ぐらい。
バックエンド技術者は高い。
AWS, Linux, Docker, Kubernetes、データベースなど学ぶことが多いから
KENTA の天敵・モローは、2年ほど前に、YouTubeで言ってた。
Rubyは滅ぶ。これからはJava・PHPの時代だと
それが今になって急に、Railsのキャリア相談までやり出したw
Java・PHPの仕事は、どうなったの?w
YouTubeのモローの動画。
【2022年版】Ruby on Railsの将来性
KENTAが、PHP, Scala をオワコン認定したから、
PHPのFacebook とか、Laravel を使っているZOZO、
Scalaを使っているTwitter などは、良い開発者を集めるのが大変 >>81
他の全ての大手は普通にPHP・pythonを使っているのに、
「ごく一部の大手」だけがrubyを使っているのが現状
また、ruby信者は頭がおかしくこのような歪な布教活動を行う特徴がある
くれぐれも騙されないように >>76
わかっただろ?統一教会みたいな連中に巻き込まれる >>85
だからそういうこと書くと荒れるって言ってんだろ?
質問来たらちゃんと答えてるんだからほっとけよ >>82
>>87
ありがとう、そういうが風潮あるとは知らず....... >>88
言わねーとずっと続くのがいつもの流れだろ
ほっとくのが主義なら俺にも言うな 言語として最高かどうかは別として
とりあえずjavascript系をやっていればこの先20年は安泰 VBA自体年寄り御用達の言語になっちまった感だからね ラズパイの入門キットが尼で3000円で売ってるからRubyでサンプル動かしてLEDチカチカ楽しいよ
仕事につなげたいなら今はJavaでスマホアプリが一番需要がある
自分のスマホで遊んでもいいし、Windows用のエミュレータも無料で公開されてる ほら、こうやってRuby、Rubyって
ゴキブリそのもの
そもそもRaspberry PiのサンプルはPythonが圧倒的に多い
Rubyとか言ってる連中に近づいてはいけません VBA + Selenium + Chrome で自動ログインをツールを作っています。
Dim Driver As New Selenium.WebDriver
ログインした後にパスワードを保存しますか?
というダイアログが出て邪魔でしょうがないです。
それを削除する為に
credentials_enable_service false
profile.password_manager_enabled false
を使うのは分かったのですが、pythonやjavaのコードばかりブログに乗っていて
VBAの文法でどう書けば良いか分かりません。
詳しい方がいたら教えてください。 >>90
放っておけばっていうのはお前がコントロールしようとしている掲示板の脱線に対してだよ
放っておいても質問があれば勝手に戻るからさ、これ書くの2度目ね
そのことと俺がお前を放っておくのとは意味あいがぜーんぜん違うんだがわかる?まぁ解んなくてもいいけど
あと指図はするけど言われたくないんだよな?
ならその通りにしましょうかね >>96
chromeの起動オプションに書き加える
使うのが自分だけなら手動で事前にchromeの設定を変えておくのが一番簡単 >>98
VBA+Seleniumで起動オプションの書き方はどうやればいいのでしょうか?
C#やPythonやJavaばかりでVBAの表記法が見つかりません。 間違ってrubyを学習してしまい、無駄な時間を過ごしてしまうことが忍びないのはわかる
しかし、「人生には無駄な学習がある」ということに気づくことも大事な事かもしれない
※rubyの学習が無意味ということは、rubyを学習すればすぐに気づく 別にruby推しでもかまわないけど関係ないスレでは自重しろとは思う rubyキチガイが荒らしに来るからヘイトが凄い事になってる
なお他のスレでも同様 GetOpenFilenameで開いたファイルのパスを返すFunctionを作ったのですが、戻り値を変数として利用する度にGetOpenFilenameメソッドが実行されてダイアログが開きます
初回のみダイアログを開くFunctionは作れないもんですかねえ
代替案としてSubプロシ=[ジャとして呼bム出して取得しbスファイルパスbublic変数に試めているのでbキがPublic変数bgうのはなんbゥ気持ち悪くて=c… >>107
Functionの外で保持しておく値なら
Public でなく Dim で宣言すればモジュール内でつかえる >>107
コードも見てないから何とも言えないけど
初回のみって判定なら基本的に変数で管理するしかないと思うけどね
それとGetOpenFilenameがダイアログでファイル名(ファイルパス)を取得するための関数なら関数自体は何もせずに
GetOpenFilenameを2回目以降に呼ばないような変数管理が普通の方法じゃないかと思うよ
publicが気持ち悪いってのは関数や変数のスコープ管理がおかしいからだと思うから
それはそれで見直せばいいのでは >>107
それってsubの中で
cells(1,1)=Function変数
cells(2,1)=Function変数
ってやってるからでしょ?
subの中でtempでも宣言して
temp=Function変数
cells(1,1)=temp
cells(2,1)=temp
ってやればいいんじゃない? 自分で納得できるコードが書けないのは経験が足りないだけかも 自分でそこんところをいろいろ考えてやるのが楽しいのに
どうにでもなるようなことを聞いてる人ってプログラミング=苦痛と感じてるひとなんだろうなぁって思うわ
まぁそれならそれで仕方ないけど >>115
お前が荒らしてるだけじゃん
全然荒れてないわ >>108
こんな感じです。
Public Function OpenedFilePath() As Variant
OpenedFilePath = Application.GetOpenFilename(FileFilter:="ExcelファイルおよびCSVファイル,*.xls*;*.csv")
If OpenedFilePath = False Then
MsgBox "ファイルが選択されませんでした。"
Exit Function
End If
Dim OpenedFileName As String
OpenedFileName = Dir(OpenedFilePath)
Dim Wb As Workbook
For Each Wb In Workbooks
If Wb.Name = OpenedFileName Then
MsgBox "選択したファイルは既に開かれています。ファイルを閉じてやり直してください。"
OpenedFilePath = False
Exit Function
End If
Next Wb
Workbooks.Open OpenedFileName, UpdateLinks:=0
End Function
Function変数「OpenedFilePath」をメインのプロシージャで何度か呼び出すのですが、
そのたびにダイヤログが開くんですよね(まあ当たり前なんですけど)。
やっぱり「OpenedFilePath」をメインのプロシージャの方でローカル変数に格納するしかないですかね。 >>120
変数に入れるのが一般的だけど、どうしてもっていうならFunction全体を「OpenedFilePathが空白だったら」ってIfで囲ったらなんとかならん? 特に理由がない限り1つのプロシージャの機能はなるべく1つに限定したほうがいい
短期的に問題無くても後々機能を使いまわしたくなった時に利便性が悪い >>120
まず「Function変数」なんオレオレ用語は止めなよ、余計混乱する
> Function変数「OpenedFilePath」をメインのプロシージャで何度か呼び出すのですが、
それ何のために呼び出してるんだ?
そもそも関数内でブックをオープンするならオープンしたブックを返してメイン側ではそのブックを使えばいいだけな気がするが...
Public Sub Main()
Dim Book As WorkBook
Set Book = OpenedFilePath()
...
End Sub
Public Function OpenedFilePath() As WorkBook
Dim Path As Variant
Path = Application.GetOpenFilename(FileFilter:="ExcelファイルおよびCSVファイル,*.xls*;*.csv")
If Path = False Then
MsgBox "ファイルが選択されませんでした。"
Set OpenedFilePath = Nothing
Exit Function
End If
Dim OpenedFileName As String
OpenedFileName = Dir(Path)
Dim Wb As Workbook
For Each Wb In Workbooks
If Wb.Name = OpenedFileName Then
MsgBox "選択したファイルは既に開かれています。ファイルを閉じてやり直してください。"
Set OpenedFilePath = Nothing
Exit Function
End If
Next Wb
Set OpenedFilePath = Workbooks.Open(OpenedFileName, UpdateLinks:=0)
End Function GetOpenFilenameでファイル選択しなかったときの返り値は
”false”
ね
FALSE
じゃないよ
糞だよ なんでstaticが出てこないんだよwww
Public Function OpenedFilePath() As String
'引数がtrueなら必ずダイアログを開くっての実装しようとおもったけどやめた
'OpenedFilePathは空白かどうかだけで判定。staticで変数を宣言
Static path
'空白じゃなければ終了
If (path <> "") Then
Exit Function
End If
'本体
path = Application.GetOpenFilename(FileFilter:="ExcelファイルおよびCSVファイル,*.xls*;*.csv")
'開かなかったら終了
If OpenedFilePath = "False" Then
OpenedFilePath = ""
MsgBox "ファイルが選択されませんでした。"
Exit Function
End If
End Function >>125
なんでそんなすぐわかる嘘つくの?
Returns False if the user cancels the dialog box.
https://learn.microsoft.com/en-us/office/vba/api/excel.application.getopenfilename
そもそもその仕様だと false というファイル名を返せないだろ、馬鹿すぎ >>126
> なんでstaticが出てこないんだよwww
そんな汚い設計を勧めたくないから >>127
うわ、ずっと間違えてた。これは申し訳ない
言い訳すると、pathをstringで宣言してる時、booleanのfalseが"false"に変換される
これがあってからずっと文字列が返ってきてると思いこんでいた
これは本当に申し訳ない、間違った情報でドヤッてしまった
Sub foo()
Dim path As String
path = Application.GetOpenFilename()
Debug.Print TypeName(path)
End Sub
>>128
わかる 「Workbooks.Open」のようなコードだけだとActiveBookが変わって
本来操作したいブック以外を参照してしまう事故を防ぐためにも
自分も>>123のようなコードがいいと思うな
あとはVariantはなんにでも使えてしまうから戻り値もWorkbookがいいと思うけど
private変数で宣言するならファンクションである必要もなくなりそうではあるんだが
それは前後の流れ次第かね >>117
楽しい・・・?
そうだね、VBAは弄ってて楽しい言語だね。
何でもお手軽に作れるしグラフィカルな部分が多いから
分かりやすいし。
お手軽と言えばJavaScript もそうかな。
逆にCOBOLとか何が楽しいのか俺には理解出来ない。 >>100
ありがとうございます。
Dim Driver As New Selenium.WebDriver
Driver.AddArgument "credentials_enable_service=False"
Driver.AddArgument "profile.password_manager_enabled=False"
「パスワードを保存しますか?」というダイアログが表示されてしまいます。
このダイアログが邪魔でしょうがないです。
何とか消したいのですが、コード間違っていますか? Driver.SetPreference "credentials_enable_service", False
こうじゃない? >>134
これも試しましたが、ダイアログが起動します、、、
うーん、困りました。
With Driver
.SetPreference "credentials_enable_service", False
.SetPreference "password_manager_enabled", False
.SetPreference "--password-store", basic 最悪、しょうがないので力業でWindows APIで座標指定で「×」をクリックします。 Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("credentials_enable_service", false);
prefs.put("profile.password_manager_enabled", false);
options.setExperimentalOption("prefs", prefs);
Javaだとこうだから
Driver.SetPreference "prefs", ...
にしないといけないのかも >>138
色々と試しましたが、全部ダイアログが出ます、、、
Dim Driver As New Selenium.WebDriver
'パスワードを保存しますか?ダイアログを消す。(消えない)
'Driver.SetCapability "credentials_enable_service", "False"
'Driver.SetCapability "profile.password_manager_enabled", "False"
'Driver.AddArgument "credentials_enable_service=False"
'Driver.AddArgument "profile.password_manager_enabled=False"
With Driver
'.SetPreference "credentials_enable_service", False
'.SetPreference "password_manager_enabled", False
'.SetPreference "--password-store", basic
.Start "chrome"
.Get "https://hogehoge.com/"
End With
'ID
Driver.FindElementById("UserID").SendKeys "IDhoge"
'ID
Driver.FindElementById("UserPASS").SendKeys "PASShoge"
'ログインボタンをクリック
Driver.FindElementById("id_login_button").Click Dim prefs
Set prefs = CreateObject("Selenium.Dictionary")
prefs("credentials_enable_service") = False
prefs("profile.password_manager_enabled") = False
driver.SetPreference "prefs", prefs
これでどう? >>142
ありがとうござます。試しましたがやはダイアログが表示されます、、、 driver.SetPreference "credentials_enable_service", False
Dim profile
Set profile = CreateObject("Selenium.Dictionary")
profile("password_manager_enabled") = False
driver.SetPreference "profile", profile
これでどう? Driver.SetPreference "credentials_enable_service", False
Driver.SetPreference "profile.password_manager_enabled", False
これでできそうな気がする >>144 >>145
ダメでした。
VBA+Seleniumだと色々と制限がありそうですね。
Windows APIで強制クリックしかなさそうですね。 Driver.AddArgument "--password-store=basic"
Driver.SetPreference "credentials_enable_service", False
Driver.SetPreference "profile.password_manager_enabled", False
これでどう? >>147
ダメでした。
ただ、ページ遷移すると自動でダイアログが消えますので
初回ログイン時に出るのは結構目障りですけど、最悪諦めます。 >>148
結果的に消えるならいいじゃん
そこでボタンをクリックしないと動作が止まる、とかだったら困るけど、動けばいいんだよ
てか、オプション設定のタイミングが悪いんじゃないの?Chromeを起動する前に設定してる? >>149
はい、してます。
試しにVBAで同じことを試していただければ100%再現できます。 >>133
マルチポスト、更に言語の違いすらわからない馬鹿は消えろ マルチポストはどうかと思うが少なくともこっちのスレだと言語は合ってるだろ そりゃ母数が全然違うからな
事務員どころか営業でも使う人がいる >>153
これは結構意外な結果。
HTMLとCSSが思ったより低いね。
もっと意外だったのがSQLがランクインしていないこと。
「SQLはプログラミング言語じゃねーだろ」という意見も聞こえそうだけど、
それ言ったらHTMLだってプログラミング言語かと言えば怪しいよね。
iPhoneを開発するOvjective-C辺りはCに含まれるのかな?
でもそう考えるとSwift もランクインされていない。
最近はPython が主流なのかー。
まぁRubyはさして知るべし。 メインの言語がhtmlです!って人はちょっと・・・ よく見るとTypeScriptが追い上げてるなぁ
Web版EXCEL開発しなきゃいけなくなったとき用に少し勉強しておくかな Pythoの何がいいの?C#の方がよっぽどコードが綺麗。 VBAはバリバリ活躍してるけど、VBはもはや枯れた言語か。。 むしろVB(VB.NET以外)がランクインしてるのに驚いたわ
さすがに保守案件なんだろうけど >>159
アホが書いたぐちゃぐちゃインデント見た事ないっしょ
インデントがそのまま機能に繋がるってのは、
もうこれだけでいいんじゃないかってぐらい見やすいんだよ >>153
これ相当歪な集計だぞ
期間は2週間、プログラマーがたったの16%であとは経営者3%なんて混じってる VBAでフォームからセルに入力できるフォームを作るときにテキストボックスとセルをcontrolsauceで連結するのが一般的ですか?
今まで、読みとりボタンで、テキストボックス1=セルの値、更新ボタンで、セルの値=テキストボックス1としてたのですが、controlsauceを使った方がよいのか悩んでます >>162
pythonマジでコードが気持ち悪いんだけど。 使わなきゃいいだけなのにあえて他言語の悪口を言うのはRuby厨か >>163
プログラマー以外がプログラミングしちゃいけないわけじゃないし、別に歪じゃないだろ 歪というか、アンケートの対象はプログラマーのみではなさそうだな
プログラマーなんて社会人の一部だし
この手のはなんかの指標として使えるものではないと自分は思ってる VB.Netは確かにもうMicrosoft からも.NetCoreでは更新しませんよって宣言されてた気もするし、
終わった言語と言えばそうなのかもね。
ま、でも文法こそ違うものの、中身はC#と大して変わらないから、
やるならC#でいいよ。
C#とVBA覚えておけば必然的にVB.Netも書けると思う。 vb.netとc#って
objective-cとswiftみたいなもんじゃね VBA は社員が使っている。一般人・アマチュア。
Linux, Docker, Heroku, AWS などを知っているはずがない。
Windows しか出来ない香具師
一方、Ruby on Rails は、ウェブ開発のプロ用。
ポートフォリオにも使う転職用だから、一般人よりも少なくなる
VBAが出来ても、プロとしては転職できない。
VBAが出来るから、モダンなウェブ開発企業が採用するとは思わない >>169
Pythonにあっという間に追い越され凋落が加速しているRubyざまあ >>174
プロ用wwwwww
つまり金貰えなきゃRubyなんて使わんわ!ということ でもどうだろ?
60歳前後の人はVB通ってきてからVBAを始めた人多いと思うからもっと人口多いと思う。 あー、まぁ旧VB6ならそうかもね
VB.Netは完全にObject指向言語だから
そこからVBAやるってのはキツいんじゃないかな?
まぁその逆はもっとキツいと思うけど そういえばVBなんて言語あったなー(遠い目)
ウチにVBのリファレンス本が埃かぶってある。 旧VBは結構な値段しただろ
使ったことがあるのはプロのプログラマーだけだよ
VBAやVB.NETは素人向け ネットでサンプルコードを漁っていると配列の型を宣言するときに括弧を省いているのが多いけれどなんでだろう
Dim Array As variant
Array = Range(“A1:C10”)
とか
Dim Array as Variant
Array = TempArray
みたいに
括弧無しの方が処理が早いのだろうか
そもそも括弧有り無しの違いってなんなんだろう >>182
vbaの配列、特に静的配列はカスって事を念頭においておいてほしい。
他の言語はここまでめんどくさくない
静的配列は要素数が決まっていて拡張性が無い。
Dim array_a(5) As Long
動的配列は要素数を変動させることができるがめんどくさい
Dim array_a() As Long
これは配列をvariant型の変数に入れてるだけで、配列の型とは関係がない
Dim array_b As Variant
array_b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
array_b = Array(1, 2, 3, 4, 5, 6)
どれが良いかというと、variantに入れておけば大体うまくいく
動的配列や静的配列を使うのもいいけど、めんどくさいだけだよ sub hoge
for i=1 to10
if i=5 then exit sub
next
end sub
サブルーチンのforとかloop中に
判定文でexit forどころか、exit subするのって、マズいんですかね?
メモリ喰っちゃう? >>183
ループを使って配列の要素を一つずつ埋めて行く場合は()付きで配列として宣言しなきゃダメじゃん?
だったら一括代入する場合も()付きで配列として宣言した方がわかりやすいかなあと思うんだよね >>184
特にマズくない
最近は8GBぐらいメモリあるんだし多少食っても全然平気
>>186
vba結構長いこと使ってきたけど、そんなコード書いたことないなぁ
ちょっと分からないわ >>187
たとえば「シートの表を一旦二次元配列に格納して不要な行を取り除いてからシートに転記する」ってコードの場合、次のようになるでしょ?
Dim RawArr As variant
RawArr = Range("A1:E100").Value
Dim EditArr() As Variant
Redim EditArr(1 to Ubound(RawArr ,1), 1 to Ubound(RawArr ,2))
'↑これは括弧付きで配列として宣言しなければならない
Dim R as Long, C As Long, Rcount As Long
Rcount = 1
For R = 1 to Ubound(RawArr ,1)
If Not RawArr(R, 1) = "不要" Then
Rcount = Rcount +1
For C = 1 to Ubound(RawArr ,2)
EditArr(Rcount, C) = RawArr(R, C)
Next C
End If
Next R
Range("A1:E100").Value = EditArr
このコードにおいて「EditArr」を括弧付きで配列として宣言するならば「RawArr」もそれに準じた方がわかりやすいのではと思うんだよね
超細かくて申し訳ないけれど jscriptの配列をそのままvbscriptにしたら
メッチャんこ速くなったからそっちの性能はいいんじゃね? >>188
これってのが
Dim EditArr() As Variant
なら、
Dim EditArr As Variant
でも動いてるようだが?
そのまま走らせたら両方ともそこ以外で実行時エラー出てるけど
さらに言えば、ReDimするなら(Option Explicit onでも)Dimすらなくても動いたような >>188
俺も>>190と同じく
Dim EditArr() As Variant
Redim EditArr(1 to Ubound(RawArr ,1), 1 to Ubound(RawArr ,2))
だろうが
Dim EditArr As Variant
Redim EditArr(1 to Ubound(RawArr ,1), 1 to Ubound(RawArr ,2))
だろうが同じって認識だわ
動的配列っていうのをわかりやすくするために()つけておくか、くらいの感じだと思ってる >>184
別にマズくはないよ。
メモリ使ってたとしても使ってる変数が
みんなPrivateのものなら関数抜けた時点で解放されるし 【速報】上司「お前のことはExcelの印刷くらい信用している」→パワハラ
広告代理店・電報堂(本社・東京都足立区)に勤務する50代の部長が20代の部下にパワハラを繰り返し、
部下をうつによる休職に追い込んだとして民事訴訟を起こされていたことが22日分かった。
訴状によると部長は部下に対し日頃から「お前のことはExcelの印刷と同じくらい信用している」
という発言を繰り返しており、その結果「どれだけ仕事をしても信用が得られない」
と感じた部下は今年5月からうつの症状を発症するようになり、現在は休職しているという。
なお上司は取材に対し「信用していると言っただけなのになぜパワハラ扱いされるのか理解できない」
と述べた。
https://kizuna.5ch.net/test/read.cgi/curry/1663509806/ まあ言い方だろうな
Excelの印刷はたまに端や上下が切れたりするけどちゃんと手当てしてやればそこそこ使える
ワードなんかと違ってレイアウトを崩さずにページに収めるとか使える機能もあるしな 兄が元刑務官だけど、昔に比べればブタ箱の飯はだいぶ香ばしい匂いになったみたいだよw スタンフォード監獄実験で普通の人でもそういう仕事につくと凶暴になる実験あったな >>207
実はアレはヤラセだったと関係者が暴露してる 神様たち
エクセルVBAで関数内関数を作りたいのですがやり方教えてください 「作れない」と「作る意味ない」は違くないか
>>209
つくれないので別の方法を検討しましょう 作る意味があるケースもあるけど現状作れないし作れるようになりそうもないから議論してもしょうがない、はい次の方~ 他の言語でやってるとね~やっぱ欲しいなって思う場面が出てくるんだよね~
別にテクニカルな事をしたいわけじゃないのよ~ まぁ一つ言えばこの一連の流れで>>211は頭一つ抜けて無能だね~ >>214
やりたい理由なんていろんなケースであるからそれをいってもしかたないでしょう
自分だって他言語では使う事もあるしね 神様達、ありがとうございました
無いと分かればそれはそれですっきりです >>220
いや、無理無理
黙ってられない年寄りばかりだから。 神様達、よろしくお願いします
classモジュール変数に、public で配列を置きたいのですが
配列は、オブジェクトモジュールのパブリックメンバーとして利用できません
と怒られました
クラスをnewして、メンバーとして配列にアクセスする方法はありませんか?
例)=================================
標準モジュール
dim cls as Class1
set cls = new Class1
debug.print(cls.ar(0)) <---こう呼び出したい
=============================
クラスモジュール
public ar() as variant
private sub Class_Inisialize()
ar(0)="xxx"
end sub 神様たち、すみませんでした。解決できました。ごめんなさい >>218
出来ないことはないが
VBAでは過去の遺物、負の遺産として
使用が暗黙的に禁止されている。
どうしても使いたければ
VBA GOSUBでググれ それサブルーチンだし関数内関数っていっていいの?
引数も渡せないでしょ GOSUBはミートソースでも食べられないと教わりました > VBA GOSUBでググれ
全米がずっこけたわ
もう老害はこう言うのでマウント取るしかないんだな... 知ってる?
マウント取ってくるのは大抵年寄りだぞ
何故ならば体が思うように動かないからやたら口達者になるから。 そもそもこれマウントでもなんでもなく単に間違えてるだけでしょ GOSUBでも似たようなことできるけど○○できないとか制限あるよっていえばいいのに
最初の4行なんて余計でしょもったいぶって言う割には回答がおかしすぎて
マウントとかそういうレベルでもない 高階関数のことならVBA関数では不可
ワークシート関数であればLAMBDA(とLET) >>232
君、韓国人みたいな発言してるよ
気をつけたほうが良いと思う アドバイス頂けただけありがたいです。
神様皆様ありがとうございます
マクロの記録なのですが、
マクロ記録→検索→全部→マクロ記録終了
そしてマクロを選択して編集すると
Macro
と書かれているだけでマクロが記録できません
記録してどんなワークシート関数を使っているのかみたいのですが
何か必要な設定があるのでしょうか?
現在excel2019を使っています >>236
class.propertyみたいな呼び出し方で
配列や、インスタンス代入変数を参照できたらいいなって思ったんです
function やsubを直接参照するのが気持ちよくなくて >>238
vbaは化石だから色々と諦めるしかない >>235
それ、朝鮮総連のマニュアルだよ。
「あなたは朝鮮人の可能性があると言って相手の反応を見ましょう」 >>224
それ、ちょっと思いついてネタ的に作ってみようかと思ったが
そもそもブロックレベルのスコープもたないVBAでやると大変なことになるだけだったわ >>232
回答もできず
できることで負けてるから若さで勝ち誇りたいプライドもかわいそうだな
そのまま年取るなよ
>>242
ある程度まとまったコードを例えば分岐のいくつかでやりたいとかの場合は有効かもしれんけどね >>238
Class内にDictionaryなりCollectionなりをSetしておいてItemをため込み、
Property Getで取得することはできそうな気がする。。。
ごめん、検証してないし希望とは違うかもしれんけど。 複数行にまとめてVLOOKUP関数を埋め込みたいのでFormulaR1C1プロパティを使っているのですが、マジックナンバーを避けるために検索範囲や列番号を変数で表現すると一行がやたら長くなってしまいます
出来るだけ簡潔に書きたいのですが、何かいい方法はありませんかねえ >>245
やたら長いとやらを貼らないと意味が分からない >>245
長くなるというのがどういう状況かわからんけど、範囲をテーブル化して
構造化参照するとかListobjectで指定するとかは? >>249
あーテーブル嫌がる人けっこう多いよねーw
>>245の件としてレスするけど、テーブル書式設定をクリアしてテーブルっぽく見せないってごまかしは置いてくとしてw
変数って書いてるからVBAコード内での一行なのだろうと仮定して、変数にすると長くなるのであれば変数名を短くするしかないかと。
多少なりともわかりやすくというなら列番号はEnum定義しておくとか。そのくらいかな。
的外れなレスだったらごめんね。 構造化参照も理解できない方たちが事務やってるの多いもんな
変数てLET関数のことかな
VBAの変数名の付け方が参考になるんじゃないか
むしろVBAだと変数名は少し長くなっても後から理解できるようにしておくというのが多いけど >>240
新旧の互換性を維持する系の言語は
いろいろ個性が強くなりますので
できないことはできないで教えていただけてすっきりです
>>244
アドバイスありがとうございます
クラスモジュール内のプロシージャーをすべてprivateにして
各プロシージャーの処理結果をモジュール変数の参照のようにしたいのです
そうすれば多少は依存性が解消できて見通しよくなるような気がしてます
何かいい方法ないでしょうか? >>239
ありがとうございます
何か自分の設定がおかしいのかもしれません
調べてみます 嫌いどころかデータ蓄積の入力用シートすら作ってない不思議な人達ばかりよ現場は。
ひとつの表で完結させようとしている。
良くそれで仕事を完遂できるなと すみません
凄く基本的なマクロの質問になると思いますが質問させてください
シート2のA2からA列の最終行までの値をコピーして
シート1のB3に貼り付けをしたいのですがどうしたらいいでしょうか?
範囲を最終行に応じて自動的に変化させたいです
他にもB2から最終行まで、D3から最終行までとするにはどうしたら良いでしょうか? >>252
クラス内のプロシージャを全てPrivateにして外部のモジュールから参照するのはしようと思えば出来る。 >>256
VBA 最終行 でググれ
https://www.excel-ubara.com/excelvba1/EXCELVBA318.html
> シート2のA2からA列の最終行
なら
With Worksheets("シート2")
LastRow =.Cells(.Rows.Count, "A").End(xlUp).Row
End With >>256
クリップボード経由しないならこんな感じじゃない
Dim iLastRow As Long
iLastRow = Worksheets("Sheet2").Range("A1").SpecialCells(xlLastCell).Row
Worksheets("Sheet1").Range("B1:B" & CStr(iRow - 1)).Value = Worksheets("Sheet2").Range("A2:A" & CStr(iLastRow)).Value
ちなみに代入元と代入先の行数を合わせる必要があるからそこは必要に応じて書き換えてね >>257
dim cls as class1
set cls =new class1
cls.arry(0)
cls.dictionary("x")
みたいなことできますか?
プログラムはかなりできあがってきたんですが
出来るようなら書き換えたいです 神様の皆様、よろしくお願いします
動的配列を使って要素を追加するケースで質問です
dim ar() as variant
redim ar(0)
for i=0 to 9
ar(i)=i
redim preserve ar(ubound(ar)+1)
next
redim preserve ar(ubound(ar)-1) // A
A部分はar(10)を削除しようとして記述しています
この記述は、ar配列の最終要素を削除する動作を保証しているのでしょうか?
それとも何かの影響でarの最終要素以外の要素を削除することはあるのでしょうか? >>261
VBE上でローカルウィンドウを出してF8を繰り返し押せば確認できるよ >>261
自分でシミュレーションしてみ
' i = 9 から...
ar(i)=i ' ar(9)=9
redim preserve ar(ubound(ar)+1) ' redim preserve ar(9+1)
redim preserve ar(ubound(ar)-1) ' redim preserve ar(10-1) >>258-259
ありがとうございます
凄く助かります >>262
>>263
ありがとうございます
例えば1万回は最終要素を削除できたけれど
10億回すると削除されない、もしくは最終要素以外を削除してしまう
という挙動はあり得ないのでしょうか?
言い換えてると
vbaの仕様として、ubound(ar)は配列の最終要素を参照しており
ubound(ar)-1は、最終要素の1つ手前を参照することを保証していると考えていいでしょうか? >>265
良い。問題無い。
保証されないのはforeach
あれは順番が変わる事があるので、foreachで同じ事をやるのは絶対にNG 請求書をつくるとき取引先ごとの売上をいれてるシートをピボットテーブルで日付ごとに合算してそれをコピペして請求書シートに貼ってるんですが
これをうまい具合に自動化することはできませんか? ピボットテーブルの特定セルを参照する関数なかったっけ? >>267
取引先ごとの売上をいれてるシートをピボットテーブルで日付ごとに合算してそれをコピペして請求書シートに貼ってる
↓
請求書シートの所定の場所に、ピボットテーブルを表示させる
でいいんじゃないの?
取引先や日付範囲でフィルタすれば全自動になると思う >>270
そのまま別のデータをコピペすることもあるので
ピボットテーブル直接表示させたらズレませんか? >>271
どうズレるかはよく分からんけど・・・
ズレるのが怖いなら、
単純に参照すれば良い。黄色の部分は本当にシンプルな式だけで良いと思う
https://i.imgur.com/rwpq1hu.png >>267
ピボットテーブルのフィルターに「取引先」を設定して
コピペするときにリンク貼り付けすれば
後はフィルターを切り替えるだけじゃないだろうか >>266
ありがとうございました
これでUboundを業務で使えます
これからもご指導よろしくお願いします >>272
>>273
いずれもコピーは必要なんですね
ここに貼り付ける、ときたら
勝手に集計したのを貼ってくれといいのですけど
ちなみに零細で月に10枚程度しか請求書ださないとこは
ExcelのなんちゃってDBで十分ですかね?
フリーSQLも含めACCESSやファイルメーカーもたかってみたがデータの柔軟性がなさすぎて困った
これとこれをグループ化とかも簡単にできないし >>275
>ちなみに零細で月に10枚程度しか請求書ださないとこは
>ExcelのなんちゃってDBで十分ですかね?
じゃなくて、成長率
毎年の成長率が高い企業は、本当に気をつけたほうがいい
>フリーSQLも含めACCESSやファイルメーカーもたかってみたがデータの柔軟性がなさすぎて困った
Excelがおかしな事をしているだけなんだよ
それがたまたま日本の零細~中小に合致しているだけ >>276
ファイルメーカーつかってたが
レコードを日付でまとめて一覧ししてレポートだす機能もないんだよ… 外部からインポートもコピペではできないし
テーブルを全く計算も不得意ときてる 今どきはフリークラウドの管理ソフト(販売系、経理系、労務系)のサービスが山ほどあるでしょ
提供会社が無償提供やめたり、提供自体やめると面倒だけど
データ移行性を確保できるのならそっち方法がいい >>246
一例をそのまま貼ると、こんな感じです。
Dim VLOOKUP商品名 As String
VLOOKUP商品名 = "=VLOOKUP(RC" & eCols_明細.得意先コード & "," & WsName得意先テーブル & "!R" & eRows_通常.開始行 & "C" & eCols_得意先テーブル.得意先コード & ":R" & EndRow得意先テーブル & "C" & eCount_得意先テーブル & "," & eCols_得意先テーブル.得意先名 & "," & 完全一致 & ")"
めちゃくちゃ長くて可読性が悪いなと…… 変数に代入している際の話なら
VLOOKUP商品名 = ""
VLOOKUP商品名 = VLOOKUP商品名 & "AAA"
VLOOKUP商品名 = VLOOKUP商品名 & "BBB"
VLOOKUP商品名 = VLOOKUP商品名 & "CCC"
とかきりのいいところで分割して代入すればいいんじゃない? >>282
それ自力で展開できないようじゃやばいよ >>283
一応テーブルを参照する部分(VLOOKUP関数の参照範囲の箇所)を変数に代入することで少しは可読性があがったのですが、そもそも複数行へのVLOOKUP関数の埋込みをFormulaR1C1プロパティを使わなくても出来ないものなのかなあ、と思いまして
>>284
「展開」とは? >>267
「GROUP BY 複数条件」じゃないの?
GROUP BY 取引先, 日付 >>285
「そもそも複数行へのVLOOKUP関数の埋込みをFormulaR1C1プロパティを使わなくても出来ないものなのかなあ」ってのがよくわからん
どんな機能を使おうが、セルに代入したいなら必ず一度はコードに記載しなきゃいけないんだから「eCols_明細.得意先コード」とかの変数名を短くするくらいしかないでしょ >>282
VBAからvlookup関数を埋め込んだことが無いので処理のイメージがつかめないんだけど、
今やろうとしていることはvlookup関数の字面を文字列を繋げて作り上げようとしてる感じなのかな?
そもそもVlookup関数の構文は VLOOKUP(検索値, 範囲, 列番号, 検索の型)なのだから変数を使うのであれば
検索値や範囲を変数に格納して繋げれば良いのでは? 例えば,,,
Dim val as String: val="値"
Dim rng as Range: set rng = range(”A1”,"B10")
Dim col as long: col = 2
Dim FormulaStr as string
FormulaStr = "=VLOOKUP(" & val & "," & rng.Address & "," & col & ", false)"
みたいな感じ? 値や範囲をセルによって可変にしたいなら変数に格納する値を変えればいいわけだし。。。
こういうことじゃないのかな? そもそも数式をVBAで入力することってあんまりないよな >>289
そうですねぇ、あんまりないですね。
経験としては、計算式があるのにどうしても直打ちされて消されてしまうシートに
ボタン一発で計算式を復旧させる機能を付けた時くらいですかねw やっぱりVlookやsumifみたいな
組み込み関数のほうが、普通にコードするより速く強力なんでしょうか? >>291
Excelに備わっている関数は強力だと思うし使い勝手が良かったりするものもありますね。
私の場合はcountifやmatch、max、minあたりはVBA上でもWorksheetfunctionからよく使います。 >>291
かなり最適化されてるしマルチスレッドで動作するから同じ処理ならVBAより相当速い >>275
零細だったらそれこそappsheetでもいいんじゃないですか? 関数を直接入力するとその後にシートに何かしら入力するたびに再計算されるから面倒だわ
その再計算が気にならないってんならvbaで処理しても気にならないレベルでしょ
countifなんか特に再計算に3分とかかかる場合もあるし >>296
ピボットあたりにしてみては?
coutif遅いよ >>297
意味が分かりにくくてすまん
だから関数を直接セルに入力するようなことはせずに、vbaでworksheetFunctionとかDictionaryとか使って結果だけを出力するなって意味
vbaで関数を入力するのは引き継ぎとか他人に渡すのを想定したときくらいかな 2行目もよくわからんし
VBAで関数を入力とかイミフなんだが Application.Calculation = xlCalculationManual はとりあえず書いとくでしょ >>300
昔書いてたけど、最近はほとんど書いてないな
PCスペックが大幅に向上し、負荷のないコードが自然に掛けるようになった 演算処理能力、メモリ容量、基盤の伝送量と速度が大幅に向上し
組み込み関数による処理、VBA関数による処理などの差によるメモリ効率、処理速度を考えず
組み込み関数に依存しないコーディングを書けるようになった
言い換えると3行になるな
メモリ効率を悪化させてしまった >>304
関数が入っているセルを参照するようなコードの場合
例えばCells(4, 3)にCells(3, 3)の値を10倍するような関数が入っているとして
Cells(3, 3).Value = 40
Debug.Print Cells(4, 3).Value
とやった場合、自動になっていればCells(4, 3)は400になった値が参照できて
手動ならもともと入っている値が参照できるという状態でしょ
スペックが向上、負荷のないコードだから書かないというのは危険な考えでは >>308
再計算に左右されるコードを書く事がそもそもおかしいんですわ 配列がらみのFunctionを作ったときにメモリを空けようと「一時的な配列」を初期化しているのだけれどもしかしてあんまり意味ない?
たとえばこのように↓
Function 戻り値配列 (引数)As Variant
Dim TempArr As Variant
(……何らかの処理)
戻り値配列 = TempArr
Erase TempArr ← これ
End Function
同じ要領で“TempDic”をRemove allしたら戻り値の連想配列も空になっちゃったけどこれはなんでなんだろう >>310
function抜けたらメモリ勝手に空くから特に意味はない
それに今は潤沢にメモリあるから、メモリの空き容量なんて気にしなくていいよ >>309
なるほど
こういう回答するやつとは通じ合えないのがわかったわw
しかも>>311の回答も適当だしな >>312
vbaって配列の要素に変数を入れ込んでから配列を初期化すると、
要素変数への参照は切れるけれどメモリ領域は解放されないのでは?
それともvbaって配列要素への参照切れで割りあてたメモリを開放するの? とりあえず「Erase」を書くのはあんまり意味無いっぽいんでやめます >>310
> 同じ要領で“TempDic”をRemove allしたら戻り値の連想配列も空になっちゃったけどこれはなんでなんだろう
そりゃ参照を返してるだけで実体は一個しかないからRemoveAllしたら消えるよ
その後 TempDic を使わない事を明示したいなら
Set TempDic = Nothing
でもしとけばいいけどまあ関数抜けたら TempDic はなくなっちゃうんだから気にしなくていいと思うよ まぁでも関数やメソッド抜けるまでは保持し続けるから単一責任原則を守ったコードに慣れるまでは
使い終わったらさっさと解放することに越したことはないよ。
最近当たったんだけどボタンを押して呼んだ関数の中で数万のインスタンスを生成する処理があって、
完了メッセージを出した後もその関数抜けるときにメモリを解放しているもんだから暫く待たされるという残念なコードを見てる。
生成した後のごちゃごちゃした処理は別関数でやってたのに実に残念なツールになってたよ。 意識高い系のVBA使いとか生きるの辛そうだな
プログラミング界ではそもそもVBAな時点でみんな半端者扱いなんだから気楽にやろうぜ vbaを使ってて0.01秒早くしてどうすんだ?って思うときはある >>318
> まぁでも関数やメソッド抜けるまでは保持し続けるから単一責任原則を守ったコードに慣れるまでは
> 使い終わったらさっさと解放することに越したことはないよ。
呼び出し元に返す話に何を言ってるんだ? ならやっぱり配列要素がプリミティブでなければ
要素そのものを解放しないと
配列だけ初期化する意味なんてあるの? というか、vbaには参照切れで自動的にメモリ開放する機能がないってことなのか >>322
例えば配列にループしてインスタンスを設定するとして、そのループの中でひとつの変数にNewしてインスタンスを作成して、
そのインスタンスを配列に設定した場合、前回のループで設定したインスタンスは配列の内容が削除されれば、他に参照しているところがない限りメモリから解放されるよ。 >>323
ガベージコレクションね
無いよ
逆に参照が合った時に初めてnewされるよ >>322
配列の話じゃねーから絡んできて頓珍漢なこというのはやめてくれ
> 同じ要領で“TempDic”をRemove allしたら戻り値の連想配列も空になっちゃったけどこれはなんでなんだろう >>326
それは済まなかった
でもそんなにイライラするなよ
ハゲが止まらなくばるぞ >>330
いやわたしはハゲちゃおらんよ。
君みたいなハーゲマンと一緒にしないでくれ。 クエリA
UNION ALL
クエリB
→文字化け
クエリB
UNION ALL
クエリA
→正常
なんでやねん!
何で上下入れ替えると直る?
因みに、文字化けする方も文字列型にすると化けないので、
文字コードの問題ではない。 神様皆様おはようございます
神様たちのお導きで50万行*80列のデータから
所望のデータを抽出できました
ありがとうございました! OneDriveで自動保存設定してるブックに手動保存するときだけbeforesaveイベントする方法はある? >>336
CSV
schema.iniも使ってる。 >>339
SELECT句の中にアスタリスク使ってない?
UNION句で挙動がおかしくなるのはCSVファイルじゃなくてEXCELのシートにSQL投げたときに起こるのも見たことあるけど
まぁそもそもDBに投げてる訳じゃないからある程度は仕方ないってところもあるよ。
CSVファイルはUTF-8かSJISかってのもあるけど
UNION句の上下入れ替えたら直ったというのであれば今回は関係なさそうだしね。 >>340
アスタリスクは使ってるけど、
A.* ってテーブルは指定してる。
入れ替えで直るから、
今困っているわけじゃないけど、
これから先使うの不安だわ。 >>338
Ruby on Rails では、before_action, after_action, around_action で、コールバックできる
before_save :a, only: [:new :edit]
after_save :b, except: [:new :edit]
onlyで、new, editが呼ばれる前にだけ、aを実行する。
逆にexceptでは、new, editが呼ばれなかった後にだけ、bを実行する サーバーにあるフォルダからPDFを検索したいのに上手くいかない
検索はかけても何もヒットしない…
どこか修正するとこありますか?
テキストボックスに入力して検索
検索結果をリストボックスに表示します
Private Sub CommandButton1_Click()
Const BASE_PATH = "\\L\設計\図面"
Dim myPath As String, myName As String
Dim FSO As Object, oFolder As Object, oSubFolder As Object, oFile As Object
On Error Resume Next
If TextBox1.Value = ""Then Exit Sub
ListBox1.Clear
Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(BASE_PATH)
For Each oSubFolder In oFolder.SubFolders
For Each oFile In oSubFolder.Files
If LCase(oFile.Name) Like LCase(TextBox1.Value) &"*.pdf"Then
Debug.Print oFile.Path
myPath = oFile.ParentFolder &"\"myName = oFile.Name
ListBox1.AddItem myName
ListBox1.List(ListBox1.ListCount - 1, 1) = myPath
End If
Next
Next
Set FSO = Nothing
End Sub if文の文字列比較条件でワイルドカードが使えたらいいよね >>348
とりあえず
For Each oFile In oSubFolder.Files
Debug.Print "Debug:" "& oFile.Name
If LCase(oFile.Name) Like LCase(TextBox1.Value) &"*.pdf"Then
としてまずファイルがあるのか確認しなよ
あとデバッグ中は
On Error Resume Next
をコメントアウトしといた方がいい
予想外のエラーを握り潰されて(当人にとっては)意味不明な挙動になることあるから 請求書の原紙となるsheetをコピーして、そこに配列に格納した請求情報を貼り付けるという作業を約100回繰り返したいのですが、
①先に約100回のsheetのコピーを済ませて、生成されたsheets間をループして請求情報を貼り付ける
②sheetのコピー→請求情報の貼付けを約100回ループする
どちらの処理が早いのでしょうか シートがクソ重かったりPCがクソ貧弱だったりするなら、
②の方がブックが小さい状態で貼り付けの処理ができるから安定して動くだろうね >>357
後にまとめて印刷して突き合わせを行うため、請求書のシートの順番を配列の要素の順番と同じようにしなければなりません
よって②の場合は、配列の値を貼り付けた後に(配列の添字が 1 から始まるため) “Copy After := Worksheets( i )” を記述することになります
つまりシートをコピーする度にシート数をループ変数から取得する処理の繰り返しになるのですが(①だと “Copy After := Worksheets( 1 )” でもよい)、それでも②の方が安定しているのでしょうか 請求書ってそんな適当に作ったマクロで請求していいものなのか >>360
私がマクロを作る前は手書きで請求書を書いてエクセルに抽出した請求データと目視で突合していたんですよ(現在は自作した請求書を自動発行するマクロをスピードアップを目的に改修しているところです)
そういう会社もあるんです iはWorksheets.Countあたりを使えばいいんじゃないの?
ただ100件程度なんてせいぜい数分でしょ
今までの時間に比べたらどっちでもいいんじゃないの ただそういうモノづくりをしてる自分からしたら
かりにある得意先の請求書のみ間違えていて修正したい場合①②どちらも最初から作り直すような感じに見えるけど
そうすると他の請求書にも影響あたえるような作りに見えるんだよね
なのでそういうのを作る場合は得意先コード的なものを最初に指定してその範囲の請求書を作る
かりに修正したい得意先があればそれだけを指定すればいいみたいな作りにするけどね >>362
Worksheets.Count はなおさら遅いのではないでしょうか? シートのカウントを約100回繰り返すので
些末なこだわりと言われればそのとおりなんですが、どうせ改修するなら細かいところまでこだわった方がスッキリすると思いまして
>>363
指定した得意先の請求書のみを発行するコードも別のモジュールに書いてあります
メインは請求データの照合及び修正を行った後に約100件分をまとめて発行するフローでないと時間がかかってやってられないんです それならまずシートを100作るだけのコード書いて試せば済むことじゃないの?
よくわからないけど通常と指定可能な請求書作成が別のコードになってるんだとするとメンテのコストが2倍になるのかなと思わなくもないね
まあ他人の作るものだから余計なお世話だけどね >>365
確かに自分で三通りの方法をテストしてみれば済む話なんですが、もしかして私が挙げた処理はよくあるパターンであって一般解が確立されているのかなと思い、質問させていただきました たかが100回で差が出るわけ無いじゃんというレス付いてるだろ
それが一般解 >>348
If LCase(oFile.Name) Like LCase(TextBox1.Value)&"*.pdf" Then
この部分、頭にもアスタリスクをつけてみたら?
If LCase(oFile.Name) Like “*”&LCase(TextBox1.Value)&"*.pdf" Then 100回やって差なんか0.1秒もないだろ
その0.1秒を縮めるのに何分無駄にしてんだよ
どっちでもいいような事に無駄に時間を費やすのは無能のやることだぞ リファクタリングの基準ってどれぐらい?
さすがに30分は当然なにかしらすると思うけど、
30秒ぐらいってどうするもんだろう。頑張って最適化するか、それとも待つか アンケート禁止にしないか?
集計できるほど人いないし 自社の開発時のルールで決めてるんじゃないの?
適当ですとかならいい会社だね
単なるツールなら適当でいいんじゃない みんなプロなのか
私的に使ってる俺は処理が長いと感じたときとか、作って眺めたコードがクソ汚いかったときとかにする >>372
しないよ
>>373-375
thx
その時の気分とか空いてる時間があるとか、
業務に支障がない限りはそんなもんよね >>375
本職も多いよここ
即答できる人もいる理由はそこ ソートがうまくいきません。
今まで下のコードでちゃんとソートできていたのですが、別のブックで同じコードを使ってもソートしてくれません。
原因がわかる方いらしたら教えてください。
Call Range(Cells(i, 1), Cells(i, 6)).Sort(Cells(i, 1)) >>381
callで呼んでるのが変。むしろそんな書き方が出来るのか!と新しい発見レベル
sortの書き方が古い。2003以前とかの書き方だったような気がする
Sub aaa()
Range(Cells(2, 1), Cells(6, 2)).Sort Key1:=Cells(1, 1)
End Sub
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.sort 戻り値が必要ない呼び出しするならcallでもいいでしょ
ただし引数指定する時にカッコでくくる必要がある
自分のところでもソートされない現象が再現するんだけど、なぜか一度ソートすると次回以降はソートされるようになるね
ちなみにこんな感じに修正すればソートされるようにならない?
Call Range(Cells(i, 1), Cells(i, 6)).Sort(key1:=Cells(i, 1), Orientation:=xlSortRows)
・「key1:=」をつける
・「, Orientation:=xlSortRows」をつける >>382
このやり方で無事できました。ありがとうございました。
>>383
このやり方も試しましたが、できませんでした。
やっぱりcallは使わない方がいいんでしょうか。
拾ったコードをよくわからずに使っていました。 え?VBA本職の人がこのスレにいたような??
過去スレで見たような そんな訳ないじゃん
本職が初級者みたいな質問するわけないし。 ネット検索で出てきたコードを参考にして、あるシートから別のシートへ PageSetup オブジェクトのプロパティを引き継ぐ汎用コードを作ったのですが、 Application.printcommunication を触ると何故か処理がコケてしまいます
別のコード(プロパティの順番や数が違う)を試してみると Application.printcommunication = True のところで 1004 エラーが
調べてみると Application.printcommunication は法則性のないエラーを吐くことが多いらしいんですが、上手く安定して動作させる方法はないでしょうか
なお Application.printcommunication の操作を省くと重すぎて使い物になりません VBAが本職ではないけど
他言語を含めてプログラマーってことなら
意外と本職の人いそう VBA で金貰ってる(=給料の一部)と言うだけならかなり多くの会社員が該当しそう >>392
解決方法じゃなくてすまんけど。
trueを設定してこけるということはその前にfalseを設定してるのだと思うけど、
falseとtrueの間の処理でなんの設定を変更するとこけるのかを地道に探し出すしかないような気がする。
プリンタ関係だとページ設定あたりかと思うけど思わぬところが影響してることもあるし、プリンタ環境は千差万別だしね。 >>392
マクロの記録で実際に設定したい値をまずは取得してみて
そのコードをそのまま使ってみてもエラーになるわけ? >>392,398
ちょっと気になって試したけど、それ、ほんとは
.Zoom = False の行でエラーになってるな
ステップ実行させてみればそこでちゃんとエラーになるんだが
普通に実行させるとそこでそのエラーが発生しないで、
PrintCommunicationで予期せぬエラーとなってるんじゃないか
(うちの環境では順番入れ替えて同じだった)
VBAのバグっぽいしマイクロソフトに問い合わせるのがよさげだが
一度ステップ実行で1行ずつ試してみれば? そのブログのコードは拡大縮小の部分についてみたいだけど
通常であれば有効にする動作を書くようなコードが必要なのに無効にするようなコードを書くから
当該エラーがでてるような感じにも見えるけどね
実際にエラーになる「.Zoom = False」を「.Zoom = 150」の様に修正するとエラーはでなくなるから
そういう書き方を心掛けないとだめなんじゃないかと思うわ
なので自分としては実際に設定したいページレイアウトをマクロの記録で取得してみたらといっている >>400
なるほど。
そうなると.PrintCommunicationが認識出来ないプロパティがいくつかあるのかもしれないね。
ステップだとその時々で確認しにいくけど走らせるとPrintCommunication=trueで一括設定しようとするからそこでエラーって感じかな?
1004エラーってコードに不備があるときに出る印象があったから個人的に納得。
なんか参考になった。試してくれてありがと。
いや質問者じゃないんだけどw >>401
ああ、それもそうだね。
『ズームを有効にするか無効にするか』
じゃなくて
『拡大縮小率をどのくらいにするか』
を具体的に指定するプロパティなら確かにその通りだわw A1の数字が10以上で、B1の文字がたた、なな、はは、まま、やや、ららが含まれている場合に、D1にプレゼントと書きたいんですけど、どういうvbaか教えて頂きたいです。
B1の候補が50個以上あって、COUNTIFとかで全部入れるのが大変なんです…
A列B列には、それぞれ100行くらいあります。 馬鹿って仕様すらまともに書けないから馬鹿なんだよな その候補を別のシートに並べればワークシート関数で一発では 特定のフォルダにある一番新しいファイルを
開いて、内容をクリップボードにコピーした
いのですが、どう書いたらいいですか?
その後DBアプリで処理する流れです。 ファイルをそのまま変換してdbに読み込ませればいいだろ
馬鹿って仕様すらまともに考えられないから馬鹿なんだよな バカっていう方も悪いけど、それに対して韓国人呼ばわりはさすがにひどすぎると思う
いくら何でも言いすぎだろ >>407
動かしてないからタイポとかあるかも
Dim FS As Object
Set FS = CreateObject("Scripting.FileSystemObject")
Dim Newest As Object
Set Newest = Nothing
Dim File As Object
For Each File In FS.GetFolder("特定のフォルダ").Files
If Newest Is Nothing Then
Set Newest = File
ElseIf Newest.DateLastModified < File.DateLastModified Then
Set Newest = File
End If
Next
Dim S As Object
Set S = Newest.OpenAsTextStream(1, -2)
With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText S.ReadAll
.PutInClipboard
End With
S.Close
Bug: ファイルが存在しない時はエラーになります
Bug: 一番新しいファイルが複数あるとどれが開かれるかはわからない お前らすぐバカバカって言うけど、人を見下せるほど大した人間なのか? スキルと人間性は別なんだなあ
優秀な人間の性格がひどいとか割とよくある話
競争社会では他人を蹴落とさないと上に行けないし >>413
人間性が最低ってことやね
スキルがあっても敬遠したいな 人間性よかったらこんなとこいないで普通の生活で満ち足りるやろしな 他人に馬鹿と指摘するのは事実だから仕方ない
本当のことを指摘されて何が問題なのか
己が馬鹿と指摘されると怒るのは本物の馬鹿 本当の事だから言っているだけ
はいはい、そういう理屈ね?
もし逆の立場だったら不快な気分にならないのかな?? いまさらなんだが・・・
もしかして、件数がそれなりにあるエクセル処理の場合、VBAでDictionary処理できるやつは、いちどDictionaryにデータ格納してから処理したほうが圧倒的に速い? 何をやるかによるだろう
前から順に処理するだけならDictionaryへの格納は余計なオーバーヘッドでしかなく、確実に遅くなる 回答が付くまでの間は別の作業をしてるんだよ
トータルの作業時間は丸投げのが短い >>424
それなら処理が遅くても別の作業してればいい 俺はdictionaryが好きでよく使うなあ
「ソートキーを格納したdictionaryを受け取って任意のシートをソートするコード」とか、「キーワードを格納したdictionaryを受け取って任意の配列からそのワード以外の要素を取り除くコード」とか、そういう汎用モジュールを作りまくってる
「その引数、配列でよくね?」って自分でも思うのだけれど、なんとなくdictionaryにしちゃう >>428
それって文字列をオブジェクトに変換するとかできるの? ソートならキーの順番は大事だろ
もしかして
1:いち、2:にい、3:さん
みたいなヤバイことしてるの? >>429
?
なんで文字列をオブジェクトに変換する必要があるの?
普通に考えてエンティティクラス作って
その中に内部変数として持っておいて
プロパティとしてやり取りするのが定石でしょ? >>431
で、どうやってキーの順序保証してるの? 8万行×100列(うち、実際に使用するのは15列程度)のデータを
集計表に沿って集計しようとしてるんだけど君らならどういう手法使う?
集計の行は不定で列は日付とし、エラーは別シートに抽出する
データを配列格納してfor nextで回したらすげー時間かかったわ
大人しくピボット作った方がいい? >>435
fornextで何やるかによるけど、
ピボットが一番楽だと思う >>436
やはりピボットかぁ
俺、VBAでピボットとテーブルを制御するの苦手なんだよねえ
ちょっと練習するわ
>>437
私はPythonを使えぬのだ!
勉強してみたいけどね >>439
vbaとピボットの組み合わせが結構めんどくさいのは同意だけど、
そもそもピボットならvbaいらなくないか? >>440
仰るとおり単なる集計だけならVBAいらないのだけど、
>>435に書いた通り既定の集計表に沿って作成する必要があるから
作成したピボットからデータを拾って集計表に転記しなきゃいけないんだわ
集計表に載らないエラーデータのピックアップもしなきゃいけないし >>441
なるほどなー
実データ見てないからなんとも言えないけど、
俺なら列を追加して、
関数かvbaで非集計対象にtrueを入れるなどしてからピボット、
という感じで運用すると思う >>442
なるほど、サンキュ
しかし、エラー判断のためだけに8万行を走査させたくないんだよね、、、
やるならピボット作った後でやったほうが走査数減りそう
やはりVBAでのピボット操作特訓だな そもそも行と列しか情報もらってなくて
エラーになる条件もどんな集計してるかの情報もないんじゃ回答しにくいと思わないかね 回答しにくいとかどうでも良くね
しっかりとした質問ならまともな回答が得られるし、
曖昧な質問なら抽象的な回答になる
それだけの事だよ 数時間コースのマクロ走ってるの知らなくてブラウザでコピペしたらデータぶっ壊れて怒られた思い出 確かに質問内容としては抽象的過ぎたね。
申し訳ない
でも俺としては十分な回答だった
取り敢えずVBAのピボットを練習するわ
ちなみにエラーってのは既定の集計表(マスター)から漏れたデータってことね。 いまどき8万行15列程度でスゲー時間かかるとは思えんが
まあ俺なら素直にDBつかうけどな >>435
WorksheetfunctionからCountifで存在確認。
Matchで行番号取得。
Rangeを変更しながらループしてすべての行番号を蓄積。
速いかどうかはわからんけど8万行走査するよりは工程は短い気がする。 >>435
まあ集計がSQLで書ける範囲なら
ADO接続でSQL投げて結果のレコードセットを
シートに貼り付けて終わりにするわな 8万行100列をセルだけで処理しようとしたら凄く時間かかるのわかるけど、配列にいれて処理したらそんなにかかるか?
それこそDictionaryで集計して結果だけ貼り付ければ充分だと思うんだが いまだにXPとか使っててマクロが遅いとか言われてもね VBAが就活で必要になりそうなんだが、みんなはどうやって勉強してるか教えて欲しい
おすすめの本とかyoutubeとか学習サイトとか
pythonとSQLはちょっとわかる
MOSのエキスパートレベルまでの知識はある
VBAってある程度までいくと、具体的なデータがないと学習しにくいよね
あちこちのシートの何千行のデータを連結、とか
理屈ではわかってても実際のデータ使わんと本当にちゃんと動くかわからんし >>454
上級者と言われている人達はみなMSヘルプで勉強しているみたい。
あとMSコミュニティとかで情報交換みたいな感じで。 自分で一から全部書いたりしない
ネット検索してコピペ、ただし完コピじゃなくてちょっと手直しはする
それでだいたいのことはできる 今ならchatGPTにでも聞いてみたら出てきそうw >>454
ググればvba100本ノックって出てくるからそれやればいいんじゃない? >>459
そんなサイトないよ。
「ハゲれば横山ノック」というサイトはあるけど。 でもな、ネットの無い時代なんてそれこそイチから手探り状態で書いてきたんでしょ??
コピペよりそういった苦労重ねた方が身に付くのでは? >>459
100本ノックあったわ
これやってみるか
ありがとう
あとVBAってみんなExcel付属のアレで書いてるの?
vscodeの拡張見つけたからそっち使おうと思うけど問題ない? >>461
VBAに限らず苦労しないとダメってのは時代遅れなんだとさ >>454
郵便局の郵便番号データを取り込んでいろいろやってたことはある。
郵便番号から住所取得とかキーワードを含む住所の郵便番号をユーザーフォームでポップアップさせるとか表示項目を可変させるとか。 >>462
基本VBEで書いてる。最終的にはExcelのモジュールやクラスに入ってなきゃいけないもんだし。
ただ複雑になってよく判らなくなったり他人のコードを解析したいときなんかはVScodeに張り付けて読んだりもする。 >>462
EXCELVBAのVSCodeのなんてあるのか
まぁでもEXCELってRangeとかセル位置、
名前定義とかシート見ながらちょくちょく
走らせて確認する場合が多いから
EXCELに付いているVBエディタで
ブレイクポイント掛けてトレースしていく方が
EXCEL単体の作業せあれば楽だと思うけどね
.Net絡みだってUI絡みなら
VS Codeより使えるならVSCoreの方が楽でしょ? >>463
苦労しないとダメとは思わないけど、やっぱ自分で書いて実行しながら作ってった方が覚えるからあんまりネットからのコピペはしないな まずはVBの構文からだね
Subに()つけるだけでエラーになるからビビる
次はExcelの巨大なクラスライブラリ
Applicationから始まるオブジェクトツリーにアクセスできればExcelとのI/Oは完璧だ
コピペイヤーが理解していないのはデフォルトプロパティ
いろいろ省略出来て便利なのだがハマることになるだろう
やりたいことはマクロの記録ですぐ分かる
ワークシート関数まで使うのが理想なので最終的には「Excelの使い方」が一番難しい ネットがない時代は苦労したって言うけどさ、その「苦労」って結局は正解を手に入れるまでの「時間が長かった」ってだけのことなんだよね
わからないことがあると図書館か本屋へ行って立ち読み、それの繰り返し
ぐぐりまくるのとやってることは同じ いや、購入した本が間違ってる場合もあったんだよ
今なら複数のサイト比較して一番いいコードを参考にするって出来たけど、
当時は変な本に当たるとどうしようもなかった
良い本かどうかの判定も難しかった >>470
情報の質にバラつきがあるのはネットも同じ
役に立たないサイトのがよっぽど多い でもさ、初期にExcelの指南本書いていた人達はどこで知識を身につけたのだろうか??
それこそ何も情報が無い時代なはず… いちばん最初は、分厚い説明書付いてきた 足りなければmicrosoftのFaxへ電話して
欲しい情報の番号押せばダラダラと何十枚ものFAX資料として引っぱり出せた
金有る奴は説明書の最後のページにある有料版の冊子を取り寄せてた ヘルプが充実してきてそれらは廃れた >>472
昔はマイクロソフトが講習会とか開いてたんよ
1回何万円も払って授業を受けに行ったわ >>469
趣味ならともかく曲りなりにもビジネスなら時間は重要だろ
あと、ちょっとレアな手法(例はよくないかもだけど例えばクラスにデフォルトプロパティを追加する方法とか)は載ってる本を探しきれない >>476
あんた、最近みんなから相手されないからって拗ねたレスするなよな。
職場でもそういった態度なんか? >>475
え?クラスモジュールでデフォルトプロパティ設定できるの? >>477
自分がどんな馬鹿なことを聞いたのか理解できないのか?
真正の馬鹿だな >>471
だからネットなら比較簡単って言ってるじゃん
最初に見つけた解決法でハイ終わり!って小学生かいな
>>478
気にしたこと無かったけど、凄い方法で実現できるようだ
https://thom.hateblo.jp/entry/2015/02/16/003000
エクスポート、インポートでやっと実現するとか面白いコーディングだ >>478
ちょっとトリッキーだしMSが保証してるかどうかがわからんから例としては良くないって書いたけど
VBA クラス デフォルトプロパティ
でググれば出てくるよ
https://thom.hateblo.jp/entry/2015/02/16/003000
こんなのどうやって見つけたんだろう... >>480
この人のブログはかなり読んでたつもりだったけど
この記事は完全に見落としてた
ってか、この手法は面白いけどマニアック過ぎるね
後で試してみよう Range(Cells(7, 1), Cells(7, 3)) = "一括入力"
Range(Range("A7"), Range("C7")) = "一括入力"
Range(Cells(7, 1), Range("C7")) = "一括入力"
Range(Range("A7"), Cells(7, 3)) = "一括入力"
結局セルの指定方法のひょうじゅんってどれなの? >>479
だからこっちがあんたに質問してるの
もう一度聞く
職場でもそんな態度で過ごしてるのか? >>483
範囲が固定なら
Range("A7:C7") = "一括入力"
可変なら
Range(Cells(R1, "A"), Cells(R2, "C")) = "一括入力" ' 行可変
Range(Cells(7, C1), Cells(7, C2)) = "一括入力" ' 列可変
Range(Cells(R1, C1), Cells(R2, C2)) = "一括入力" ' 両方可変
かな
まあ他にもReSize( )使ったりケースバイケースかと >>483
そもそも一括入力する場面ってのがほぼ無いと思うが・・・
vbaでテンプレートを作らざるを得ないような状況なら、一番上かな。アルファベットでセル指定する意味は無い
>>484
お前がアホだからアホみたいな意見が付いてるんじゃないか
>>472はちょっと酷すぎるぞ >>483
Range("A7").Resize(1,3)="一括入力"
Cells(7,1).Resize(1,3)="一括入力"
これが一番応用効いて楽だよ いつものかまってちゃんを相手するなよ。
スルースキルも身に付けろ >>487
都合の悪い質問に答えられないか。。
あんたさ、職場で上司や同僚から「取っ付きにくい人」とか「話かけにくい」って言われてないか?
そういう性格早く正さないとハブられるよ? 単なる雑談に噛み付いて謎のマウント取りはじめるとかキチガイだろ
そんなやつに触れるなよ
無視が一番 別ファイルの複数シート(日付ごと)の特定の値を日付ごとにとってきたい場合ってどうしたらいいんでしょうか 自分で書いてる通りのコードを書けばいいんじゃね
試しに書いてこれでいいですか?ってきいてみようぜ 会社から他の社員にVBA教えてやってくれ、って言われたら素直に応じる? 業務命令で仕事のタスクとして依頼されるなら応じるだろ
それとVBAを教えてやれって言われることなんてあるか?
なんらかの業務で使ってる○○を直すからわからない事があったら質問してくるんで教えてやってくれ
みたいな依頼じゃないのか ユーザーフォームを表示してテーブルにあるデータのうち任意のレコードを入力させるマクロを作っているのだけれど、テキストボックスにするべきかコンボボックスかそれともリストボックスをクリックさせるべきか、迷っている
皆さんはどういうUIにしてますか? 要件満たせるならどれも一緒だけどその3つの何で迷ってるか書いてみたら? >>502
テーブルにあるレコードは100件くらいで、その中からなるだけ手っ取り早く入力できるようにしたいんですよね
テキストボックスとリストボックスを併用してどちらか好きな方から値を取れるようにした方がいいのかなと考えています 上司に言われただけじゃ無理でしょ
本人のやる気がなければいくら教えても無駄
まずは自分で調べてできるとこまで書いてもらって、無理ならいくらでも聞いてって形式じゃないと教えられないわ
そこらへんの講義してる先生じゃないんだから教材なんか持ってないのに1から教えるのは不可能 お助けを願います
Range("A1") = "=SUBTOTAL(103,A4:A300)" & """/""" & "COUNTA(A4,:A300)"
計算式の結果と結果の間に文字列のスラッシュを置きたいが上手くいきません >>503
じゃあそうすればいいのでは
作ってみて違和感あれば別の方法考えたらいいんじゃ
>>505
CONCAT使えばいいんじゃない >>497
覚えるべきは、あなたです。末端は、組織が作ったシステムを使うだけでいい。
というべき。 VBAのスキルが重宝される程度の職場なら、職務経歴書のいいネタと思って教えてやれよ
それが済んだらお前はさっさとステップアップすればよい >>508
程度のレベルで身につくんだけど、実際日本人の9割以上はVBAなんて、出来ない。
よくエクセルマクロを使える割合見たいのがあるけど、ああいうサイトに行く人という母数でとっても3割程度。
実際は、まともな企業でも数百人に一人くらいしかいない。
だからVBAだけで神扱いされるんだけど・・・
本来は、幹部こそ覚える技術なんだよね。
システム化って、まさに業務運用そのものを決めるようなものだから。 AからFの列範囲に何行あるかわからないデータがあるとき
データがあるセルの下に
オートシェイプを線を入れるにはどうしたらいいですか?
標準の線では線種が少ないのでオートシェイプでいれたいです >>507
本来うちの会社もそんな感じ考え方だったのだけど
部長(配列もfor eachも使えないレベルの自称VBA名人)が
旗振り初めたお陰でしょーもないVBA講座が始まったんだよ
俺自身は社内でVBA使えることを殆ど話したことなかったが、
お前もなんかちょっとは使えるみたいだから
講座受けて講師手伝えとか言われ始めたわ
下らなすぎてマジで憂鬱 >>511
全員が使える必要はないんだよなぁ
VBAで無駄な作業を消していくから、社員はむしろ削られる方向になる。
だから、末端がやると摩擦が起きるから、幹部がやるのが正しいんだけどねぇ…。
幹部がプログラミングできると、それを理解しているんだけどね・・・。
そもそもシステム化とは、業務運用・業務ルール・業務管理あらゆるものを交換の利く末端に強制的に行わせるものなんだから、それって幹部の仕事だよね?ってはなしなのにね。 >>497
勤務時間内ならそれも仕事だから教えるが
編集の方法だけ教えて細かな内容は自分で調べるように伝える
あとは「教えました」できないのは本人の勉強不足なので質問されれば答えるだけ 仮に講義したとしても
「初心者にvbaの事をすべて教えるなんて不可能だから、取り敢えず基礎的な事だけ教えるか。配列まで教えるのは無理だな」
↓
「セルだけで処理したら30分くらいかかるし固まるし使えない」
↓
「配列使えばすぐ終わるよ」
↓
「そんなの習ってない。教えないほうが悪い」
↓
上司「何で教えないんだ。不備があるから評価下げる」
ってなる未来しか見えない
自分で調べる事ができるヤツは講義なんか必要なく聞かれた事に回答するだけで十分だしな 結局、講義したいなら有料の〇〇コースって外部の講義を使用するのが一番なんだよな
金がかかるコースなら明確に〇〇まで、って言えるし
金がかかんない内部での講義だと、最終的には教えないやつが悪い。講義するならちゃんと教えろって言い出すヤツは絶対いる セミナー行っても全員が自信を持って理解できたってことにはならないだろうしな。。
作った気にさせて終わりみたいな。 聞かれたら教えるけど、聞かれなかったことは教えようがない
調べればすぐできるのになんで調べないのかわからない 本来、質問するならネット等に載っていない事例を聞くべきだよね。
ただこのスレに対する質問がガクッと減るがなw あと、教わればどんなことでもできるようになると勘違いしている初心者も多い
考えるのと覚えるのは教わる側の問題 >>510
マクロの記録で試しに線を引いてみたらコードを生成してくれるから
それをみてあたりとかつけてみたらいいんじゃないの?
特定セルの座標はTop,Left
高さと幅はHeightとWidthで取得できるから計算して引いてみ >>506
ありがとうございます
concatなかったんでconcatenateを使いましたが同様にエラーが出てしまいました
基本から調べてみます
スレ汚しすみません >>522
これでいいんじゃないの?
Range("A1") = "=SUBTOTAL(103,A4:A300)&""/""&COUNTA(A4:A300)"
Range("A1") = "=CONCATENATE(SUBTOTAL(103,A4:A300),""/"",COUNTA(A4:A300))" >>522
セルに入れたい数式自体がエラーになる(間違ってる)からVBAでもエラーになってる。
セルに入れたい数式は下記かと。
=SUBTOTAL(103,A4:A300)&"/"&COUNTA(A4:A300)
VBAで書き込む場合。.Formulaは無くてもいけるけど明確に数式として入れたい場合は書いといた方がいい。
Range("A1").Formula = "=SUBTOTAL(103,A4:A300)" & "&""/""&" & "COUNTA(A4:A300)" >>524
> "=SUBTOTAL(103,A4:A300)" & "&""/""&" & "COUNTA(A4:A300)"
"=SUBTOTAL(103, A4:A300) & ""/"" & COUNTA(A4:A300)"
じゃだめなの? 休みでもVBA書くのか、凄いな
家だとVBAのネタがないからいまいちやる気にならない え?みんな休日はExcelやらないの?
自分は隙あれば何かしらの練習してる。
勘と腕が鈍りそうな気がして。。。 家だとVBAで作りたいネタが思い浮かばない、、
何を題材にして練習しているのか教えてくれると嬉しいな >>515
VBAを教えるのに必要なのは、講義の時間ではなく、「自分でも業務改善プログラムを作れた!」っていう成功体験だと思う。
処理速度云々は、相当後のほうでいいと思う。
ここで、資質があるやつと、そうでないやつがわかる。
資質のあるやつは、自分の作ったプログラムをさらに改善しようと、いじる。
このいじる作業をしているやつだけを見つけて、さらに教える。
改良作業をやってるやつは、理屈を理解し始めているから、いじれる。
そして、そのうちマニュアルやサイトでの調べ方と適用方法を理解して、自然と、命令数が増えてくる。
改良を試みてないやつは、たぶんプログラム自体、どっかから丸々コピペしてきて、それで運よく目的を達成できてるだけだから、動作原理わかってない。
ゆえに、次の問題を与えても、成長していないから組めない。 >>532
このスレをずーっと過去に遡って、面白そうな奴を片っ端から解いていくだけでいいんじゃないか?
俺は毎日やってるから出来ないけど
あと、vbaよりもスプレッドシートのGASのほうが色々出来て面白いよ いや奈良公園にせんべい持ってくと鹿に襲われるけどな マジレスすると、2ちゃんねる時代からスレタイから脱線した内容になるのは普通だから。
それが気にくわないなら開かなきゃ良いだけ。 軌道修正レスも普通だから。
いやなら開かなければいいだけ。 Excell2019 win10という環境で標準のVBEを使用しています。
ローカルインドウやウォッチウインドウにて多次元配列の中身を確認しながらデバッグを
している時に、一個ずつ+マークを押して展開するのが不便に思っています。
一行ずつ動かしながら逐次中身の変化を追いかけたいので、ずっと展開しっぱなしにしたいです。
ボタン一発で配列全部展開してくれるとか、展開しっぱなしにするとか何か良い方法はないでしょうか? 無い。
配列の内容をワークシートに展開する関数を作って、
イミィディエトウインドウから 関数(配列) と実行。 最初から個別の値をウォッチ式に入れておくとか
a(0)
a(1) >>545>>546
ありがとうございました。
個別でウォッチ追加します。 複数のExcelファイルで作業をしていると、ふと見るとVBEの左側のツリーに立ち上げたファイル名がずらずら並んでいることがあります
普通はそのファイルを閉じればツリーから消えるのですが、たまに消えずに延々と溜まりまくるときがあります
こうなるとメモリ消費しまくって最終的にはメモリ不足で動かなくなります
こうなってしまうのはどんな理由が考えられるのでしょうか
それとも、Excelは定期的に全部閉じる癖をつけておくべきなんでしょうか >>549
Excelがファイル閉じるのを失敗している
その場合、一度失敗するとそれ以降全部失敗する
再インストールか、メモリの増設した方がいいと思う
あとLAN上にあるExcelファイルを開くとそれになりやすい >>549
マクロで開いてるならマクロがおかしいから
private変数でブックを保持する様にしているならそれが解放されてないと起きるかと >>550-551
ありがとうございます
他ファイル参照するために開いて閉じるようなマクロは結構多用してます
基本的には単純に開いてはデータ引っ張って保存せず閉じるというような内容ですが…
参照するファイルはLAN上ではありませんが、OneDriveの共有フォルダには置いてあります(ローカル保存)
一度この辺のマクロを見直してみたいと思います
原因がわからなければ再インストールしてみます >>549-552
ウチもマクロで他の個別ブックを開いて
その中のマクロを実行して上書き保存・当該ブックを閉じる
をやってたけど、VBEの左側ツリーに閉じたはずのブックがズラズラ・・・
開くブックが70個ちょっと、中のクエリーをテーブルとして変数に設定するところで
いつもコケるようになった。
ブックの保存先はいずれもローカル。
操作するブックと操作される個別ブックの変数、プロシージャ名は
重複しないようにしていたがダメ。
次のブックを開くインターバルを1秒~とか、
クエリーはテーブルオブジェクト変数に入れているので、
毎回Nothingを入れてみたがダメ。
結局、地域毎に開くブックを50個くらいに収まるように
操作するブックを分けた。
ブックを割り当てる変数と、
それを保存・閉じる記述を見直してみようと思う。 >>552
onedriveか、あれもLANと同様になんか変な挙動になっている
僕はあまりの挙動不安定さにスプレッドシートに逃げたよ
閉じる動作・共有に関して、もっと突き詰めたほうがいいかもしれない
カンだけど僕がやるなら以下のような形です。解決するかどうかは不定。
・開いたExcelを、一回activebookにしてから閉じる
・適度に、OSに処理を返す。forを使っている+時間が掛かっている場合、適当にDoEvents()を挟んでみると改善する可能性があります
・onedriveの挙動が予測できないので、一旦ダウンロードフォルダなどにコピーしてから使ってみる。
どうも共有フォルダはタイムラグがあるのか、意図しない非同期になってしまい良くないことが起こっている気がする。
非常に問題を捉えづらい、難しい問題と思います。頑張ってください >>553
WorkbookやWorksheet含めてObjectは順序だててNothingするようにしたらそんなこと起きないとおもうよ
set oWB = xxx
set oWS = oWB.xxx
なら
set oWS = nothing
set oWB = nothing
という順ね
面倒でもNothingで解放するクセつけたほうがいいと思うぞ マクロの管理・閲覧ってみなさんはどうしてるんでしょうか?
基本的にはブックの中に保存してるとは思うんですが
ブック開かないと中身確認できないですよね?
何らかのファイルに中身を保存して、たとえばvscodeなどのエディタで開いたりするのでしょうか? 俺は普通にブックをSVNでバージョン管理してる
差分を見たい時は見たいバージョンを保存して最新版と保存したバージョンから各々エクスポートして差分を取ってる
VsCode の拡張もあるみたいよ ⇒ >>462 >>556
ブックのマクロを別ファイルに保存するということはコードの2元管理になるからしない
普通にブック開いてVBEでみるだけでそれで困ったことはない
別のブックのコードを参照したい場合は一時的にそのコードをコピペしてエディタで見ることはあるけど終わったら削除してる
何度も手直しするような事もないからバージョン管理もしてない >>556
特にしてない
昔はよく使う「最終行の取得」や、「set〜」なんかをまとめたブックを作ってそれをコピペしていたけど、
コピペしないほうが早い事に気づいてからはそういうのもなくなった
高速化もよほどじゃない限りしなくなったな。 vbaでファイルを開くダイアログを出させて、ユーザーに任意のシートを指定させ、
VBA側でそのシートオブジェクトを取得して、解析をするというものを作ろうとしています。
よろしくお願いします。
ttps://oshiete.goo.ne.jp/qa/3042408.html
こちらに「シートを選択させてアクティブにする」というコードがあります。
ttps://www.kurumico.com/excel-vba-file/315/
こちらには「ファイルをダイアログから選択指定して開く」というコードがあります。
単純に組み合わせたら願望はかないました。
そこで質問したいのは
MyDialog.Controls.Add(ID:=957).Execute
これが一体何なのかということです。
エクセル2019の左下にあるシート一覧を左右に移動する
← →
このマークのところで右クリックをすると同じようなシート選択ダイアログが出てきます。
そして選ぶと、アクティブになります。
957を一覧から探してもこういう説明を見つけられないでいます
そういう理由からCommandsBarsもControls.addもイマイチ理解を深める事が出来ずにいます。
どこかいい説明サイトがありますでしょうか? >>560
無かった
一応コードの意味から
'新規コマンドバーを一時的に追加する
Set foo = CommandBars.Add(Temporary:=True)
'上記にコマンドID957を追加し、実行する。2はスペルチェック。多分1はダミーコードでなにも起こらないはず。
foo.Controls.Add(ID:=957).Execute
で、この957って何って質問なんだろうけど、これはシート選択ダイアログのIDと思われる。
普通は定数名で設定し、マジックナンバーは使わない。
foo.Controls.Add(xlSheetList).Execute 'のような形になるはず
定数名とIDの対応表がどこかにあるはずなんだけど、全然見つからない。もしかすると無いのかもしれない。
使い方は公式を見るのが早い
https://learn.microsoft.com/ja-jp/office/vba/api/office.commandbarcontrol
https://learn.microsoft.com/en-us/office/vba/api/office.commandbarcontrol.id
一覧はこれだと思うけど、そこにも載ってない
https://www.microsoft.com/en-us/download/details.aspx?id=50745
ただこのコマンドリストを一時的に利用するというテクニックは、これ以外に使い道は無いと思うから
そんなに深く考えなくてもいいと思うよ 俺もID=957が何なのか探したけど見つからんな
昔のExcelでもちゃんとシート選択ダイアログは出てくるからVBAが付いてるOfficeならバージョンによって動かないみたいな事は起きないと思われるが
これが気持ち悪い場合は適当な選択フォームを作った方が良いだろうね >>561>>562
調べていただきましてありがとうございました。
これで質問を解決とさせていただきます。
深く考えない事にしますが、これを初めて見つけた人はどうやって見つけたのでしょう… >>563
昔はそういう一覧が合ったんだと思う
で、マイクロソフトが更新忘れて、忘却していると思う
(別に作る義務はないんだけど)
マイクロソフトに言えば、作ってくれるかもね >>563
debug.Print CommandBars.Add(Temporary:=True).Controls.Add(ID:=957).Caption
「シート一覧(&S)」
これで存在を確認できるね
for-nextで総当たりして見つけたんだろうね
リボン以前の時代に マイクロソフトのサポートに聞けば有償で教えてくれるだろ 素人質問で申し訳ありません。
G行(列?)にワンクリックで時刻を出るように
Private Sub CommandButton1_Click()
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("G2:G30000")) Is Nothing Then Exit Sub
Target.Value = Date
Cancel = True
End Sub
とvisualbasicで入力しました。
でワンクリックで「時間:分:秒」は出るようになりましたが、全部「0:00:00」
になってしまいます。今の「時間:分:秒」が出るにはどうしたらよいでしょうか。
ちなみにセルの書式設定で「時刻」⇒「13:30:30」の設定にしてあります。
よろしくお願いいたします。 Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("G2:G30000")) Is Nothing Then Exit Sub
Target.Value = Now
Cancel = True
End Sub >>568
ID違うかもですが早急なご回答感謝です。
下から3行目のDateをNowに変更いたします。
ID:U+Y4eA/v0様とご家族の今年一年の
健康をお祈り申し上げます。 凄く初歩的な事かもしれませんが、自力でわからなかったので教えてください。
コマンドボタンが3つあって、そのうち1つがエラーで止まるとします。
エラーで止まるボタンをA
正常なコードになっているBとCみたいな
Aを押してエラーが出たらVBE画面が開いてしまいます。
そしてVBE側のリセットボタンを押さないと処理がリセットされません。
これを気にした事はありませんでした。
しかしこれから他人に使わせたいので
【1】エラーが出ても一時停止ではなくて初めから完全停止になって欲しい。
【2】エラーが出てもVBE画面が開いて欲しくない
こういうのはどうすれば良いのでしょうか? >>570
【2】はOn Error Go To を使ってエラーが出たら処理を辞める方法がある
もしくはエラーが出る特定のところのみOn Error Resume Nextを使ってエラーを無視して、その時にErrオブジェクトが値を持つかを見て値を持ってたら処理をやめるとか
【1】は無理
というかエラーが出ることが分かるならエラーが出ないように直すべき
個人で使うのならいいけど、他人に使わせるのにエラーが出たままは相当マズい >>570
エラートラップはかなりしっかりやっといたほうが良いけど・・・
対処法として、gotoとresume nextがある
gotoはちゃんとした分岐
resume nextはエラー完全無視でそのまま実行し続ける。
後者は超危険だけど、自作ゲームぐらいならこれで済ませてもいいと思う
Sub foo()
On Error GoTo err
foo2 = 0 / 0 '0で割り算
MsgBox "エラーはありませんでした。通常終了です"
Exit Sub '正常終了
err:
MsgBox "エラーが起きたので終了します"
End Sub
Sub bar()
On Error Resume Next
bar2 = 0 / 0
'通知
If err.Number > 0 Then
MsgBox "エラーが起きたようですがそのまま実行しました"
End If
End Sub >>571>>572
無理でしたか…
「エラーが出たら一旦エクセルを再起動してもらって、私がコードを直すまではそのボタン触らないで」
っていう事にしようかと思います。
>というかエラーが出ることが分かるならエラーが出ないように直すべき
ハっとしました。
On Error Go To処理はエラーが出るの前提みたいで使うのいやだなと思ってましたが、
エラーを前提にしてたのはよっぽど自分の方でした。
解決です。ありがとうございました。 新年早々馬鹿か
こんなのが作ったものを使わされる人達可哀想 >エラーが出たら一旦エクセルを再起動してもらって
いや、馬鹿だろこいつ >>573
「エラーが出たら一旦エクセルを再起動してもらって、私がコードを直すまではそのボタン触らないで」
これはいいけどさ、そもそもエラーが出るって分かってるものを使わせるのはヤバいだろ
エラーを出さないようにしてから使わせるか運用制限を書いとくかするのは必須だろ
それでもエラーが出た場合はそう言うのであって、最初からエラーありきはどう考えてもおかしい >>578
よくないだろ
どんなエラーかどういうデータでエラーになってるかをエクセルを終了して全部消して連絡くださいと書いてるわけだ
馬鹿過ぎて片腹痛い >>579
そうだな
エラーが出た時点で連絡するべきだ
ただ「馬鹿過ぎて片腹痛い」これは言うべきか?
こういうことを言ったら萎縮してスレに書き込む人が減るだけ
メリットがなにもないどころかデメリットしかないことを言う意味はない エラー地雷が必ずあるボタンとか怖すぎる
マクロの結果は元に戻せないから、コードの先頭に関係するブックをセーブするように書くことをお勧めする >>580
内容も吟味せずに脊髄反射で書き込んで馬鹿を擁護するお前のような奴が馬鹿を蔓延らせることに気付くべき >>580
>>560 にも答えられない馬鹿に言われてもな >>582
お前の書き込み内容、有益な情報が一つもないじゃん
「内容も吟味せずに脊髄反射で書き込んで馬鹿」ってお前の事? なんだかすみません。
今回は主にファイルオープン関連で「絶対にエラーが出ない全てに対応したコード」というのが
書く自信がありませんでした。勉強不足です。
今も一つわからないのですが、例えばマクロと同じフォルダにあるBookAを開いてる状態で、
BookAファイルをさらにオープンしようとするとwin10office2019の当方環境においてエラーが出ないのですが、
これは基本的に他のパソコンでもエラーが出ないのでしょうか?
winxp以降office2000以降あたりであれば大丈夫なものなのでしょうか?
別フォルダにある同名ブックを開こうとするとエラーになります。
こちらは開く前にファイル名で既に開いてるブックを確認するコードを追加しようとみたいなサイトが
いくつも見つかるので解決したのですが、既に開いてるファイル自身を開く事が成功してしまう
ケースを通常と思ってエラーの出ないコードと考えてよろしいのでしょうか? 初心者が思い込みで作ると失敗する
開発環境と実行環境がバージョンやパッチも含めて違うなら同じ環境で動作の確認をするしかない
作ったら終わりではなく、条件を変えても正しく動作するかを確認するくらいやれよ
長いファイル名とか共有フォルダとか、サイズ0に壊したファイルとか作って試すなど 当たり前だけどファイル操作はVBAの知識以外にOSの知識もある程度必要になるから聞かなきゃ判断できないような処理ならやらないが吉かと。
開くのは諦めてせいぜいファイルの存在確認程度にとどめておけば? >>585
自分はWin10+Ofiice365だけど
開いているファイルと同じフォルダのファイルを開こうとすると開いているファイルがアクティブになって
別フォルダの同名ファイルであれば同じ名前のファイルは開けないってエラーになるから
古いバージョンでも一緒なんじゃないかと思うけど
回避したいならWorkBooksの内容をチェックして同じファイル名があればメッセージを出して処理を止めるなりすればいいんだと思うけどね
古いバージョンでもチェックしたいなら単純にフォルダA、フォルダBに同じファイルをいれて両方開けるか試してもらうだけでいいと思うぞ 多分だけど、手動で同一ファイルをダブルクリックで開くような操作では無く
開いたファイルを元に「新しいウィンドウを開く」のようなコードを書いてると思う
いろいろとオリジナルというか無手勝流というか、な制作してるようだし、個人利用に留めとけ と忠告しておきたい
ま、他人からコテンパンに罵られて伸びるタイプも居ない訳でも無いから、ご自由になんだけど(例えばMS社 毎月バグって世界中から罵られても知らん顔してアプデを続けるし) ありがとうございました。
完璧なコードって、人間の行動を全て読むレベルのとんでもない高度な行為ですよね…
プログラムに携わりたいなら甘えずに向き合うべき課題なんだと思います。
年末年始みたいな時くらいしか勉強出来ないの悔しいですね。 上の方でエラーが出たら自分でコードを修正するって書いているから解決方法は知っているんだろ?
なら、Do loopとOn Error Go Toを使ってエラーが解決するまで、知っている限りの解決コードを全て書けばいいと思うが >>590
全てって言っても場合によるよ
入力内容のチェックなら数値文字列エラー値ぐらいでほぼ網羅できるけど、
ファイルを開いたりアクティブになったりってなるとExcelやOSとの兼ね合いも出てくるからほんとキツイ
通常操作の9割をカバーできればいいと思う
あとは起きたエラーに都度対応していくしかない >>591
ファイルロックとかは可愛いもんでウイルスに実行ファイルを書き換えられたとか、アクセス中に停電とか、HDD不安定とかもしもを考えだすと切りがない VSCode では、同名のファイルでも、パスが異なると開ける。
a/a.txt, b/a.txt みたいに判別できる
そもそも、そういう事を想定していないアプリがおかしい。
アプリを作る際に、これぐらい誰でも分かる VSCode では、同名のファイルでも、パスが異なると開ける。
a/a.txt, b/a.txt みたいに判別できる
そもそも、そういう事を想定していないアプリがおかしい。
アプリを作る際に、これぐらい誰でも分かる 最初にon error resume nextを書いとけばランタイムエラーを出さずに原因不明の謎の挙動だけで済む
もし時間に余裕があれば目星を付けた処理の直後でif err<>0 thenでエラーになってないかチェックする
エラーの検出後はon error goto 0でエラーをクリアして再度on error resume nextを仕掛ける
これぐらいいい加減でもVBAの場合は許されるから覚えておくといい >>593
でた、極論で語る奴w
お前は毎回そこまで考えてコード書いてるのかよ >>594
むしろダメなのはメジャーなソフトではExcelぐらいだと思うぞ... 読み込みに失敗、書き込みに失敗程度の動作確認は初心者でなければやると思ってる
あとはエラーコード吐いて、異常がでた場合○○を確認してくださいとかで対応
フリーズしない、ファイルを壊さない、間違った表示をしないように作るのは最低でもやってほしいもんだ
俺ならそうするがみんなは違うのかな? まあテストをどこまでやるかは状況次第だけどファイル関係をエラートラップしてリトライなりエラー表示をするのは普通だと思う
書捨てとか自分しか使わないならエラートラップを端折ってあえてVBAのエラーで止めるとかはある
個人的にないのは>>597みたいなエラーの握りつぶし まともな開発だとエラー握り潰しは絶対ダメだけどVBAだからなあ
必ずエラーが出るゴミみたいなマクロは珍しくないから、いっそ握り潰してくれた方がマシだと思うことはある >>598
アホが食いつかんかなと思って恣意的に書たんたがこれほどとはw
こどおじには解らんだろうが絶対落ちてはいけないシステムならそのくらいの対策は普通にされてるぞ >>602
VBA だから握りつぶしても良いと言うのはよくわからん
まあモダンな言語に比べてエラー処理がやりにくいと言うのはあるけど >>603
VBA で書く絶対落ちてはいけないシステム!
本でも出せば?w >>605
おいおい俺はVBAとは言ってないぞ
お前が勝手に吹いてるだけなんだが自覚できんのか VBAでは絶対に落ちてはいけないシステムとかいう発想自体がシロウト臭丸出しでハズいな 正月からこんなとこでイキってる程度だから仕方ないか w >>606-608
スレタイ100回読んで来年までROMっとけ >>593なんてハードウェアやその周りのソフトの対策であって開発するアプリケーションで考慮する話ではないと俺も思ってるけどな
まあ戻れないところまで追いつめられて必死なんだろうけどそろそろ落ち着いたらどうかね やりたいことあって今日人生で初めてプログラミングに触れたんですけど、ぜんぜんわかりません
idが_rって書いてあるから_rって書いてんのになんでこれでエラー吐くんでしょうか
助けてください
https://i.imgur.com/xYbWeZX.jpg
https://i.imgur.com/KMcczJ7.jpg >>611
Seleniumでスクレイピングしようとしてるのは分かるけど、
その部分だけコード見せられても分からない
全部見せて これって前澤じゃんけんで金もらえるから自動化したいとかそういう事考えてるんじゃね? モチベーションの起点はなんでもいいだろ
俺だってエロ画像見たいからperl覚えた口だし >>615
まさにそれだね
招待すると挑戦回数が増える
謎アプリをインストールすると100円ぐらいもらえる
という仕組みらしい
プログラムを覚える同期としてはとても良いと思うが、
登録とか色々必要だからめんどくさくて検証できないな >>616
おれは教えないだけだから別にかまわんよ
そもそも今さらそんなこと聞いてる奴だから他でも聞いてるかもしれんし作れるとも思えないしな それよりもグー、チョキ、パーがr、s、pになる理由を誰か説明してくれ すみません、質問させてください
Listのようなものに最大5000行のデータを表示、編集、Excelに保存したいです
可能なツールと良ければアドバイス等頂けないでしょうか Listってなに?
俺には意味不明だけど他の人には通じるのかね >>625
PowerApps使えば一行もコード書かずにできるよ >>625
それ本当にExcelそのものじゃん
新しいウィンドウを開くとか試してみて >>627
listviewなどです
listviewはコード以外に画面編集可能ですか? シートに書いてそれをlistviewに反映させればいいんじゃないかな エクセル2019とそこに付随するVBAでは日付の起点が違うのですか?
ちょっと調べると1900年をうるう年と勘違いしてるとかなんとかでてきます。
44932とセルに手打ちしてから日付に直すと2023/1/6になります。
=Now()をセルに入力して数値表示すると44932、しかし日付にすると今2023/1/5
VBAは1899/12/30=1でエクセルは1900/1/1=1ということでしょうか?
それでもつじつまがあわないのですが。 >>631
それを嫌っている人達がいるんですよ
であればlistview等を使用してどうにかするしかないですが、そこまでするならVBAでやる必要が無いと思ってます 僕ちゃんの頭の中にはlistviewと勝手に名付けた理想のツールが存在しますということか >>633
う~~ん、Excelが駄目な理由がよくわかんないな
キャッサバとか使ってみては??
https://forest.watch.impress.co.jp/library/software/cassavaedit/
もしくはスプレッドシート+googleform使うとか
>>632
「数値」は四捨五入されるから同じに見えるだけだよ。シリアル値を確認する時は、小数点も表示した方がいい
ちなみにmac版が1900年-1904年ぐらいがうるう年かlotusかなんかの関係でズレている。1905年以降からは全てのバージョン・マクロで同じシリアル値になる >>634
通じるからいいじゃん
無駄な煽りはやめよう
>>633
いい忘れてたけどlistviewじゃなくてlistboxかなんか >>630
どんな編集したいのか不明だけど楽したいならAccessでもいいんじゃない
そもそも質問が漠然としすぎててListの形式もわからんし
単一項目や相関項目の入力チェックとか何がしたいかも不明なんだよね
質問する側も回答欲しいなら要件を書き出せないと適切な回答もらえないぞ >>635
項目が50近くあって混乱するからといった理由ですね
他の人はできてますしそれくらい覚えられると思いますが、とにかく多量のデータを見ると混乱するそうです >>632
ちょっとだけじゃ無くて、もっと調べると簡単に理由が出て来るじゃん
で、1900年の日付のデータを扱う必要が頻繁にあるのだとしたら、もっと詳しく調べて間違いが無いようにしとかないと >>636
通じないよ
Excelシートが閲覧、編集すべての点で最適 何なら良くて何がダメなのかハッキリさせておかないと何度もやり直す羽目になるパターンだな >>635
明日の昼くらいの時間に=Now()を小数点表示させてみます!感謝です! 昨日Sessionで「トランプの影響力低下」
と断言した北●さん
面目丸潰れ >>640
通じないなら通じる人が答えるから通じない人は黙ってればよくね? >>642
セルの書式との組み合わせだから、セルの書式を意識しないと「標準」ではまる。
Excelの「標準」はExcelだけにしかわからないから、Excelで閉じた世界でないから使わない方がいい。 配列=range("A1:C3")
と格納した配列にrange("A5:C8")を追加で格納したいです
この場合、配列の要素1つづつに格納していくしかないのでしょうか?範囲をまるごと格納できますか? >>647
用途がよく分からんけど、普通に文字列で結合していけばいいのでは?
オブジェクトで返す事もできる
Sub foo()
r = "a2:b3"
r = r & "," & "e3:f4"
r = r & "," & "h3:i4"
Range(r).Value = 1
Set ra = Range(r)
ra.Activate
End Sub
Intersect辺りでもなにかできそうかも?と考えたけど、
全然できないかもしれない オブジェクト指向って
Range.Offset(1).value
みたいな事でしょうか?
自作関数って基本は引数渡して返り値貰ってみたいな手続きするだけの存在ですが、
それをオブジェクトを作る関数(Rangeオブジェクトみたいなものを生み出せる関数)にして、
その関数から出てきたオブジェクトは
メソッドA、メソッドBが使えて、プロパティA、プロパティBみたいな状態も持っている
みたいな考えの元に組んでいくとオブジェクト指向なプログラミングになるのでしょうか?
それはやはりそういう形式を取った方が、少ない脳みそでも複雑化に対応できるという事なのでしょうか?
同じ機能を持ったプログラミングを後から書き直す事があります。
勉強を進めた結果、「もしかしてこういうルールで書いた方がわかりやすいかも」みたいに思って書き直します。
うまく行くと複雑だと思っていたものがとてもチープで難易度の低いものに見えてきます。
オブジェクト指向はその極致みたいなものですか? >>651
>みたいな事でしょうか?
それはメソッドチェーンという記法で、オブジェクト指向言語から生まれた副産物
一見便利で、実際これが無ければVB/VBAはとっくに廃れていたと思われる
ただしメソッドの呼び出しと中間オブジェクトの生成で毎回コストが掛かるため、
複数同じような処理を書く場合は一旦適当な変数で受けるか、VBAの場合はWithステートメントでまとめた方が良い オブジェクト指向の原理主義的には、関数の戻り値はあまり積極的に使用すべきではない
でもドットで階層を掘っていくのは頭悪い人にもわかりやすいから、VB系のエセオブジェクト指向ではわりとよく使われる >>653
「関数」という自分しかわからない用語の定義で話すのはやめろ オブジェクト指向には大きく分けてクラスベースとプロトタイプベースの2種類の流派がある
ちなみにExcel VBAのオブジェクト指向はどちらとも言えない傍流としか言いようがない
本格的にオブジェクト指向を学ぶなら別の言語の方が良い >>651
エクセルvbaの場合、オブジェクト指向かどうかは考えなくていいよ
オブジェクト指向かどうかは、オブジェクトをメインに据えるかどうかによる
しかしエクセルvbaは「エクセル」という超巨大なオブジェクトが中心なので、
普通に書いてたら勝手にオブジェクト指向になる そもそもWindowsというOSを使ってる時点で、すべてのアプリは「Window」オブジェクトの上で転がってるだけ オブジェクトの設計図そのものを作って組み合せていくスタイルがクラスベース(C++やC#など)
半完成品のオブジェクトに手を加え加工したクローンを作って組み合わせていくスタイルがプロトタイプベース(JavaScript/TypeScriptなど)
Excel VBAは完成品として用意されたオブジェクトをそのまま利用するスタイル
(VBAのクラスモジュールは変数や関数を単純 にまとめるだけでクラス自体の拡張性はほぼ無い) sheetクラスを継承できれば・・・
いやできなくてよかった VBAのオブジェクト指向機能は、あくまでCOMを使うために設計されてると言っていいよ
OfficeやC++その他で作成されたCOMを利用するだけだし
クラスを作ったりできるのはおまけで、VBAでそこからさらに派生なんてことは誰もやらないし できないからやらないだけできるなら派生とかやりまくってると思う 現代的なオブジェクト指向ではクラスの継承はあまり使用せずインターフェイスを使うので、クラスを派生できないこと自体はそれほど問題ではない
とはいえVBAでクラスを使うべきでないのは同意する オブジェクト指向は考え方の一つとして知っていればいい VBAのたとえなんちゃってオブジェクト指向でもクラスは普通に便利じゃん
俺はカプセル化もオブジェクト指向も正直どうでもいいから
Publicで書いたりすることも少なく無い オブジェクト指向の話は自分にはまだ早かったようです。
時間のあるときにC++やC#の世界がどんなものか覗いてみようと思います。
ありがとうございました。
ちょっと初歩的な事で質問をしたいのですが、
UserForm1の方に
Private Sub ButtonEnter_Click()
FormData = TextBox1.Value
Unload Me
End Sub
とあるとします。エクセルシート側のコマンドボタンに登録してるマクロには
Public FormData as Variant
Sub Sample()
FormData = 1
UserForm1.Show vbModeless
MsgBox FormData
end Sub
みたいにしてパブリック変数でフォームの入力値のやりとりをしようとしています。
しかしこれを実行するとユーザーフォームが表示された直後にMsgBoxが1表示してきます。
原因はvbModelessまでは調べが付きました。
RefEditでvbModeless使うとボタンが反応しなくなりエクセルの強制終了しか手がなくなる事も。
win10office2019環境特有かもしれませんが。
そこで質問ですがvbModelessって本来どうやって使うものなのでしょうか?
この挙動だと何にも使えない気がするのです。
処理がShowで止まらずに進んでしまうので入力値を受け取れませんし。
処理を止めるコードとセットで使うのでしょうか?
RefEditでは絶対にvbModelessは正常に動作しませんか? 画面表示後に後続のコードを実行させたくないなら vbModal にしないとだめ
vbModeless のままで作りたいなら後続のコードを画面側にもっていくか
ブック側に別のPublic関数として用意して画面側から実行するなりしないとだめ
vbModeless は画面を表示した状態でもブック側を操作できるようにしたいときに指定するものなので
そういう事をしたいときに使いましょう >>666
vbModeless は単純にユーザーフォームを表示したままEXCELシートを編集できるようにするか
否かなので、入力待ちのような場合には不要ですね。
本来の使い方というか、特徴からしてフローティングツールボックスみたいなことができる感じ?
Photoshopとか見たことあるとイメージしやすいかな。。。
必要かどうかは置いておいて例えば、、、
複数のマクロが作ってあるEXCELファイルでシート上のコマンドボタンでマクロ呼出ししようと
すると当然、別シートに移ると使えなくなるけどvbModelessのユーザーフォームに作っておけば
シートを移ってもボタン一発で呼び出せる、みたいな?
あとはテーブルがいくつか作られているシートでテーブルを渡りながら編集する必要がある場合、
目的のテーブルのみを表示させるマクロを登録しておけば簡単にアクセスできるようになる、とか。
どちらもどうでもいい使い方だけどw
ユーザーフォームとのデータの受け渡しならココを参考にしてみては?
関数化して引数でやりとりしてしまえばいいような気がする。。。
https://excel-ubara.com/excelvba3/EXCELFORM010.html >>667>>668
ありがとうございます。
パブリック変数よりFunctionの戻り値をうまく使うっていう方がいいのですね。
UserForm_Initializeもいらなくなりそうですね。
フォームが増えていくとフォーム毎に渡すよう受け取るようのパブリック変数作って
ちょっと管理しづらいなと思っていましたのでいい勉強になりました。
Hideも使っていきます。
モーダルだとフォーム出てる間、タッチパッドの二本指スクロールが正常に動作しなくなるので
そのためだけにモードレスに魅力を感じていました。 >>668
ちなみにそのサイトにあるdoModalというフォーム側に書くパブリック関数名ですが。
今試したところ、標準モジュールと違ってPublic Subで同名のdoModal関数を
フォーム毎に一つずつ名前重複エラーにならなかったんですが、これを仕様として受け止めて
フォーム側の呼び出し関数を全部同じ名前にしてしまっても安全でしょうか?
フォームが5個あるとして、別々の呼び出し関数を作るのは名前を憶えれないどうせ
呼び出し時には
標準モジュール側で
受け取る変数名 = FormName.doModal(引数1,引数2)
みたいにするので別にdoModalにこだわりませんでが
フォーム名.Initializeとか、フォーム名.ShowMeとかにする危険性はありますでしょうか? >>670
標準モジュールに宣言するPublic関数とは違って
ユーザーフォームに宣言するPublic関数はユーザーフォーム名.XXXのような記載をして呼び出すので同名の関数でも構わない
(XXX単独では呼べない) >>670
VBEの画面でF2を押下するとオブジェクトブラウザが表示されるから
自分で作った変数や関数がどういう管理をされているかみてみるといいかもね >>670
> みたいにするので別にdoModalにこだわりませんでが
> フォーム名.Initializeとか、フォーム名.ShowMeとかにする危険性はありますでしょうか?
頭にshowをつけてユニークな名前にすることは個人的にはよくある。
initializeはつけたことないけどユニークな名前なら平気なんじゃないかな。ただVBA側で用意されている名前に酷似してしまうから避けるけど。 >>672
そうですよね。自信持って決まった名前のやつ使い回します。
>>673
見る習慣なかったですが見ないと理解は深まらないやつですねこれは。
>>674
予約語とぶつからないよう気を付けます。
グローバル変数のやりとりなくしたら右上×ボタン閉じでエラーが出る原因が突き止められなくて苦労しました。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
Me.Hide
End If
End Sub
右上×ボタンで閉じるとShowの次の行に制御は戻るのに、モジュールレベルの変数は
値をクリアされてしまうのですね。
とりあえずグローバルのやりとりは卒業できました。ありがとうございました。 オブジェクト指向では
多態性を覚えて初めてその恩恵を実感すると思う。 >>676
多態性とは…
プログラムの経験が浅いとイマイチ具体例が出て来なくてモヤモヤっとした状態から抜け出せませんね。
VBAはオブジェクトは作れないけど、元々作ってあるオブジェクトの利用は出来るんですよね?多分
as objectとされるものは大体、オブジェクト名.プロパティ名とかオブジェクト名.メソッド名みたいなの持ってますよね。
継承というのは、Range.InsertとRange.EntireRow.Insertみたいな親クラスのメソッドを
引き継いでる子クラスみたいなことなのでしょうか。
今の経験量ではどれだけリファレンスサイトを読んでもピンときません。
残念ですし、アドバイスを活かせず申し訳ないです。
オブジェクト指向と非オブジェクト指向の境目がわかるようになるまで深入りしないようにしようと思っています。 VBAはそもそもちゃんとしたオブジェクト指向言語じゃないから
ちゃんとしたオブジェクト指向言語やらんと、その境目なんてわからんよ そうね
Object指向の概念はVBAだけやってれば
人によっては一生身につかないかもね。
この手の参考資料が一番多いのはやっぱりJavaになるのかなぁ。
VBAと文法が近いVB.Netでもあまり見かけないね。アレもIObject指向言語なのに。 vbscriptでwin32apiのキーダウンを使おうとしているのですが、
キーダウンは検知できるのですが、標準入力に押したキーが入ってしまいます。
この標準入力を削除することはできないでしょうか
もしくはキーダウンが標準入力にならないようにする方法はないでしょうか vbsのスレは気持ち悪いからねえ
win32apiコールとか何でもできるpowershellを検討しよう でもパワーシェルはダブルクリックで起動できないって
ところが >>684
バッチからPowerShell呼べばいいだけ PowerShellのスクリプトは.ps1ファイル
普通に起動できる >>680
そうなんかな?
VBAのデザインパターン扱ってる本なんて見たことないけど オブジェクト指向の典型は、Ruby on Rails。
派生ばっかり
おまけにRubyは、メソッドチェーンで関数型プログラミングもできる
ウェブ開発では、ガチガチのオブジェクト指向で、
テキスト処理では、Linux のパイプラインみたいなメソッドチェーンの両方を使うから、
あらゆるデザインパターンの宝庫
おまけに、Stack Overflow によると米国年収ではトップ。
Rubyは9.3万ドル、多くの言語は6.5万ドル、PHPは5万ドル >>691
でも
日本ではVBAより平均年収安いって記事
前このスレに挙げられてたよね また何かにつけて馬鹿馬鹿って連呼するヤツが来たか。揚げ足の取り合い、誹謗中傷スレになるのも時間の問題だな
荒らしにイチイチ構っているお前らも同罪 Rubyはほんとにオブジェクト指向の学習に向いてるのに5chだとキチガイのせいで勧めづらい
いい加減消えてほしい 新年明けましておめでとう
今年はここの住人に《禿》とか《馬鹿》とか《氏ね》とか言われない事を目標にするぞ! >>682
VBSからWin32api呼ぶのにVBA使わんの? VBA使ってAPIコールするなら最初からVBAで作るだろ...
何が悲しくてvbsなんて使うんだよ もう忘れたけどvbsの方がいい場面があることはある
ただもう二度と使う事はないだろう >>705
流石にこの発言は馬鹿と言われても仕方ないな >>708
質問するにはこっちのスレの方が平和的でいいな
このスレには人をバカにしてマウント取るような人間しかいないし それはw 自分の発言読み返して反省しろよw >>705 はボケただけだろ 客席がドッ!と沸くトコだぞ ガチでボケてるのか後出しでボケたことにしたいのか
どちらにせよ>>710が恥ずかしいことに変わりはないなw スレの住人のカラーや雰囲気全然違ってワロタww
ここは人をバカにして楽しむクソスレww winapi使いたいならexe作れよ
古いけどVB.NETのコンパイラ入ってるから >>712
ここにはスレタイも読めなければスレの趣旨も理解できずにただ雑談にくる人も多いからね
クソスレにしてるのはあなたみたいな人だって事を理解したほうがいい >>703
エクセルのVBAだろ?
ワードのVBAなんか使わないぞ? たまに勘違いしてVBの質問してくる人とかいるくらいだからな。 vbaとribbon customuiって直接関係ありませんが、マクロをribbon customuiから利用を考えています。
ネットやyoutube等調べて試したのですが、タブやボタンが表示されずに困っています。
また2007と2010でxmlnsの名前空間指定方法が異なることも理解しているつもりです。
2010以降を想定しています。
環境:Excel for Microsoft 365 MSO (バージョン 2212 ビルド 16.0.15928.20196) 64 ビット
ribbon_test.xlsm(zip)
_rels, customUI, docProps, xl, [Content_Types].xml
マクロ
Module1.main
_relsの.rels
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="(略)" Target="docProps/core.xml"/>
<Relationship Id="rId1" Type="(略)" Target="xl/workbook.xml"/>
<Relationship Id="rId4" Type="(略)" Target="docProps/app.xml"/>
<Relationship Id="rId5" Type="http://schemas.microsoft.com/office/2007/relationships/ui/extensibility" Target="customUI/customUI14.xml"/>
</Relationships>
customUIのcustomUI14.xml
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon><tabs>
<tab id="CustomTab" label="Custom Tab">
<group id="customGroup" label="Custom Group"><button id="member" visible="true" label="Custom Button" size="large" imageMso="HappyFace" onAction="Module1.main" /></group>
</tab>
</tabs></ribbon>
</customUI>
ご教授お願いいたしますm(_ _;)m VBA知らないのですけど
シート間やブック間の情報のやり取りには
コールバック関数みたい非同期処理をしてるんですか? >>720
オブジェクトのプロパティを書き換えたり取得したりする
超古い言語だよ 書き換えや取得してる間はコードの実行は待機し
書き換え、取得が済んでからコードを再開するってことなのでしょうか? >>722
書き換えや取得するコードを書く
やって見た方が早い コールバックではなくCOMという概念で実際のところプロセス間通信している
VBAの場合多分インプロセスなので他の手段より有利
シートやブックに対してコールバックする処理ってあったっけかな >>724
色々あるみたいだけど、vbaで使う場面って思いつかない。ってかバグりそうでやらない方がいい気がしてならない・・・
https://qiita.com/Kamo123/items/e676e0cbe6de83410980 Excelのオブジェクトを外部から弄るつもりならVBAよりもCOMアドインやVSTOアドイン、Office Scriptsなど別の方法利用を検討する方が良い気がする >>722
その通り
データの書き換えしている様子も見えるから仕事しているなって気がしてくる 例外処理の悩みなんだけど、
普段、オプションでエラーをクラスで停止するように設定している
その状態でクラスでErr.Raiseすると、標準モジュールでOnErrorGotoステートメントで受け取れないけど皆さんはどうしてるんですかね? オプションを変えれば標準モジュールで受けとれるんだけど切り替えが面倒 普段からオプション変えとけばいいんじゃね
クラスモジュールで中断って、使いどころがわからん みなさん、ありがとうです
>>727様、ありがとうです
web系はユーザーの待機ストレスをなくすために
コールバックを多用しますけれど
事務系は一つの処理が終わってから次の処理に移るって
なんだかそんな感じを受けました
ありがとうございました >>728
イベントはコールバックしかないですものね 外部取り込みデータでcsvファイルを
QueryTablesメソッドを使用して、TextFileColumnDataTypesを文字列では取り込むとデータの後ろに半角スペースが入ります。
これなぜでしょうか?
標準で取り込むと半角スペースが入らないです。
やりたいのが数値などを文字列で取り込んだ時に、先頭の0を表示させて、E形式で表示されてる数値を全部表示させたいです。
今、文字列形式で取り込むと必ず全データの後ろに半角スペースが入ります。半角スペースが入らないように取り込みたいです >>734
そのcsvメモ帳で開いて
本当に生データに半角入ってないの? シートが2つあって、片方非表示にしようとしたら、最低1個は表示しろって怒られるの何で?
非表示にする1行手前でデバッグプリント取ったけど、間違いなく2つとも表示されている。
単体で実行すると問題ないが、新規ブック作ってシートを2つに増やしてからやるとエラーになる。
DoEvents入れても駄目、On Error Resume Next入れてもエラーで止まる。
ワケわからん。 その非表示にする行が悪いんじゃないの
御託はいいからコード貼れカス 悪くない。
1行手前では2シートともVisibleは-1を返すから、前後がどんなどんなコードでも関係ないだろ。 >>736
ブック2つあってその片方を丸ごと非表示にしょうとしてるとか >>735
半角スペース入ってないです
アクセスから抜いてきたデータなんですけど、何回やっても入るんですよね もうACCESSに直接ADO接続して値取って来たら? 質問者がよくわからない現象だから質問してくるんだろうけどそういう人の質問だといまいち状況がつかみにくいから
オリジナルでなくてもいいから現象が再現するサンプルコードでも提供すれば解決しやすいのにね
そういう事ができない人多いよね >>742
結局、全部にトリムすることにしましたわ 総合スレからこちらに誘導されて来ました
マクロ記録は使えるけどVBAは使えないのに。。
【1 Windows10】
【2 Excel2019 】
【3 いいえ】
【4 否】
普段横書きで印刷をしているシートを
月一回の報告資料のみ、範囲を変えて縦書きにして印刷する必要があります
それでマクロ記録を使って印刷範囲を絞り込んで縦書きにして印刷をするボタンを作成してみたのですが、問題は印刷範囲の最終行が毎回変わるのでその最終行に合わせた範囲指定にするにはどうしたら良いでしょうか?
CTRL+↓を記録は出来ないみたいだし。。
印刷範囲の最終行に透明な「※」でも打ち込んでそこまでを印刷というような事は出来ますでしょうか? >>746
印刷範囲(ActiveSheet.PageSetup.PrintArea)が設定されている前提で
dim printrange, lastRow
' 現在の印刷範囲のRangeオブジェクトを得る
set printrange = ActiveSheet.Range(ActiveSheet.PageSetup.PrintArea)
' 実際の最終行を得る
lastRow = ActiveSheet.Cells(printrange.Row, printrange.Column).SpecialCells(xlLastCell).Row
'最終行を変更したRangeオブジェクトのAddressを印刷範囲に設定する
ActiveSheet.PageSetup.PrintArea = ActiveSheet.Range(ActiveSheet.Cells(printrange.Row, printrange.Column), ActiveSheet.Cells(lastRow, printrange.Column + printrange.Columns.Count - 1)).Address >>746
これを機にVBA使いになりましょう
そんな難しくないですよ
まずはダミーデータと
マクロで記録したコードを張ってみてもらえますか? >>747-748
ありがとうございます
マクロ記録はボタンを押すだけなので簡単ですが
VBAになると一気に難易度が。。
1980年代のDOSの前のBASICはちょろっとやってたので本気出せばなんとかなるかもですが
分かりやすい書籍、動画、講座とかありますかね? そも、縦書きと横書きという独特の言い回しが相手には伝わりにくい
あいうえお ← 横書き
あ
い ← 縦書き 普通に読んでればこう捉える
う
え
お
でもそれでは無くて、帳票の状態が普通はA4横長で印刷してるものを、月イチではA4縦長で印刷したいとかなのか
ほんとうに文字ごとタテ並びにしてしまいたいのか 後者なら敷居が相当高いけど
しかし、初めて白状した状況だと相当の高齢者が毎月なんらかの帳票を印刷するのに苦心している様子からして
自治会の会計資料だのそういう方面だとも考えられる
自分でサンプルを提示するのが困難なら、どっかのサイトで似たような状況を探って画像検索でもしてみて「こういうのをこうしたい」と書かないと伝わり難い
自治会用のExcelサンプルなんかゴロゴロ転がってるし、それを参考にするとか流用するとか 見立て違いなら失敬
しかし、単に「印刷範囲」をその都度指定するだけで簡単に解決するような質問のような気もしてる >>750
打ち出しているのは零細企業の売上報告資料です
経営陣と上司が高齢者なので今まで長年使い続けて来た会議資料のフォーマットは原則何も変えてはならないという前提の作業です
売上が得意先の売上高順に並べられている資料で
右側に売上の内訳があります
単純にA4縦をA4横にして印刷するわけでは無くて列の削除が2列必要になり、その列を単純に削除すると関数が埋められてるのでエラー表示になるので、手作業だと毎回大変だったので、マクロ記録を使って自動的に印刷出来るようにしました
ところが一つだけ上手く行かなかったのが
今回の印刷範囲の指定でした
簡単な例を作成中なので後でアップします >>750
そして毎月、売上が確定するとこんな感じで横向きの印刷をします
列の削除が必要となります
https://i.imgur.com/DfWRUBx.jpg ほんとは
>>752
の上の表と下の表の間に担当者別の売上集計表があるので毎月、列の削除は行えずに右側の内訳をスライドして値複写して整形する必要が有ります
この作業が地味に面倒なのでマクロ記録で自動化しました >>749
Console 0,25,0,1とかで始まるやつか
文法こそ同じような部分はあるけど全くの別物だぞ 最初で最後のプログラミングが
年賀状当選ハガキ発見プログラムでした。。 レコード総数どのくらいか判らんけど、回答待ってる間に別シートにコピーして並べ替えするだけで済むような
いくら零細だからって業務用途なら自社内で解決できるレベルに収めておかないと、引き継ぎに難儀するような
↓こういうのを参考にしてじぶんで懸命に制作してもいいかも知らんけど
https://forest.watch.impress.co.jp/docs/serial/exceltips/1306514.html 単なる受け売りじゃ応用利かなくなるだろうし 数字掴むのはパワークエリやパワーピボットでなんとでもなるんだけど
今まである資料にキッチリ合わせた体裁にしないとならんところで苦労をしていて >>754
改めて考えたらこの横向きの印刷は苦労して無かったんだった
>>752
のシートを新規シートにコピーしてから不要列を削除してプリントするマクロ記録で出来るので
問題は
>>753
の印刷です
この表の下に2月分の納品予定、3月分の納品予定、4月、5月と続いていくので最終行を指定する事は出来なくて
印刷したい範囲はあくまでも当月の1月分までなので >>752-754
1 日次を人間が更新 or 印刷
2 1を元に週次で印刷
3 1を元に月次で印刷
ということなら、シートをあらかじめ上記3つに分ける方向で考えた方がいいんじゃないかね
ご存知かもしれないけど「Excel VBA やりたい事」でぐぐれば大抵の事は出てくるよ
取り急ぎ動的な範囲選択の記述の仕方とか判ればVBAの文法とかあやふやでも全然いけそうだけど >>763
ああ、なるほど、確かに
固定フォーマットに数字だけ行くように出来れば良いのかなと思ったけど
会社も毎月変わるから難しいかな
あと売上高の多い順だし 何度も聞くけど「印刷範囲」の設定ってどうやってる? マウスで印刷したい範囲をドラッグ選択して印刷範囲に設定するだけなんだけど?
月ごとに微妙に行数が増減するから用紙からはみ出るとかの懸念? Excelの初歩の初歩のような気がしてきた 必要な情報を配列に入れ込んで
それで新しいシートを作り直したらどうでしょう?
新しいシートは手作業でフォーマットしておくか
VBAで印刷範囲の列数行数を取得して
配列から取り出してセルに代入するとか
誤って元データを失わないように
シートの追加削除はあまりどうなんだろうって気がします >>765
いや、だから関数とか印刷範囲の設定で済まないので悩んでいるわけです
それだけで済むならマクロ記録で終了です
不要範囲の削除で関数の連携が無くなるから
数値コピーしたり
手動の整形を伴うのと
毎月売上の会社は一定じゃないし >>766
元データを失わないように
元データからマクロで読み込んでコピーファイルを作成して、そこで作業を行ってから終了時にマクロで元データに書き込むようにはしています。。
売上の最新情報は他の人と共有しているファイルになるので、これもコピーファイルを作成してからデータを新しいシートにコピペして、パワークエリを使ってそのファイルから読み込んで毎度自動更新するようにしています
定形フォーマット(シート)を使ってVBAで行数を決められると確かに良いですね >>768
なんか頭のハゲた人がいっぱいいそうな会社だなあ。 ダメだこりゃ 行や列の非表示とかも知らなそう
たぶん「書き間違えました」とか訂正あるんだろうけど、>作業を行ってから終了時にマクロで元データに書き込むようにはしています
これはやっちゃいけない最たるものじゃないのか? 元ファイルと作業ファイルは一方通行にしとかなきゃ、戻してどうすんだ
40年前にBASIC触った世代? なんかアタマでっかちで実務に向いてない 縦書き横書きすら誤用してるのにいっちょまえな用語駆使しようとして伝わらない
すまんがサジ投げる 君らに任せた >>770
いやいや他の人はともかくあなただけ異次元にレベル低い
パワーピボットとか使って無いでしょ >>770
他の優秀な方は皆さん理解出来るのに一人だけトンチンカンなVBAスレにいてはいけないレベルのような
列の非表示をしたらその下の担当者別の列まで非表示になるから
範囲指定や非常時でなんとかなるレベルじゃないでしょ
じゃあなたにVBAの質問して答えられるのかな? >>770
元ファイルは自分だけの使っているファイルだから問題無し
共有ファイルは参照するだけで元には戻さない
なんで書いてる事を理解出来ないのかな >>774
このハゲ!
/ ̄ ̄ ̄ ̄ ̄ ̄\
/ \
/ ヽ
l:::::::::. |
|:::::::::: (●) (●) |
|::::::::::::::::: \___/ |
ヽ:::::::::::::::::::. \/ ノ ほんとは表示がなんでも良ければ
>>752
こんな内容はパワークエリとパワーピボットで、何もしなくても常に最新データに書き換えられるんだけどな。。
といつも思いながらEXCELの加工してます >>752
連想配列、多次元配列を使えば、好きな項目を紐づけでき
表示も好きなようにできるので楽だと思います
一度覚えたら重宝しますのでいつか学んでみたらいかがでしょう?
VBAの学習はネットで十分ですし是非
例えばシートから顧客名を取得して
顧客名をキーワードにして、製品名、単価、数量、担当者名を配列に格納し
単価×売上高の多い順に配列をソートして、配列から必要な表示項目だけセルに代入する
そうやって処理すれば担当者別であれ製品別であれ好きなように表示できます
その後、罫線処理をして、最後に幅調整をしてあげればって思います >>780
あまりにも馬鹿過ぎるから馬鹿と指摘しているのだが
こんなのしか雇えないから零細企業のままなのか、零細企業だからこんなの雇っちゃうのか >>782
あ、
(ワッチョイ 53da-Jpma)
がスマホで書いてるだけか 馬鹿の質問はそもそも馬鹿が考えることだから問題解決へのアプローチが間違えている
というか端的に言えば馬鹿だから馬鹿な発想しかできないから解決方法がややこしくなり何倍も何十倍も時間が必要になる >>781
ありがとうございます
他は全てワンボタンで済んだので
あと表示だけが手動なので
そのために時間掛ける価値があるかどうテンピンに掛けながら
でもこういうのは嫌いじゃ無いので学んでみます >>786
わかる。こういう奴に任せるといつまで経ってもまともな成果が上がらない。 >>789
なんかスレッドが熱いですけど気にせずがんばってください
配列はデータベースみたいなものなのでエクセルと相性がいいんです
とても便利ですので是非がんばってください 煽るヤカラに反応してるとスレが荒れていつも回答してくれる人も敬遠しちゃうぞ
月別のレイアウト範囲を決めるなら参考の表なら
開始は「月売上高表」の文字列が入っている行
最後は「納品予定」の文字列が入っている行を見つけて最後の金額が入ってる行を取得すれば>>747のコードが流用できるんじゃないの >>791
早速、YouTubeの金子さんの動画を見ました
今まで外国語に見えてたのが理解出来て来ました >>792
ありがとうございます
最終行に、色を白で「最終行」と入れて
それを拾おうかと >>789
もし嫌じゃないのなら才能というか適性あります
VBAから入ってある程度楽しいなって思えたら
pythonとかjava、C#とかやってみたらいいと思います >>792
その印刷したい最後の行≒「途中の行」の場合はどのように指定したら良いんでしょうか?
売上先の数が毎月一定では無いので印刷したい最後の行が毎月変わってしまうのです
「売上最終行」「売上最終列」
「納品最終行」「納品最終列」
を透明な文字で埋め込んで認識させるのが良いのかなと >>796
もともと1982年にマイコン(パソコン)を買ったくらいなので好きな方だと思います >>797
vba 最終行
vba 最終列
でぐぐる >>799
ありがとうございます
ググりましたが本当の最終行の説明しか無くて
上に書いた通り、実際には途中に存在する
任意の最終行(実際には途中の行)の説明が無いのですが >>797
どれを印刷したいのかよくわからんけど >>752-753 なら納品予定の列を見て空になった行のひとつ上、>>754 なら得意先名の列を見て合計となって行までを印刷すりゃいいんじゃないの?
って>>792は言ってるんだが?
そもそも
> 印刷したい最後の行≒「途中の行」
とか意味不明すぎる マクロを使ってそのシートを新規シートにコピーしてから不要行や不要列を削除して、その後に最終行と最終列を指定して印刷すれば良いのかな >>802
言葉でそのように説明するのは簡単だけど
具体的にVBAで書けますbゥ? 毎日
752のシートを毎日作成していて
そのシートを元に
753や754のような印刷結果としたいのです
上の画像が失敗したのは
確かに非表示で済むような画像になってしまいましたが
実際には列の非常時を使うと印刷したい列まで隠れてしまうので非表示は使えません 実際の数字は販売管理ソフトから吐き出したデータをパワークエリとパワーピボットによってリアルタイムにデータを見ることは出来ています
その他の付随情報をEXCELで管理していて、そのEXCELデータと販売管理ソフトが正しいかどうかのチェックもそのEXCELファイルで行っています 20年前からパワークエリやパワーピボットが存在していれば、その結果を元に報告資料を作っていたんだろうけど、存在しない時代に手動で作成していたのでそれに合わせる事に苦労してるということです >>804
>>807の表はできてるんだろ?
得意先名の列がB列としたら
Dim Row As Long
Row = 1
While Cell(Row, "B").Value <> ”合計"
Row = Row + 1
WEnd
ってやるだけだろ >>810
ありがとう
行か列を任意を指定してキーワードを見つければ良いんですね
>>811
BASIC自体を知ってるのでは無く
その当時、マイコンを買って
雑誌の記事を見て自分用にカスタマイズしただけ
主にカセットテープから20分くらいLoadしてゼビウスとかやってた 適当に打つとsyntax errorが出てくる事は知ってる 連想配列のコレクションを使いたいんだが、個別の要素が書き換えられない。
書き換えると全要素が書き関わってしまう???
これはどうしたらいい?
Set Yukkuri = New Dictionary '「Microsoft Scripting Runtime」を参照設定
Dim timeline As New Collection
Yukkuri.Add "Name", "霊夢"
Yukkuri.Add "serif", "霊夢です"
timeline.Add Yukkuri
'セリフを追加する
timeline.Add Yukkuri
Debug.Print "--before--"
Debug.Print timeline.Item(1)("Name"), timeline.Item(1)("serif")
Debug.Print timeline.Item(2)("Name"), timeline.Item(2)("serif")
'追加したセリフの変更
timeline.Item(2)("Name") = "魔理沙"
timeline.Item(2)("serif") = "魔理沙だぜ"
Debug.Print "--after--"
Debug.Print timeline.Item(1)("Name"), timeline.Item(1)("serif")
Debug.Print timeline.Item(2)("Name"), timeline.Item(2)("serif")
実行すると
--before--
霊夢 霊夢です
霊夢 霊夢です
--after--
魔理沙 魔理沙だぜ ←こっちも書き換わってる
魔理沙 魔理沙だぜ >>806
自分が何もできないから100%他人任せにしてるような割りに態度が少し横柄なんじゃねと思わなくもないんだよね
少なくとも>>806の月別の表が何か月分も同じシートにあるのであれば
・シートを2つコピーして>>807用の2つのシートを作る
・それぞれのシートで1行目から最終行まで検索する
・月別の始点はA列?の「月売上高表」の文字列が含まれる行
終点は次の月の「月売上高表」の文字列が含まれる行の-1
※ただし最終月は翌月の文字列が見つからないので最終行でよい
これをもとにそれぞれのシートの行を非表示にしたり、列を非表示にして
印刷範囲決めたらいいだけなんじゃないの
ここまでの説明はマクロで可能
俺はやる気のあるコードを見せてくれたりする人には付き合う気はあるけど
100%他人任せには構ってられないから以降は他の人が回答してくれることを祈るわ >>814
そりゃ連想配列の実体は1つしか作ってないから書き換えたら変わるわな
いまいちどういう結果を期待してるのかよくわからんけど片方が変わって欲しくないなら
timeline.Add Yukkuri
Dim Yukkuri1 As New Dictionary
Dim Key As Variant
For Each Key In Yukkuri.Keys
Yukkuri1.Add Key, Yukkuri(Key)
Next
timeline.Add Yukkuri1
のように中身をコピーして作る また零細企業の馬鹿が粘着してるのか
しつこい馬鹿は迷惑 >>749
Sub main()
Dim arr() As Variant
arr = dataArr
End Sub
Function dataArr() As Variant()
Dim cel() As Long
cel(0) = Cells(Rows.Count, 1).End(xlUp).Row
cel(1) = Cells(1, Columns.Count).End(xlToLeft).Column
Dim rw, col As Long
Dim datas() As Variant
ReDim datas(cel(0), cel(1))
For rw = 0 To cel(0) - 2
For cl = 0 To cel(1) - 1
datas(rw, cl) = Cells(rw + 2, cl + 1)
Next cl
Next rw
dataArr = datas
End Function これでmain関数の中のarrにすべてのデータが取り込めた
arr(0,1)はヨソバ〇カメラ
arr(1,5)は80000
2行目に、み〇なのさくら屋、売上金額、納品予定
3行目のE列に納品予定合計額を表示させたければ
cells(2,1)=arr(1,1)
cells(2,2)=arr(1,2)
cells(2,3)=arr(1,4)
と指定して表示し
合計はVBA内でfor分で合計値を算出するか
シートに転記後にworksheetFunction.sum()で合計を算出して表示すればどうでしょう
製品テーブル(略称含む)や顧客テーブル(略称含む)をシートで作って置ければ
さらに楽にできると思います >>820
それはデータ取り込みのためのVBAですね?
印刷のための範囲指定は
Sub tes()
'
' tes Macro
'
'
Range("A1:I69").Select ←ここの部分を書き換えると
ActiveSheet.PageSetup.PrintArea = "$A$1:$I$69"
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
Application.PrintCommunication = True
ActiveSheet.PageSetup.PrintArea = "$A$1:$I$69"
Application.PrintCommunication = False
With ActiveSheet.PageSetup
途中省略
End With
Application.PrintCommunication = True
End Sub >>821
どの程度の大きさのデータを印刷したいのかわからないですが
サンプル程度のデータ量でしたら配列を使って取り込みと出力をして
印刷設定はエクセル側で行えば十分かと思いましたけど
それではあまり役立ちませんか? >>822
印刷設定をEXCEL側とは?
毎回手動で設定して印刷という話ですか?
データ取り込みは苦労していないというか既に自動化は諦めてるので
未納品状態から納品済に変わった段階で
下から消して上に書き込む作業を行わないとならんので。。 >>823
よく理解してなくてすみません
rangeの範囲指定だけ指定できたらOKなのでしょうか?
例えば、
Range("A1:I69")
printArea="$A$1:&i%69"
を指定したいってことでしょうか? >>819
1オリジンのRangeオブジェクトと0オリジンの配列のやり取りはどうやっても混乱するから
セルを配列に取り込む場合は「array = Range(範囲).Value」のようにRange.Valueで取り込んだ方がいいよ
これでRangeで指定した範囲の値が1オリジンの2次元配列として取得できる
逆に配列をセルに書き戻す場合も、Rangeとarrayの要素数が同じなら「Range(範囲).Value = array」で済む
これはVBAでシートを配列で扱う場合の常識だと思うので一応 おいおいおいおいw まーたハナシが変わって来てるw ま、それがこの人の個性っちゃあ個性だけどw
パワークエリやパワーピボットを駆使してマクロで一発で取り込むのは出来てる とか、大法螺だったんだな
彼の目的はただ一つ 会議資料として用紙の横書き印刷と縦書き印刷をしてる、その縦書き印刷を自動化したい その一点
横書きとか縦書きとかは彼の独特な表現だからA4ヨコ印刷・A4タテ印刷に脳内変換してくれ A版かB版か、4か3かは定かでは無いが、まあそんな風
で、彼のとっ散らかった説明・解説をまとめると以下の通りだ
販売管理ソフトで売り上げを管理 → 売上データをExcelに吐き出し(もしくはExcelから引っ張る) → そのデータをパワークエリやパワーピボットを
駆使して集計し、会議用資料のテンプレートに落とし込む https://i.imgur.com/MNy37BM.jpg → https://i.imgur.com/JUP2t7B.jpg これはヨコ印刷で
問題無し https://i.imgur.com/LhkqS7p.jpg これのタテ印刷に苦心してる
何故なら :
1] 二列不要だから削除したいが、削除すると「関数」が無くなって違算(エラー)←??
2] 毎月行数の増減があるので最終行が決まらない ←必要なら「※」なり「最終行」なりを手入力してでもマクロを走らせるのの役に立てたい←???
3] 画像には無いが、この他に担当者別売上の表がある ←最初の画像の赤丸位置?それとも上下の表の中間?
4] これが1Sheetに1年12ヶ月分タテに並んでいるので各月自在に印刷するのは大変
ざっくりとこんな感じ >>824
印刷したい印刷範囲の右下が毎回変わるので
例えばそこに
「END」という透明文字を書き入れておく場合にはどのような記述となりますか?
これさえ出来れば自分のやりたい事が出来そうです >>826
同じ取引に対してデータ元が2つ有り
パワークエリとパワーピボットで自動取込をするのは販売管理ソフトのデータからが1つ目
こちらは自動的に取り込まれていて
簡単に得意先別、担当者別、商品別の合計や詳細は把握出来る
EXCELで報告資料を作る元データは、他の人が社内共有用に作っているEXCELファイルから
この2つのデータが合っている事を確認する必要もある
最初の質問から有りとあらゆる事を書き出すなんて無理だよ
後から話が違うと言われようが
説明するために簡便化した資料でやってるんだし
てゆーかあなたはVBAの技術は無いんだから無理に話に加わらなくても良いよ で、それはVBAで出来るならそれでもいいけど、普通の機能でも十分賄える作業
範囲に名前を付けて(例えば01y とか01t とか)印刷時にページ設定のダイアログにその名前を入れて印刷するだけ
(もしくは、名前ボックスで選択して[印刷範囲に設定]でもいい ソッチのが楽かも)
範囲が重複しても名前付けは出来るんだし、せっかくの機能を使わない手は無い
11月に成ったら11yや11tを入れてやるだけで広範囲のうちそこだけをプレビューしてくれる
範囲が増減するってなら Offset使った範囲にしとけば行が増えても対応してくれる その名前付けを上手にできるかどうかがカギ 販売管理ソフトに全ての詳細情報を付加する機能が無いから、会社に必要な付随情報をEXCELで付与して管理させている
だから一つの取引に対して2つデータが存在してる >>827
Sub main()
Dim rng As Range
Set rng = Range(Cells(1, 1), Cells(2, 2)) '①
ActiveSheet.PageSetup.PrintArea = rng.Address
End Sub
みたいな感じで、①を都度指定したらできませんか? >>829
そんな事するよりも
>>827
これを一発VBAに入れた方が楽じゃね? EXCELのデータが正しい事もあれば
販売管理ソフトのデータが正しい事もあるので
二重にすることで間違いのチェックにはなっていると思う 一元管理は入力ミスがあるとそのまま行ってしまう恐ろしさがある >>827
最終行列を取得して範囲指定するのなら
cells(rowscount,1).end(xlup).row
cells(1,columns.count).end(xltoleft).column
で最終行列を所得できます
キーワードを使った場合、
cells.find('end')でオブジェクトを取得しますけど
他のセルにキーワードが紛れていたら終わりますので非推奨かもですね
キーワードを最終セルにするというのなら
findを使って最終セルを取得して範囲指定に利用できそうですね >>831
単純に印刷したい範囲の右下に
ENDとか※とか右下とかの文字を入れ込んでおいてそれをVBAにするのは難しいものなのですか? そもそもが、全体のデータをどう扱うかのイメージが出来ていない
都度継ぎ接ぎだらけの思い付き・間違ったインスピレーションで作業しているだけ システムの九龍城砦を築いてるようなもの
毎月最終行に「最終行」って手入力することが自動化の助けに成ると思うならそうしてみりゃいい
その手間の時間で印刷終わってる 何月がいちばん上の月か知らんが、年度途中の月、7月とか8月でもそれで動作するシステム組めるのか?
ボタンを12ヶ並べるつもり? 年度途中の月を印刷するためにひとつのボタンで解決させるには、もっと苦労を重ねるけど?
プログラムを書くためにExcel使ってるんじゃ無い 楽するために使ってんだ >>836
すんません
入れ違いで書いてしまいました >>838
仕方が無いじゃん
自分で作ったシステムじゃないんだし
前任者が全て手動で半日掛かった仕事を5分で出来るようになっただけでもマシになったとは思う >>839
いえいえ、こちらこそ要領が悪くてすみません
findでキーワードを検索して、該当セルを取得したら
そのセルが何行目何列目なのかを取得できますので
それを>>821の範囲に利用してみたらいけるかもですね >>838
月に一回だけ
ENDと入れるだけで
一ヶ月にかなりの時間を節約出切るのが分からない??
行や列を挿入するだけだから
ENDと入れるのは一回だけ
なんなら前月のシートを使えば、それすら要らなくなる
ほんとお前は性格悪いね >>841
キーワードを
ピロリちゃんとか
絶対に使わないであろう言葉を使えば良いかもですね 縦向きえんど
横向きえんど
この文字を透明色で埋めておけば良いかな
上書き出来ないようにセルを保護しておく?
そうすりゃ毎月何も設定しなくても良くなりますね >>844
そんなことより「ハゲでも分かるExcel VBA入門」という本を読めばいい。
分かりやすくてすぐ上達。 >>835
入力チェックはまた別の話
帳票毎にデータが違う方が怖いわ >>817
レスサンクスです。
ということはYukkuriが100人いたら、
Dim Yukkuri?? As New Dictionaryを100行要るてことになるてこと?
timeline.Add Yukkuriのところで、timelineが使ってるメモリが追加でアロケートされ、
そこに連想配列が追加されるていう動きにならんのかね?
それか連想配列の実体をコピーできるとか。 >>846
ところで会社で嫌われてない?
その方が心配だわ >>848
別の話だろ
Excelと販管ソフトに個々に入力してるから安心とか言うならそれは単に二重入力してミスを見つけてるだけの話
>>851
まあこんなことを言い出すやつなんだろうけどw >>849
だから何をやりたいのかいまいちよくわからんけど100個コピー作りたいならループで回せばいいだけ
新規のDictionaryはループ中で確保する
timeline.Add Yukkuri
Dim N As Long
Dim Yukkuri1 As Dictionary
Dim Key As Variant
For N = 1 To 100
Set Yukkuri1 = New Dictionary
For Each Key In Yukkuri.Keys
Yukkuri1.Add Key, Yukkuri(Key)
Next
timeline.Add Yukkuri1
Next >>853
2つにそれぞれ意味があるから良いだろ
ソフトは客先に納品書や請求書をプリントしたり、EXCELは社内の全ての管理をしやすいように情報付与、そしてその2つが在る事でどちらのかの入力ミスを防げる
この仕組みで会社が儲かってるんだからケチ付けられんわ俺も >>814は恐らく連想配列が欲しいわけではなく、
javascriptやpowershellにあるような動的なプロパティが欲しいんだろう
VBAではそういう便利なものはないので基本ノードデータにジャグ配列を使って
ノードの先頭にプロパティ名に相当するタグを付けていった方が記述量的にも混乱が少ないと思われる >>814の意図を汲んだデータをジャグ配列のノードで表記すると恐らく以下の様になる
dim timeline_root
timeline_root = array("timeline" _
,array("Yukkuri", array("Name", "霊夢"), array("serif", "霊夢です")) _
,array("Yukkuri", array("Name", "魔理沙"), array("serif", "魔理沙だぜ")) _
)
配列の要素0に必ずタグ名が入るようにすれば、HTMLのDOMツリーのように一環した探索ロジックが組める >>857
やろうとしてることは、ゆっくりムービーメーカー4の定義ファイルをVBAで編集すること。
ゆっくりムービーメーカー4の定義ファイルはJSONになってて、
VBAではJSONが使えないから、誰かが組んだVBA-JSONを使うと
JSONがVBAのコレクションやディクショナリー(連想配列)で作られたデータになる。
そこなかで、セリフが定義されてるを連想配列を複製してセリフ書き換えてくてことをやってるんだけど、
VBAのSETて参照するだけで、その参照したものを上位の配列にaddしても、
参照先情報みたいなものがaddされるだけで、別メモリーの情報がaddされるわけじゃない。
ただ、試行錯誤していたら
一旦同じ連想配列をaddしたものを作って、
それをjsonにして、またそのjsonを連想配列に戻してやれば、
別メモリが割り当てられた連想配列が出来上がった。
そのあとは個別に要素を書き換えられる。
javascriptとかは
.配列.push({...Yukkuri[0]})
とかやれば行けたんだが、VBAは無理なのか。 >>858
処理対象がjsonなら最初からそう書けばいいのに
いくつか手段はあるけどVBAでやろうとすると結局面倒だし特に理由が無いなら他を検討してみては
VBA-JSONの使い方の話なら俺は知らん >Excelと販管ソフトに、個々に入力してるから安心
もし、この2つが異なった値なら、システムが破綻しているw
オリジナルは1つのみ!
そして、バックアップ用のコピーを持つべき! 例えば、銀行のシステムでも、2つのオリジナルを持たない。
3人が同時入力して、多数決でオリジナルを決める
サーバーでもそう。偶数個のノードにしない。
1:1, 2:2 などの分断が起きて、どちらがオリジナルか判断できなくなる
必ず、奇数個で判断して、オリジナルを決める。
そして、オリジナルのバックアップ用のコピーを持つ
そうしないと、システムが破綻する >>861
知らんがな
システムの良い悪いの判定なんてお前らに求めて無い事を察しなさい
俺以外の社員含めて理不尽な事をやってるなと思いながら仕事をしてるんだから
70歳の引退予定の上司に言ってくれ
そいつがいなくなればスッキリさせる >>862
例えば3人で販管ソフトに入力したとして
その販管ソフトの仕様により、会社の必要とする情報を持てない場合はどうするんですか?
そもそも一人しか人的資源が無い場合はどうするんですか? >>872さんはキーワードで所望の範囲指定はできたのでしょうか? >>865
変数を定義して範囲の右下のキーワードを拾って
ActiveSheet.PageSetup.PrintArea =
のところにその定義した変数を入れてやるという理屈で合ってますよね?
後はフサフサでも分かるEXCEL VBAの本が到着してから勉強します >>858
> VBAのSETて参照するだけで、その参照したものを上位の配列にaddしても、
> 参照先情報みたいなものがaddされるだけで、別メモリーの情報がaddされるわけじゃない。
だから新規に作ってコピーしなよって書いたのに...
コードまで書いたのに無視するんならもうさじ投げるわ >>869
新規に作るていっても、複雑な連想配列の塊をどうやって作る?
サンプルはたかだなNameとserifしかキーがないけど、
キーがいっぱいある構造のデーターをコード内でコピーするロジックを書くのは無理だと考える。
しかもその構造が動的だったらお手上げ。 質問スレに回答してくる人は善意でやってるだけで最終的に自分で解決できないならあきらめろって話 >>870
> キーがいっぱいある構造のデーターをコード内でコピーするロジックを書くのは無理だと考える。
> しかもその構造が動的だったらお手上げ。
お前にはお手上げなだけだろw
>>854 に "Name" とか "serif" なんて書いてない、キーを動的に取得してコピーしてることすら読み取れないレベルなら諦めたほうがいいと思うよ マクロでやりたいなら行数が最大になるパターンで書式作っておいて、そこにデータ入力、不要な行の削除でそのまま印刷すればよくね? >>872
すまんできたわ。
ありがとう。
Set Yukkuri1 = New Dictionary
を書く位置を間違えてた またVBAが壊れた。
プロシージャの中でオブジェクト変数に割り当てる
ワークシート名やクエリー・テーブル名を
日本語にしているのはマズい? vbaが壊れるという表現が分からない
プログラムは組んだようにしか動かない 先週までは問題なく動いていたブックを開くと、
すぐExcelが落ちて回復が入ってしまい、
回復ブックを開くと、プロシージャがモジュールごと丸々なくなっていた。
ワークシートのクエリーやテーブル、計算式やグラフは壊れていなさそうで、
新たにモジュールを作り直して
バックアップを取っていたプロシージャの記述をそのまま貼り付けたら、
一応、VBAも動くようになった。
過去には新たなモジュールすら作れなくなったことも。 過去に学んでこの際だからぜんぶ変えてしまおう またいつアプデ地獄に巻き込まれるか知れたもんじゃ無いし
https://qiita.com/Q11Q/items/7a9d4c89726cfaa7abd6 「VBAが消えてしまった!マクロが壊れて動かない!」
ってな感じで検索してみたら? ACCESSで、NLSの問題でカナ含むVBAモジュールが開けなくなるってのはあったな >>881
ああ、そういえばIMAGE関数が家庭向けサブスクにも配布されたからと、
日曜日にExcelをバージョン2301に更新したんだった・・・ これが原因かどうかはまだ分からないけど。
https://i.imgur.com/49fEgC7.png
Office Insiderには参加していない。 >>886
10年ぐらい前、変数を日本語名にしてると一切動かなくなるってバグがあったな
確かACCESSだった
変数を日本語名にしても、あまりいい事はないと思う
>>878
あと、この方法はあまり良くない
一度壊れたブックは、内部的にゴミデータが残っている可能性がある
使いまわすと、そことバッティングする可能性がある
新規ファイルを作り、シートを一つずつコピー、vbaもテキスト単位でコピー、
といった感じで作り直した方が良い
めんどくさいけど、やっておいた方がいいよとは言っておく >>887
> といった感じで作り直した方が良い
やっぱり・・・orz ドイツのプログラマーが、Selenium、WebDriverを使わずにEdgeを直接制御するクラスを作ってるのを見つけた
試したらとりあえず動いたんで報告
https://www.codeproject.com/Tips/5307593/Automate-Chrome-Edge-using-VBA
動作テスト中にはまった点を書いておくと、裏でEdgeのアップデートチェックが走ってるとエラーが出て止まる
これだけ殺せば動く
taskkill /f /im msedge.exe
taskkill /f /im MicrosoftEdgeUpdate.exe
あと、Edgeの起動オプションを
--remote-debugging-pipe --disable-automation
に変えるとコマンドラインウィンドウが出なくなる Dim a As Long
Dim b As Short Dim a As Single
Dim b As Double
Dim c As Triple フサVBAの本が届いた~
分からないとこはよろしく >>889
どうしてわざわざEdgeをチョイスするのかと Edgeと言いながらプロトコル的にchronium系共通だし
OSに元から入ってるEdgeならIE難民にはちょうどいいんじゃね 他社との業務連携用途とかだと他の選択肢が無かったりする 質問です
VBAを使ってこのスレの人にアンケートを取りたい
皆さんは文系ですか?理系ですか?
もともとプログラミング出来る人ですか?
それとも経理とか必要に迫られて覚えた方ですか? 文字列の演算をエラーにする方法は無いでしょうか
Sub foo()
Str a
Str b
Str c
a = 1
b = 2
c = a + b
Debug.Print c
End Sub >>903
お、マイナスだとエラーになるんですね!
・・・ならんやないかーい 皆さんはお仕事何されてますか
事務をやって三年、仕事を楽にするために始めたExcelVBAは人並みに身についた気がしますが
ただの事務では給与が足りずプログラマに転向するには経験が浅いのです エクセルのvbaエディタ?がすごくつかいずらくて、
vsCodeでvbaが記述できるxvbaというツールを利用しようと試みています。
ですが、
エクセルで書かれたvbaの日本語文字が、vsCodeで読み込むと文字化けしてしまいます。
おそらく、エクセルの方のエディタがUTF-8ではないのかと思いますが。
このあたり、経験されているかた。どのように対処されていますでしょうか?
どうぞアドバイスください。 >>906
よく分からんけど逆にVSCでCP932使えば良いのでは? >>902
質問の意味が分からんけどそもそもabcをStringにしてるのはなぜ?
c = a + bに3と戻したいならc = Val(a) + Val(b)とでもすれば > Str a
> Str b
> Str c
なんていう謎の言語はスレ違いかと >>905
転職なら早い方がいい、年齢が若ければ新しい職場にもすぐ慣れるだろうから >>902
エラーにするってのがよくわからんが
個人的にはc=a+b以降をしたのようにする。
If vartype(a) = vbstring or vartype(b) = vbstring Then
Debug.print "エラー"
Else
c= a + b
Debug.print c
End If
End Sub
>>908
a=1 と直接書いてるけど本当は
a=どっかのセルの値にしたいんじゃね?
で、そのセルには数値以外が入ってる可能性があるから
文字列ならエラーにしたいんじゃないかと。
>>909
文字列に変換するstr関数を使いたかったんじゃね?
書き方間違えてるから謎の言語になってるけど。 Transposeで作る配列の
一番最初の要素の添字は0じゃなくて、1であってます? >>902
(1)たとえセルの書式が文字列でも
(2)数字っぽい内容だと
(3)勝手に数値型に変換されてしまう
https://i.imgur.com/0xrxf44.png
何がやりたいのか、ぼかさずに具体的に説明してくれないと無理 >>908
単純にコードのミスを検出したいだけなんです
変数名を間違えた場合の保険程度のつもりなんです
>>909
すいません
別言語触ってて何もかも間違えました
変数宣言dim a as stringのつもりでした
Sub foo()
Dim a As String
Dim b As String
Dim c As String
a = 1
b = 2
c = a + b
End Sub >>915
それなら素直にlongで宣言するべきでしょ
変数名間違えた時の保険って、紛らわし変数名にするなって話だし
変数名間違えたときのための保険って言い出したら何も出来ないじゃん
じゃあその「変数名間違ってたときの確認のためのコードの」変数名が間違ってたらどうするの?
その確認のための変数名確認のためのコードをつけるのか?
それが間違ってたら?
確認のための変数名確認のための変数名確認のためのコードをやるの?
って話になる >>916
逆で、文字列を数値として使ってしまった場合に検出したい
単にタイポ時の保険としてエラーが起こってほしいってだけだよ
vbaに無いなら仕方ない、そういう言語なんだなってだけで
別にそこには期待しないよ 少し上にいた大量にレスしてた奴みたいなおかしな質問者もいるし
適当に質問しても回答者が頑張ってくれるだろみたいな考えの質問者が多すぎなんだよ >>915
とりまOption Explicitは入れとけ
それ以上はVBA単独ではどうにもならん
型安全な処理系と組み合わせろ >>917
あのさぁ、自分の説明が下手くそなくせにできないのは他人のせい、言語のせいにするのはよくないぞ
単にタイプミスって言っても自分がコード書くときにミスしないようにしたいのか、使う際にinputBox等で入力させるときにミスをなくしたいのかで全然違うだろ
エスパーじゃないんだから質問するならもっと具体的にしろよ >>921
いやinputboxなら全部文字列だろ ExcelVBAは型に対する考慮が緩いから正直期待にそえる回答はないと思うよ
例えば変数名の先頭に型を付与するようなルール決めてもタイプミスって言葉で許されるなら破綻するだけだしね >>923
だから、最後までちゃんとかけや
それはinputBoxを格納する変数の話だろ
そんな話はしてないわ
色々な具体例があって様々な解決策があるのに、なんにも具体的な話を出さずに抽象的に話しして、一部に対してだけ反論してお前は馬鹿か? >>924
ですよね
ありがとうございました
>>925
質問を理解できないアホw つーか
「単純にコードのミスを検出したいだけなんです
変数名を間違えた場合の保険程度のつもりなんです」
本当にこれだけだったら先頭にOption Explicitつけて似たような変数宣言するな、で終わる話だよな
さすがにOption Explicitをつけてない人はいないだろうからそんな超初歩的な事はありえないと思ってるけど >>926
え、>>924で解決したのか?
ってことはマジでOption Explicitをつけてなかっただけ?
そこまで超ド初心者だとは思わんかったわ やっぱり
こういうのを相手にするのがそもそもの間違い IF Not Isnumeric( a + b ) then c = a + b
とか
c = a & b
とかの雑魚コードでも教えておけばよかったのに a = 1 の暗黙の型変換でエラーにしたいならそう言えよ >>928
なれると初心者の質問だって見抜けるようになるよ 質問が雑だと回答する側は色々考えるからこういう感じになるんだよ
だから質問する側もちゃんと回答しやすいようにすればいいだけ そんなの期待するだけ無駄
そっとスレを閉じればいいのよ 零細企業のアホみたいな奴に答えてやろうなんて思うから荒れる
助けてで始まる質問する奴や、頭が悪いのに自分はできるみたいに思っておかしな質問をする奴は無視するのが一番 てゆーかそんな事を言うやつがわざわざこんなとこ見るなよ
教えてやってるみたいな立ち位置でさw そもそも
> Str a
> Str b
> Str c
の時点で実際に動かしてないんだから相手する価値なし 相手にしたくないならほっておけばいいんだから無駄なレス書いて荒らすなよ
>>926
サンプル書けばわかると思うけど例えば下のようなコードは最後の数値型に数値以外の代入のみエラーとなるからコーディングミスしないように注意するしかないという話
Dim a As String
Dim b As Long
a = "a" '文字の"a"
a = 1 '文字の"1"
b = "1" '数字の1
b = "a" '変換エラー
>>928
そういう話じゃないと思うぞ キチンとString型を宣言しているなら確か
+は文字列連結の意味になるんじゃなかったっけ?
であれば前のレスで言ってた人がいたけど
- 0とか*0とかすればエラーになるんじゃないかな?
逆にSQLとかで文字列を数値で扱いたい場合は
*0とか-0とかにすると暗黙の変換で数値にしてくれる。
VBAでは型宣言は絶対だけど、
VBSみたいにスカラー変数を使う場合は
VBAみたいな型指定の型宣言が出来ないんで少し戸惑うかもね。
でもここはVBAのスレなので、
基本的に型宣言は絶対だと思っていいと思うよ。 >>944
>+は文字列連結の意味になるんじゃなかったっけ?
ならないよ >>944
> - 0とか*0とかすればエラーになるんじゃないかな?
暗黙の型変換がある以上、数値として認識できる文字列が入ってたらエラーになるとは限らん
VBAは型宣言はあるけど、Variant型と暗黙の変換があるから、絶対とまでは言えないのだよ
>>947
イミディエイトウィンドウの内容なんて書き換えできるからな
釣りじゃないってんならちゃんと詳しい環境かいてみ >>944
>+は文字列連結の意味になるんじゃなかったっけ?
JavascriptやRubyの話だね 演算子一覧表
https://support.microsoft.com/ja-jp/office/e1bc04d5-8b76-429f-a252-e9223117d6bd
連結演算子
& 2 つの文字列を組み合わせて、1 つの文字列を作成します。
+ 2 つの文字列を組み合わせて、1 つの文字列を作成し、Null 値を伝達します (一方の値が Null の場合、式全体が Null と評価されます)。 VBAはあまり書かなくて理解足らないのは承知しているが、
配列に0から200の値を書き込むサンプル
これは、型があわないとアラートが返ってきます。
ダメな理由を教えてください。
Sub test()
Dim arrs As Variant
Dim i As Long
For i = 0 To 200
arrs(i) = i
Next i
End Sub 全ての行に「Debug.Print TypeName(arrs)」を入れてみると何でダメかわかってくるかもね >>951
Variant型は便利だけどVBAでは取り扱いが初心者には難しい方だと思う
昨日も変数の型のことで荒れてたけど、できるだけ適切な型を指定した方がバグになりにくい
そのまま動くようにするなら
Sub test()
Dim arrs() As Variant
ReDim arrs(200)
Dim i As Long
For i = 0 To 200
arrs(i) = i
Next i
End Sub
俺が推奨したい書き方は
Const arr_max = 200
Sub test()
Dim arrs(arr_max) As Long
Dim i As Long
For i = 0 To arr_max
arrs(i) = i
Next i
End Sub ありがとうございます。
>>954
JSなら。こんな感じ。
var arrs = [];
for (var i=0; i<200; i++) {
arrs[i] = i;
} >>952,>>953
ありがとうございました。VBAの配列は癖が強いねえ。 >>955のコードはarrsは配列として宣言するような代入してるけど
>>951は配列の宣言がどこにもないからね
癖というよりも単なる勘違いでしょ >>953
200個の要素数が確定されている場合ですかね。
将来配列の要素数が変わることがわかる場合、
どうなりますか。
うーん。
VBAで配列操作するより、セル関数でデータを加工していった方が早いし、
分かりやすい気がしてきた。 >>960
VB(VBA)の場合は配列の再定義するためのRedimというのが用意されている
Dim a(0 to 200) as long
Redim Preserve a(0 to 1000)
とすることで0から200までの値を保証して0から1000までの配列に拡張ができる
まあ正解なんて1つじゃないんだから自分にしっくりくる作り方でいいと思うけどね
あと細かいようだけど>>955の「for (var i=0; i<200; i++) {」は
VBの質問に合わせるなら「i<=200」が正しいんじゃない? >>960
DimRedimは先に回答した人がいるから
>VBAで配列操作するより、セル関数でデータを加工していった方が早いし、
>分かりやすい気がしてきた。
用途にもよるが分かりやすさとしては間違いなくそう
VBA分からないやつでもどんな操作をしているか分かるのはでかいし
特異なケースのテストもわりと少ない手間で試せる
データの成形入れ替え並び替えは全部関数でやって
そうすると関数の参照先シートを変更する度に重くなるから
マクロでは関数が入ったブックの呼び出しと
操作するデータを参照先シートにコピペする作業を任せる
こんなやり方もあり
一応配列格納のほうがいちいちセルの読み取りしない分速いことは速いが
VBAで書き出す手間とエラーチェックの手間と
仕事ならそれを誰かに引き継ぐことを考えると…って感じ ありがとうございます。
そうですね。「i<=200」が正しいです。
要素数をいちいち定義したり再定義しないといけないのは
ちょっと不便ですね。自分でも他の方法ないか調べてみます。
データとして直接見えるというのが、セル関数の良さですね。
VBAの配列だと中のデータ見るのに手間かかる。
参考になりました。みなさんありがとうございました。 別に要素数が不確定ならそれなりの組み方があるけどな わかった気で勘違いしている馬鹿の間違いや馬鹿さ加減を指摘したら泥沼になるだけだから相手にしたらいかんということだよ
零細企業のアレとか つまり、>>965を相手にしてはならんということすね。
ありがとう。 >>963
まぁScripting.DictionaryかCollectionでも使えば?
二次元配列的な使い方をしたいならついでにクラスのお勉強もしておけばいい。
他にもRecordsetを使うという手もある。 >>967
結構、俺のこと好き?
匿名掲示板において個人を認識してもらえるのは書込み冥利に尽きるよ
愛情の反対は無関心だからな 愛される零細おじさんでつ
自分の業務をEXCELでメニュー作ってボタン一つで飛ぶようにしてるんですが
例えばEXCELにみずほ銀行のアイコンを貼り付けて押せばみずほ銀行のEB画面に飛んだり
売掛金回収ならボタン押せば売掛金管理のファイルを読み込んだり
流石に他のソフトを起ち上げたりはVBAでも無理ですよね?
おっPythonとかなら出来るんですか? >>971
EB画面は知らんがスクレイピングじゃだめなのか?
売掛金のファイルがcsvならパワークエリで取り込めばいいと思う ハイパーリンクを調べても、それじゃ無い って結論に至って質問してンのか? あ、書き方が悪かったか
愛される零細おじさんでつ
自分の業務をEXCELでメニュー作ってボタン一つで飛ぶようにしてるんですが
例えばEXCELにみずほ銀行のアイコンを貼り付けて押せばみずほ銀行のEB画面に飛んだり
売掛金回収ならボタン押せば売掛金管理のファイルを読み込んだり
以上はハイパーリンクやマクロ記録を使って実現出来てる
売掛金管理ファイルを呼び出した後は、更新ボタンを押すことでパワークエリを使った集計も実現出来てる(更新ボタンを押さたくても更新させる事は出来るがあえて更新前の数値を確認するためにそのようにしてる)
流石に他のソフトを起ち上げたりはVBAでも無理ですよね?
おっPythonとかなら出来るんですか? 要するに販売管理のパッケージソフトや会計のパッケージソフトを起動させて全自動を追求したくなったという質問です
例えばEPSONの会計ソフトなら定番の資料は自動的に出力出来るのは知ってるが、今使ってるのは毎回、手作業でボタン押さないと出力出来ないんだよね ファイルの意味判ってンのか? 基本のキが欠落してるような
そして、そんな奴が改悪し続けてるExcel Book 数年後に後任に引き継がれて「なんだよ、これ」に成り果てる
そもそも、上司に了解得ているのか?社内のコンプラどうなってんだ おれがコンプラか 社内規定の意味でのコンプラだが >>980
お前は毎回理解力が無いな
既に先人が中途半端な仕組みを作ってるからそこに出力を合わせる事を考えてる
このやり方は後任には引き継がない
前任者の手作業を教えるq >>977
この時点で読み違いしてるやん
会社でお荷物だろw いけね、ついうっかり980踏んでた
無理だから安価指定しないけど、誰かお願いします >>982
お前は他のソフトを立ち上げることとそのソフトのボタンを押すことの区別もついてない時点で>>977以上のお荷物だろ
就職してるかどうかは知らんがw >>986
は?
ボタンはEXCEL上で作った奴の話だぞ?
ソフトのアイコンクリックじゃないぞ? あ、ハイパーリンクでソフトの起動まで出来るのか
それは失礼しますた >>987
EPSONの会計ソフトの話だろ
> 例えばEPSONの会計ソフトなら定番の資料は自動的に出力出来るのは知ってるが、今使ってるのは毎回、手作業でボタン押さないと出力出来ないんだよね
そもそもExcelのボタンの話ならそのボタンに紐づいてるルーチン呼び出せばいいだけだし となると、そのソフトでダイレクトに帳票印刷のEXEファイルがあるならそれをリンクさせれば良いのか
分かったありがと >>989
いやEPSONは前職で使ってた奴
でも今のもその実行ファイルを直接起ち上げれば行けるね >>991
お前の前職なんて知らんがな
とにかくそう言うことをやりたかったんだろ
としか受け取れないわ でも一般のアプリケーションてその実行ファイルがどれか公開してる?
あ、アプリの動作を監視してるファイルを見れば良いのか? To: 各位
無能の働き者がワッチョイ無しで次スレ立てちまったんだがどうする?
ワッチョイありで立て直す? >>995
> でも一般のアプリケーションてその実行ファイルがどれか公開してる?
そんなことも調べられないならすっぱり諦めるなり人に頼むなりしなよ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 89日 22時間 30分 23秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。