早速質問
今vbaでマップ使って
とある表の集計を行なっております
一つのkeyに対しアイテムが複数あるので
配列で入れようと思ったのですがうまくいきません
何か良い方法はありませんか?
Dim dic
Dim a()
redim a(1)
a(0)="test1"
a(1)="test2"
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "key1", "アテネ"
dic.Add "key2", "ベオグラード"
dic.Add "key3", a
msgbox dic("key3")(0)
msgbox dic("key3")(1)
マップをやめて配列「で」入れる
って意味にとってたけど
マップの中に配列「を」入れる
って意味かよ
アイテムが複数あっても同じkey 使えばいいんじゃねと思った
いい言葉を見つけた
Those who know don't talk. (知ってる人は教えようとしない)
Those who talk don't know. (教えてる人はあまり知らない)
立て乙です。
自宅にエクセル環境が無いのでうろ覚えで
細かい間違いはあるかもですが、該当箇所以外はokという前提です
日本という名前のブック
各都道府県名のシート
があるとき
Dim Bn as Workbook
Dim T as Worksheet
Set Bn = Workbooks("日本")
Set T =Worksheets("東京都")
Workbooks("日本").Worksheets("東京都").cells(1,1) = "123"
Bn.T.cells(1,2) = "456"
を実行すると
上段は問題なく実行されて、東京都シートのセルA1に123が入力されますが
下段でエラーがでてしまいます。また
Bn.Worksheets("東京都").cells(1,2) = "456"
T.Worksheets("東京都").cells(1,2) = "456"
のどちらでも動きました
ブックもシートも両方変数で指定するとエラーになってしまうのでしょうか?
ブックもシートもそれなりに切り替えるので、可能であれば別で指定したいのですが……
心当たりがあればご教示いただけると助かります。
>>10
× Bn.T.cells(1,2) = "456"
○ T.cells(1,2) = "456"
オブジェクトの操作は慣れが必要だけど、こういうもんだと思っておくれ >>10
Bn.Tだと
workbookオブジェクトにTって言う属性や関数が無いからエラーになるのは当たり前 >>10
> Set Bn = Workbooks("日本")
> Set T =Worksheets("東京都")
ここは
Set T =Bn.Worksheets("東京都")
って書くべき 返答ありがとうございます。
やっぱり両方同時に変数指定はできないんですね……
何というか、指定先が変わる度にセットするのは見づらいような感じがしてまして
明日何とか考えてみようと思います。ありがとうございました
>>10
名前(Workbooks)が一致していればいいってものじゃない。
オブジェクト.メンバ という構文なんだよ。メンバとはそのオブジェクトが持っているメソッドとかプロパティとかのこと。
しかし Bn.T と書くと、オブジェクトとオブジェクトを . で繋いだことになり、これは意味不明なものになる。 コレクションかユーザー定義クラス使うかしたらいいと思うが
>>16
質問者はオブジェクト.メンバの構文の意味が分かってなくてオブジェクトブラウザも見たことない人なんだろうな
オブジェクトのメンバ名を指定してメソッド関数やプロパティ関数を呼び出すことで別のオブジェクトインスタンスのコントロールを取得しているんだってことが理解できてないんだろう >>10
>T.Worksheets("東京都").cells(1,2) = "456"
これホントに動いたのか?
WorksheetにWorksheetsプロパティとか無かったはずだけど
何がやりたいかよくわからんが
とりあえずブック名とシート名受け取って該当Worksheet返す関数作ればいいんじゃないかと ワークシートchangeでtargetのA1が代わったらコードが流れるようにしてて、それ以外はexitで抜けてるんだけど、コードがセルに転記してて毎回changeの所に戻ってはexit、戻ってはexitで見辛いのはなんとかなりませんか?
>>20
マクロの実行中に何度もセルに書き込みが発生する処理が美しくないので設計を見直す。 EnableEvents=False
でイベント制御したらだめなの?
SolverOk関数のEngineまたはEngineDescの引数の規定値って何でしょうか?
>>24
俺の使ってるバージョンだとその引数が無いっぽいから分からんけど
オブジェクトブラウザで表示させれば分かるんじゃね MP4ファイルのプロパティ値を取得するプログラムでエラーが発生してしまいます
★の箇所で「'NameSpace'メソッドは失敗しました:'IShellDispatch6'オブジェクト」のダイアログが出ます
参照設定Microsoft Shell Controls and automaitonを追加してもだめでした
解決方法がわかれば教えてください
Private Sub CommandButton1_Click()
Dim Shell, Folder
Set Shell = CreateObject("Shell.Application")
Set Folder = Shell.Namespace(range("A1").Value) ←←←★
>>26
こちらのサンプルでとりあえず動きましたお騒がせしました
Dim FSO As Variant, SHell As Variant, Folder As Variant
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SHell = CreateObject("Shell.Application")
Set Folder = SHell.Namespace(FSO.GetFile(Songs(1)).ParentFolder.Path)
Cells(1, 1) = Folder.GetDetailsOf(Folder.ParseName(Target), 0) エクセル2013を使用しています。
今、日付を手入力しているのですが、何かで見たのですが
カレンダーから選択して入力できる機能があるのですがエクセルでもできる方法ないでしょうか?
いろいろさがした所アクセスはできるのですがエクセルは標準でもなく
カレンダーコントールなるものあるみたいですが、アクセスもインストールしていないので
VBAマクロの中にもありません
>>14
両方同時にではない。
Worksheetを変数に入れたということはブック情報も込みで入ってる。
だから便利なの。
Aブックのαシートを変数に入れてもその変数でBブックのαシートにアクセスできるわけじゃない。
君のBn.T式のやり方だとBブックのαシートにもアクセスできることになる。
それはBn.Worksheets(T)式と変わらない。
一方、もしBブックのαシートにアクセス出来ないのならBn.T式の意味が無い。
T式で良いわけだから。 >>27
動くのは結構なことだけどFSO無くてもファイル情報取れるよ。
他の部分で便利にFSO使ってるなら良いんだけどその部分だけ見たら無駄だよね。
Dim objShell As Object
Dim objFolder As Object
Dim objFItm As Object
Set objShell=CreateObject("Shell.Application")
Set objFolder=objShell.Namespace("C:¥Users¥Hoge¥Desktop")
Set objFItm=objFolder.ParseName("fuga.txt")
Debug.Print objFolder.GetDetailsOf(objFItm,3)
参照設定とか書いてるけど、それぞれの意味分かってる?
CreateObjectってのは、その場で名前を元にオブジェクトを作成する。
だからコード書いてる間にはどんなメソッドやプロパティがあるか分からないからインテリセンスでの候補が出ることもない。
参照設定は使うオブジェクトを事前に指定することでオブジェクトの型とかメソッド、プロパティにアクセス(インテリセンス等)しやすくするためのもので、CreateObject使ったり、オブジェクトの型をObjectにしてるんだったら意味がない。
CreateObjectで生成出来ないのも有るし参照設定のがある意味上位互換だけど人にコードを提示する場合は参照設定するよう指示も書かなくちゃなんないからCreateObjectでの例が多いんだけどさ。
もちろん、参照設定したら動くようになるなんてことも無い。
Dim objShell As Shell
Dim objFolder As Folder
Dim objFItm As FolderItem
Set objShell=New Shell
Set objFolder=objShell.Namespace("C:¥Users¥Hoge¥Desktop")
Set objFItm=objFolder.ParseName("fuga.txt")
Debug.Print objFolder.GetDetailsOf(objFItm,3) 参照設定は極力しないほうが良いよね
参照設定を忘れてドハマリすることがたまによくある
>>28
エクセルでも出来るんだけど非常に上級者向けなんです。
上級者でも自分で1から組めない人が多いんじゃないかと思う。
上級者って何?、お前の勝手な分類だろって言われればそうなんだけど。 >>28
エクセル アドイン カレンダー
で検索すれば色々見つかるよ
使いやすいもの選べばよろし >>28
UserForm使えば簡単に自作できますよ。
年と月用のテキストボックスをつけて、年と月それぞれ増減させるために、スピンドルボタンをつける。
日付表示用のラベルを必要数用意。
年と月のテキストボックスの値に応じて、ラベルの表示を変更。
ラベルのクリックイベントで、年と月のテキストボックスとラベルのテキストを連結して、日付に変換。
ラベルのクリックイベントは、クラスでまとめれば、クリックイベントをたくさん書く必要もありません。 コードっていろんなパターンあってたくさん書いてると思うんだけど、コードの保管ってメモ帳??
>>36
エクスポートできるよ
gitとかsubversionとか使えばいい 連投すまんが、セルを方眼紙にして、フォームの中に直線コマンド、円コマンド、角コマンド等CADみたいなそれぞれ押したらそれが、反映されて作画って出来る?
>>38
できるかできないかで言うと出来る
各図形の位置に当るセルの背景色を変えれば良いだけ >>36
ブログ作ってそこによく使うコードを置いてある
いつでもどこでも検索すれば出てくるので非常に便利 >>38
できるけどかなりめんどくさい
cacooとか既存サービス使った方が良いと思う >>42
他に手軽な方法がないからUserFormで作れるようにしておくのが一番いいぞ。 vbのランタイムをインストールすればDateTimePicker使えるけど、Formでカレンダー自作しておけば簡単に使い回したり配布出来るから一個作っておくといいと思いますよ。
フォルダ1
┗XXX29年10月.xlsx
XXX29年11月.xlsx
YYY29年10月.xlsx
YYY29年11月.xlsx
フォルダ2
フォルダN
フォルダ1内に今月のファイルがあったらコピーして名前を翌月に変更して保存
これをフォルダNまで同じように処理する方法教えてください
年月の取得はユーザーフォームが理想ですが全く分らんので
マクロ実行用ファイルのA1に年、A2に月入力して取得する感じを考えてます
>>47
今月のファイルを探したいならDate関数使えば今日の日付が出るからそっからformatなりyearとmonthくみあわせるなりで取得すればいいからわざわざ入力させる必要がないね
フォルダないのファイル名の取得ならググればいくらでも出てくるぞ
俺はfilesystemobjectを使うけど >>47
まずは最初の部分だけ
今年 = Format(Now, "e")
今月 = Month(Now)
来月 = DateAdd("m", 1, Now)
年 = Format(来月, "e")
月 = Month(来月) 変数に残す必要なかった
今月 = Format(Now, "ee年mm月")
来月 = Format(DateAdd("m", 1, Now), "ee年mm月")
どうしてもカレンダー欲しいんだったらSysDateTimePick32使って頑張るだろうな。
面倒くさいけど他のコントロールもMSFormsを使わないウィンドウ作成もやったことある。
きちんとプロパティ作るの面倒くさいから使いたいものしか実装してないけど。
>>48
ファイル名取得にfilesystemobjectは激重だった気がする。
Dir関数で頑張る方がよっぽど速い。
これが原因でfilesystemobjectは使わなくなってしまった。
他では速いものもあるのに食わず嫌いになった。 >>52
処理対象のファイルのロングパスがDirの引数の字数制限を越えてるときはどうするの? たかがファイル名を取得するのに処理負荷を感じるほど重くなるとか考えられないな。
読み取り先が等速ドライブに突っ込んだCDだったとか、回線の細いNASだったとかなら分かるけど。
>>52
クラスにして使いやすくしてるならDir関数でもいいと思うけど生で使う気は更々起きねーなあれは
めんどくさすぎる
早い遅いは環境次第だろう
何をしようとしたか知らんが なんかWindows10でマクロの挙動が安定しなくなったんだけど、そういうのある?
>>58
語ってるつもりはないし、普通に機能としてあるのに使ってバカにされる筋合いもない vbaでクラス使うメリットあるの?
一応あるインターフェースは使い物にならないし、継承も使えないし、コンストラクタに引数も設定出来ない。
vbaでクラス使うメリット教えて
>>61
たまにある
単体の処理してる間だけじゃなく、しばらくの間は状態を持っててほしいとき
ごく素朴な使い方しか出来ないし、しようとも思わないけど そもそもクラスが必要になるほど大規模なコードを書く用途にVBAは向いてない、使うべきじゃない
ちゃんとした開発環境を使え
会社が許可しないなら転職するか我慢するかの二択、あるいは出世して自分で規則を変えろ
仕事の能率がアップして利益が増えるんなら反対する理由はないだろ
不合理なことを押し付けてくる会社なら、転職も選択肢ってことだろ。日本語ダイジョブ?
クラスを使うとシンプルに表現出来る場合がある。規模の問題では無い。
普通に使ってるとなかなか活用するイメージが湧かないけど、覚えておくと役に立つよ。
ここでも前に書いたけど、配列のラッパークラスとか、一度作ると便利よ
コレクションだと微妙に取り回し悪かったりするからね
これ以上はスレチかな
>>68
そうだよね
ただ、いちいちクラスモジュールを追加しなきゃならないから、使い捨てクラスをほいほい定義しづらい FileSystemObjectのファイル一覧取得が遅いのなんて結構有名な話だと思うんだが。
ハードディスクにあるファイル名全部取ってくるとかすれば分かる。
昔、どっかに比較してる所が有ったんだが見つからないな。
Win32APIが一番速かったがDirでもそんなに大きな違いは出なかった。
が、FileSystemObjectは糞遅い結果になってた。
そもそも自分で組んだら遅くてネットで調べたらやっぱり遅かったという。
クラスは凄く便利だが、無理に使う必要は無いと思う。
個人的には仕様を考えた段階でクラス使うのがぴったりと感覚で分かる。
そういう時以外は使わない。
>>71
そうなんか
まあ、今んとこそんな大量のファイルのやり取りしたことないから体感したことなかったわ
まあ、その辺使うにしても生で扱うよりクラスでまとめちゃった方が取り回し良さそうだがね
その辺は好みなんだろうけどね >>64
まともな言語ならクラスを使うデメリットはないけどVBAのクラスは制限が多すぎて使う意味がない >>59
bit数の関係で安定しなくなったことはある
>>61
多分、ない
class使ったほうが見通しがよくなる場合はあるけど、
正直そんなに変わらんというか、めんどくさくなるだけの場合が多い気がする この流れで突然クソみたいな質問するの恐縮なのですが…
共有で使っているExcelのデータの行がランダムに大量に消える現象が起きてます
多分誰かがオートフィルタかけた状態でうっかり削除したんだと思うんですが、
消えた行に全く共通点が無いので「マクロにウイルスが付いたんだ!マクロやめろ!」って因縁付けられています
まずVBAにウイルスを仕込むならともかく、VBAを使用しているせいでウイルスに感染するって無いですよね?
あとこのコードに行を消すような要素があるか見てもらいたいです
オートフィルタをかけるだけの簡単なコードなんで無いと思うんですが周りに誰も聞ける人が居ないので一応…
簡単な指示だけどすごく頻繁に使うので消したくないんです
Sub filter1()
Range("K2").AutoFilter Field:=9, Criteria1:="<>"
Range("L2").AutoFilter Field:=10, Criteria1:=""
Range("O2").AutoFilter Field:=13, Criteria1:="AA"
End Sub
Sub filter2()
Range("K2").AutoFilter Field:=9, Criteria1:="<>"
Range("L2").AutoFilter Field:=10, Criteria1:=""
Range("O2").AutoFilter Field:=13, Criteria1:=""
End Sub
Sub filter3()
If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData
End If
End Sub
>>76
ウィルスに感染していて、セキュリティをsageているためにウィルスが実行されているというパターンなら考えられるが
其れ以前の問題として
・オートフィルタをかける
・全体をコピー
・ペースト(値として貼り付けなど)
で行が減っている可能性のほうが高いと思う
この仕様
、意外と知られていないんじゃないかなぁ >>78
それって別のシートやブックに貼り付けるときに可視セルだけ貼り付けられているという意味ですか?
別のブックやシートにコピーする事は無いと思うので可能性としては低い気がします…
試しにオートフィルタしながら同じシートに貼り付けようとしたら「コピー領域と貼り付け領域が違うため貼付できません」となりました >>76
まあ、自作マクロでウィルスどうこうはあり得ないわ
コード見る限りでも、フィルターかけてるだけで値の操作はしてないしな
まあ、フィルターかけっぱなしにならないようにブッククローズ時にフィルター解除すれば? >>79
>それって別のシートやブックに貼り付けるときに可視セルだけ貼り付けられているという意味ですか?
そう
>別のブックやシートにコピーする事は無いと思うので可能性としては低い気がします…
そか
オートフィルタならまずこれかなーと思ったけど、コピーペーストしてないなら違うかな フィルターで謎のデータ消失なら質問者の疑念通りフィルターかけたまんま範囲削除じゃねーかな
ありがとうございます
コードがおかしいわけじゃないなら良かったです
一応ここに貼ったコードはAAの部分に別の単語が入ってるだけで他は全て実際に使っているものと同じです
クローズ時にフィルター解除するようにはしてなかったのでやってみます
インターネットが壊れた!みたいなのはやめてください!
エクセルの特定の行だけ消すウイルスとか笑えるわ
まあ、バグ満載のマクロとかある意味ウイルスだけど
ウィルスは簡単に作れるだろ。
リテラシー無い奴が増えたからウィルスとは何ぞ?という議論が必要かも知れんが。
ただ、ExcelよりはAccessとかのが簡単だから大丈夫なんか?と思ったことあるけど。
Application.VBE系のコードが動くようになってれば感染させるのは簡単。
通常、Excelではセキュリティ設定で動かないようにはなってる。
Accessには設定が無い。
WordやPowerPointはどうだったかな。
Application.VBE系ってのはコード書いてるエディタを弄るものでVBAでコードを追加出来る。
つまり自分自身のコードをHDD上の不特定なxlsファイル開いて追加すれば自己増殖出来るし、Auto_Open辺りを追加して次回誰かが開いた時に勝手に実行させることも出来る。
ついでにそのxlsファイルをメールに添付して、アドレス帳の適当な所に送ることも出来る。
少し書ける奴なら分かってるだろうからApplication.VBE系は動かない設定になってるだろう。
Application.VBE系は便利でGithubにアップしたり、VBAのバックアックしたり、コード取得してWinmergeに与えて比較したり色々利用してたけどVB.netのCOMアドインに移行中。
コンピュータウィルスって「操作している人間の意に沿わない動きをするプログラム」だったと思ったんだけど、
いつの間にか定義が変わったのか。
CDトレー開いたりマウスをランダムに動かすジョーク系もウィルスだったはずだから>>76のもウィルスと言っていいと思ったんだが。 >>90
その定義だと世の中のあらゆるソフトはウイルスになるんじゃね
バグはあるからな
AndroidやiOSもウイルスになる >>90
その定義だとワームやトロイの木馬とウィルスが区別できないわけだが
いくら今だとより広義に使われるとはいえ
>>いつの間にか定義が変わったのか
はそのままお前に返してやるよ >>91
バグは確か「論理的に正しくない結果をもたらす何か」みたいな定義だったと思う。
マシン内に虫が侵入して電気的にショートするのが語源だしね。
同じ定義で使い続けるとバグとウィルスがあやふやになるというのは時代の流れだなぁ。 >>92
ワームもトロイの木馬も、元々はコンピュータウィルスを感染させるテクニックというか、
媒介手順だったはずがいつの間にか独立してウィルスの親戚みたいな扱いになってるよなぁ。 >>94
もともと、「感染」しないものはウィルスじゃない
いつのまにか独立したんじゃなくて、初めからちゃんと別物でちゃんと区別されていたんだが
いつのまにかまとめてウィルスと呼ばれるようになったんだ
今じゃマルウェア全般が広義にウィルスって言われる始末
バグは語源は諸説あるが、作成者の意図にそわない動作
ウィルスは作成者の意図にそった動作するプログラム
いくらなんでもそれを混同しないでくれ >>95
だからトロイの木馬もワームも単体ではウィルスじゃなかったんだよ。
言うなればコンテナみたいなものなんで、トロイの木馬型のパッチプログラムとかも可能だし。
たぶん想像している「定義づけられた時期」が違うせいで食い違ってるだけだな。 >>96
???
自己増殖しなきゃウィルスじゃない。
トロイもワームもウィルスじゃねーだろ。 プログラミングによる業務自動化絶対阻止マンがいて、ウィルスだろうがワームだろうが
題目はなんでもいいから邪魔しようとしている
という妄想をした...
...疲れているようだ
いや、だからApplication.VBE系の実行を拒否する設定にしておけばOK。
普通はそうなってる。
マイクロソフトも散々懲りたということだろう。
Accessはそうなってないから危険だけど、どっちにしろアンチウィルスソフト入れたり、それなりに敏感ならまあ大丈夫だろう。
メールに添付されたファイルを何も考えずに開くようなバカのいる所はそもそもコンピュ−タ使うなって話。
Excel2010からExcel2013にしたら「ライブラリが見つかりません」というが発生しました。
他のPCで作成したExcelファイルを開こうとしたら上記のようなエラーが発生したのです。
Excel2010の時も参照設定は参照不可になっておりましたがExcelに記載されているデータを
参照するだけでVBSは動かさないのでExcel2010ではエラーになりませんでしたが、Excel2013
ではファイルを開いた際に「ライブラリが見つかりません」というエラーになります。
これはExcelに開いた際に参照設定のチェックをしないみたいな設定があるのでしょうか?
vbeのツールのライブラリファイルって実体はなになんですか?参照不可になったりしますが
オブジェクトエクスプローラのライブラリともちがうし
>>102
VBSとオブジェクトライブラリに何の関係があるんだ? メモリリークはVBAでどう対処すればいい?
巨大なファイルクローズ後にまるまんまリークするのですが
巨大なファイルは
・作らない
・分割する
・変換する
・開かずに読み取る
・csvならテキストとして読み込む
この辺
メモリリークはある意味どうしようもないので前提からどうにかしないと解決しない
>>107
ありがとう。思い当たるのもあります。
・開かずに読み取る
これ、できるんですね。調べてみます >>106
それはメモリリークではないので気にする必要はありません 巨大なファイルをSSDのHDDに移すと速いんじゃね
Dir関数で末尾$のフォルダを確認するとエラーになる。
(配下のフォルダはエラーにならない)
これ、どんな理由でしょうか?
>>115
なぜエラーの内容を書かないのか
軽く試した範囲ではエラーにならないな
環境とエラー内容と、実際にエラーになるコード晒せ >>116
ですよね。すんません。
'Case NG
?Dir("¥¥Svr¥Share$", vbDirectory)
'Case OK
?Dir("¥¥Svr¥Share$¥Sub", vbDirectory)
アクセス権は親フォルダから継承していますので双方UNCアクセス可能な状態です。Domain Admins権限で実行しています。
GetAttrの戻りは双方 16 です。
共有名に$をつけない場合は発生しないように見受けられます、、、
と、思ったのですが、$の有無ではなくて、共有フォルダ自体を指定すると発生するようです。
エラーは、52: ファイル名または番号が不正です。となります。
ご教示お願いします。 >>116
環境は、
2008Server
Win7Pro/Excel 2010@vmware 5.4.0
です。 >>116
末尾を"¥"で終わらせるとエラーにならないことがわかりました。でも戻りが "." になります。わからなくもないですが "Share$" を期待していたので、、
どう解釈すればいいのでしょうか。
(Dir を使う際は末尾 "¥" を励行したほうがいい?) UNCパスでそこは共有名であってフォルダ名じゃない気がするが
すいません wordのVBAです。 画像貼りつけて文字列の折り返しを背景にするのに下記では2行目で
描画の対象とならないオブジェクトが選ばれているためにtypeメソッドまたはプロパティは使用できません。
となりますが、どうしたらよいですか?
Selection.InlineShapes.AddPicture FileName:="a.jpg", SaveWithDocument:=True
Selection..ShapeRange.WrapFormat.Type=wdWrapBehind
>>120
なんかややこしいですね。
共有名に "¥" をつけて初めて共有フォルダのルートフォルダとして認識される、と覚えておくことにします。 立て続けにすんません。
onAction の引数について、全角英数記号が半角に解釈されて実行されてしまうのは既知の仕様でしょうか?
ひらがなカタカナは被害を受けないようです。
CommandBars.ActiveControl.Caption
CommandBars.ActiveControl.OnAction
あたりで変換前の文字列を救出できるようですが、、根本的対応はないのでしょうか。
上記で躓いてしまい、公式で情報をみつけられなかったもので、、
>>121
まずさ、Selection使うの辞めようぜ。
Hoge.Select
Selection.Fuga
という形が有ったらたいてい
Hoge.Fuga
という形にできる。
つまりね、大抵は選ぶ必要がない。
ある程度書ける人は選ぶ処理をいかに無くすかを考える。
そうすればApplication.ScreenUpdating=False使っても
速度が変わらなくなる。
ちらつき防止のために使うのが有用なのは変わらないんだけど。
.Selectを使うのはユーザーに明示的に場所を示す場合と、
本当にどうしようもない場合がごくまれにあるだけだ。
オブジェクトブラウザでShapeRangeとかWrapFormatを
調べてそこに何が(型)期待されてるかを調べる。
後は合わせれば良いだけだ。 >>123
"OnAction" "全角"でググると結構出てくるね。
コメント以外で日本語使うこと無いから遭遇する事無かったわ。 >>124
>.Selectを使うのはユーザーに明示的に場所を示す場合と、
「ユーザーが明示的に選択したオブジェクトを処理する場合」も追加願います >>127
>>124が
>.Selectを使うのはユーザーに明示的に場所を示す場合と、
>本当にどうしようもない場合がごくまれにある 「だ け」 だ。
と言ってるから、もう一つのパターンもあるよ、と言ってるわけだが? select使わない理由は誤作動の原因になるからの方が多いんじゃないか
もちろんパフォーマンスも大きく変わるけど、言うほど変わらない
それよりもコード上、何のブック、シートがactivateになっているかを把握する方が遥かにめんどくさい
作ってるものが偏っているからActiveSheetやSelectionを使う機会がないだけで、
もっと操作補助的な面の強いマクロなら使う場面もあるかもしれない。
確かにコードの最後にcells(1,1).selectはよく書くけど、それ以外のselectは>>124の通り「本当にどうしようもない場合」だけだな
オートシェイプかなんかでsetできなかったような、忘れたけど IOと純粋関数部分を分けるようにと、Hな言語から学んだよ。
>>130
> もっと操作補助的な面の強いマクロなら使う場面もあるかもしれない。
まあそれが
> .Selectを使うのはユーザーに明示的に場所を示す場合と、
> 「ユーザーが明示的に選択したオブジェクトを処理する場合」
なわけだが >>129
誤動作とか以前に無駄なことをしたくないという自然な考えがある。
Cells(1,1).Select
Cells(1,2).Select
Cells(1,1).Select
と書かれてたらなんじゃこれと思うだろ。
マクロの記録は操作を自然に記録してしまうけど、
やりたいことはそれじゃない。
それにコードも汚くなって読みたくないものになる。 ユーザーが明示的に選択したものに〜
ってのもぶっちゃけ運用の問題の気もするが
マクロ化の範囲にもよるんだけども
可能な限り避けるべきってのは正しいでしょ
>>135
>可能な限り避けるべきってのは正しいでしょ
そうなの?
実際それをやることは少ないけど、別に避けてるわけじゃないな。
「ボタンを押すと、選択しているセルの書式を〜する」なんて処理はたまにある。 ユーザーが明示的に選択したものに処理を与えるってのはアリだとは思う。
でもそれはHoge.Selectでは無くてSelectionを使う場合だよね。
>>137
なるほど
最初のきっかけとなった>>124の1行目が、
>まずさ、Selection使うの辞めようぜ。
だったからずっと Selection のことを語っていた >>135
優先順位の問題でしょ
> ユーザーが明示的に選択したものに〜
って言う仕様の方が
> 可能な限り避けるべき
より優先されるのは当たり前 >>137
あぁそれはアリ
会社によっては多用するだろう >>121>>141
そもそもwordを使わない
あととりあえず動くコードを書いてくれ
Selection..ShapeR
ピリオドがニコあって邪魔
で、差し込んだ画像の文字列の折り返しってのが何がしたいのか良く分からん
テキストボックスなら分かるしそれで通るけど >>142 画像のレイアウトで背面にしたいんですよ。 なんかしらんけど動いて、なぜか前面で貼りつけられました。
なんかEXCELと勝手が違いますぬ・・・。 >>143
エクセルと勝手が違うんじゃなくて、ただただ猛烈に使いにくいだけ
で、上手く行ったので質問は終了ってこと? >>144 とりあえずは。 また多分色々とお伺いすることになると思いますが、
なにとぞよろしくお願いいたします。 wordはスレ違いだけどな
あんまりvbaと親和性もないし
あくまで文書ツールだからな
文書ツールとしてExcel使う奴はたくさんいるけど w
>>145
まず君が貼り付けたのは何かを考えよう。
マクロ記録が示すコードを見ればInlineShapeだろう。
InlineShapeを調べれば文字列の中の位置を指定した図形ということらしい。
要は10文字目に挿入とかさ。
InlineShapeにはWrapFormatプロパティは無い。
文字列の折り返しを背景にするというのは回り込み等を自動でやるわけでその結果文字が動くだろ。
それじゃ位置を指定したことにならない。
だから出来ない。
それじゃあどうするかというと、InlineShapeをShapeに変換するというのが1つ。
InlineShapeにはConvertToShapeというのがあるから、それをShapeで受けてやればShapeにはWrapFormatプロパティがある。
Dim iShp As InlineShape
Dim Shp As Shape
Set iShp=Document("hoge.doc").Characters(10).InlineShapes.AddPicture("C:¥fuga.jpg")
Set Shp=iShp.ConvertToShape
Shp.WrapText.Type=wdWrapThrough
しかしそもそも最初からInlineShapeじゃなくてShapeを貼り付ければ問題にならない。
Set shp=Documents("hoge.doc").Shapes.AddPicture("C:¥fuga.jpg")
shp.WrapText.Type wdWrapThrough
Shapeは位置を指定出来ないといっても何文字目という意味で指定出来ないだけで、Left、Top、Width、Heightでの位置指定はできる。
今回の問題もSelectionだったな。
何のオブジェクトを触ってるのかはっきりさせずに組んでるからエラーの意味も分からない。 >>149
そらそれが本来の使い方やもの
なに勘違いしてニヤニヤしとんねんお前
気色悪い奴だな >>151
Jカスこんなところでも下らねー釣りしてんじゃねえよ WordVBAで使いにくいのは記録出来ても良さそうなものが記録出来ない所。
ただ、これはこっちが出来ても良さそうと勝手に思ってるだけでMS的にはまずい何かが有るのかもしれない。
それよりも困るのは
Debug.Print Typename(hoge)
とやってSelectionが帰ってくる所。
型を知りたいのにSelectionは無いだろう。
>>153
型名調べる関数もうひとつあったよね
あんま使わんから忘れたけど >>153
? typename(hoge)とやったら
Emptyと出てきたぞ。
あなた↓の頭と同じでカラッポ。 >>150 ありがとうございます。 じつはそれで解決しました。
マクロで記録したらinlineshapeで、なんやねんこれ?と理解していなかったことが原因でした。 前スレ943様の下記ファイル、もう一度upしていただく訳にはいきませんでしょうか。
DLしようと思いながら、失念していて、先ほどしようとしたところ消えてしまっていました。
943様、お手数をおかけしますが何卒よろしくお願いいたします。
943デフォルトの名無しさん (ワッチョイ 06e9-FqSh)2017/11/05(日) 15:01:02.75ID:2uRc+T650>>944>>958
>>942
写真は辞めてくれ。見るのめんどくさい
出てきたからあげるわ
大体やりたいことはこれだと思う
・設定シートのB列に表示したいもの。C列は入力する文字を入れる
・入力シートのA1に「う」と入れて決定。リストが現れて「東京」「北海道」が現れるので選択する
もちろん「う」じゃなくても「東」なんかでもいい。場合によってはB列に「渋谷」とかいれてもいいかもしれない
https://dotup.org/uploda/dotup.org1380568.zip.html
自分で言うのも何だがこれ超便利。かなりオススメ こういう時はせめてエクセルアップロードできるアップローダーぐらい探してくると良いぞ
>>156
www
hogeをなんだと思ってる?
そりゃそのまま打てばEmptyが帰ってくるだろう。
hogeで察してくれんかね。
カラッポなのは誰の頭だよ。 途中経過はどうでもいいから結果を教えろ って人間がどんどん増えてんだな 経営者かよ
結果はいいから途中経過を教えろ、なんて頭おかしいだろ何言ってんだか
>>162
普通は結果教えてもらうなら過程も学ぶんだよ
まあ、別に学びの場じゃないけどね
ただ、腐ってもプログラムだからな
結果だけ知ってもその場しのぎ以上にはならんだろ 世の中は論理的にできているのに>>162が論理的でないのはなぜなのか vbaを勉強中の者です。
市販で売られている本など調べても載っていないのですが、for文で使われる変数名が「i」ですが、なぜ「i」なのですか?
「i」の意味を教えて頂けませんか?
既出でしたらすみません
>>166
iterationのiって事でいいじゃん >>166
>167の通りだけど、もう完全に形骸化している
「i」でもいいし「ページ番号」など日本語表記でもいい
ちなみに俺は「k」から「m」「l」「n」と続ける
単に見間違いにくいように 今グーグル先生に聞いたらFORTRANからの名残だってでてきた
>>169
昔読んだVBだかVBAだかの書籍にはトピックとして掲載してた書籍もあったような記憶が >>167-169
ありがとうございます!
ホント助かりました!
引っ掛かり進まなかったので、これで進みます。
納得できてよかったです
ありがとうございます >>166
数学でijkは行列などの添え字で使う。
fortranでネストしたループ回すときって、微分方程式を離散化したものを解いたりするパターンが多くて、
二次元や三次元の多次元配列を使ってるだろうから、自然とijkになる。
で、数学のiはintegerからきてる、といったぐあいでは? >>173、174
数学からなんですか?!
プログラムと数学は違うものと思っていました。ありがとう 今から60年前にアメリカのIBM社で開発されたFORTRAN(フォートラン)というコンピューター言語があって
そこで変数名の頭文字がI以降なら整数型と定義されたのが始まり
ループカウンターは整数だからFOR文でもIを使ったという歴史がある
一方で昔のBASIC言語ではすべての変数が実数型というのが基本仕様だったので、Iを使う意味はあまりなかったけど、
FORTRANに憧れた世代が書き方を真似してそのまま定着した
という年寄りの昔話
>>175
数学、論理学とは非常に近しいと思う。
関数型プログラミングてスタイルもあるし、
数学の証明をある程度自動化する言語もある。CoqとかAgdaとか。
VBAにもそろそろ高階関数が欲しいですね、MSさん期待してます。 ループカウンタにi、j、kを使うようになったのはC言語の影響が一番大きい。
どこまで使う?
自分はnまで。
ループ変数以外で1文字の変数は使わない。
出来ればkまでにしたいね。
実際は思うようにいかなくて俺もnぐらいまで使ったことある。
でも1文字辞めることもある。
>>180
あんまり1文字変数は使わない
処理行数や処理列数などを使ってるわ
年取ると覚えるのが大変なんだよ >>176
> そこで変数名の頭文字がI以降なら整数型と定義されたのが始まり
嘘書くなよ...
X, Y, Z が整数型とかあり得んわ 最近デザパタに凝っててイテレーターパターンやってるけどなかなかいいよ
まあいかに多重ループしないかは大事だわ
>>185
いやまあ、見た目上ループ変数は減るからw
よってるからよくわからんなってるわ
すまん VBAでイテレータパターンて難しそうだ
ループをなくす、って方向の方が良さそうです。
Excel2010です。
文字列を引数に文字列を返すユーザ定義関数を作りました。
アドインにしてチーム内に配布しようと思ってます。
試しに新規ブックで使ってみたところ、開くたびに変更していないのに保存確認メッセージが出るようになってしまいました。
関数の中の処理を全て消しても保存確認メッセージがでます。
文字列を返すだけの関数なので、保存確認メッセージを出ないようにしたいのですが、どうすればよいでしょうか。
>>189
中身を見ないとわからない
Function Foo(bar As Long)
Foo = bar * 2
End Function
と作ってみたけど
>開くたびに変更していないのに保存確認メッセージが出るようになってしまいました。
この減少は起きなかったよ
何か別の所に原因があると思う >>190
簡単に書くとこんな感じの関数です。
Function Kubun(code as string) as string
if (left(code,3) = "123") then Kubun = "A"
end function
if文が大量に続くので共通化してアドインで配布しようと思ってます。
これをKubun.xlbとしてアドインフォルダに保存しました。
新規BookでセルA1に123、セルB1に =Kubun(A1) と入力したところ
セルB1にAと表示され、関数は機能しました。
その後保存した新規Bookを開き何もせず閉じようとすると保存確認メッセージがでます。 >>192
再計算されてるから
値は変化しないけどセルの内容は更新されていると予想 >>192
アトインって *.xla じゃなかったっけ?
*.xlb だとなんかいいことあるの?
(ツールバー設定とかを記憶するファイルだと思ってた) >>192
xlbってなんだっけ?
xlamじゃないの? >>192
ネットで検索してみると回答は>>193氏の「再計算」で正解だと思うよ
そのユーザー定義関数の中で使ってる関数の中に再計算が発生する関数が含まれているのでは?
簡単な例でいくと新規ブックのセルA1に=TODAY()と入力し確定、そのブックを保存し閉じる
そのブックを開くとTODAY関数による再計算が発生するため何もせずに閉じようとしても保存確認出る
それと同じことでは >>198
192の通り使っているのはif文とLeft関数だけです。
試しに関数の中の処理を全て消してみたのですが、
状況は変わりませんでした。 >>199
おそらく
A1が変わってないときに、=Kubun(A1) という式が必ず同じ値を返すという「保証」ができないので
B1セルが変更されている可能性を排除できない
ということで変更されている(可能性がある)と判断されてる
ユーザ定義関数は中身チェックしないで非決定的だって判断だな
シート開くときに再計算するかどうかのオプション設定なかったっけ?最悪手動かな >>199
その関数にDebug.print 文を仕込んでおいて
呼ばれたかどうかを確認してみたら? >>201
保存確認メッセージを防ぐ方法はないですかね?
>>202
関数は呼ばれていますが、それだと何か方法ありますか? >>203
関数が呼ばれると言うことは変更されると言うことだから
保存確認ダイアログが出るのが普通
savedプロパティを変更する方法とか
calculationプロパティをマニュアルにする方法とか
方法はあるかもしれないけど
他の問題が起きるようになるかもしれない Application.DisplayAlerts = False
のこと?
質問です。Excel 2016で、Autofilerされたシートの内容を参照するために
(wsはワークシートオブジェクトです)
Debug.Print ws.AutoFilterMode →この結果は True
Debug.Print ws.AutoFilter.FilterMode →この結果も True
Dim rgFilter As Range
Set rgFilter = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)
For Each e In rgFilter
Debug.Print e
Next e
こんな感じで参照しようとしてるんですが、
参照してるシートでフィルターが掛かっていても、いなくても
同じように全件(25行なら25行)がイミディエイトに表示されます。
絞り込まれた結果のみを表示するためにはどうしたら良いのでしょうか?
>>206
Set rgFilter = ws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible) >>207
素早いご回答ありがとうございます。
修正してみましたが、今度は絞込みあり/なし何れも1行だけになりました
何だか難しい操作ですねえ… Dim MaxRow As Long
MaxRow = ws.Range("A" & Rows.Count).End(xlUp).row
これを追加して、
Set rgFilter = ws.Range("A1:A" & MaxRow).CurrentRegion.SpecialCells(xlCellTypeVisible)
にしてみても、結果は>>206と同じになりました。
んー謎です >>203
あるにはあるけどクソめんどくさいぞ
すべてのセルの初期値保持しといて、閉じるときに確認して値に変更なければsavedをtrueにしてから閉じる、とかね Sheets("Sheet1").Columns(2).Insert Shift:=xlToLeft
Sheets("Sheet1").Columns(2).Insert Shift:=xlToRight
この二行の動作の差が分からないので
違いを教えてください
>>211
現在のcolumns(2)の中身が左にずれるか、そのままか、かな?
当てずっぽうだけど。 エクセルVBAですがあるシートで入力し別のシートに転記するというコードを記入しているのですが
For文でやろうとするとうまくいきません。元々のシートの行が11行目から始まり転記先のシートが2行目から始まるのでネストを使って以下のようにコードを組んでみたのですが2行目の入力データが転記先のデータに2行追加されてしまいました。
1行目と2行目はそれぞれ別のデータが記述されておりそのまま転記できるようなコードにしたいです。
もしかしたら、そもそもforだとだめなのかもしれません。ちなみに入力するデータが11行目から始まり終わりは20行目で終わります。
がとりあえず繰り返し構文でできればかまいません。下記のコードをどう変えればいいか教えてください。
Sub 登録()
Set syougai = Sheets("障害記録") 'シート名にて指定しているので変更しない事
Set itigi = Sheets("一時データ") 'シート名にて指定しているので変更しない事
Const hiduke As Long = 19 '日付列の定数
Const gouki As Long = 17 '号機の列の定数
Const era As Long = 18 'エラーコードの列の定数
Const hyou1 As Long = 11 '障害集計表上の定数
Const kisyu As Long = 21
Const syuukei1 As Long = 21
For i = 2 To 3
For j = 11 To 12
itigi.Cells(i, 1).Value = syougai.Cells(j, hiduke).Value '日付
itigi.Cells(i, 2).Value = syougai.Cells(j, gouki).Value '号機
itigi.Cells(i, 3).Value = syougai.Cells(j, kisyu).Value '機種
itigi.Cells(i, 4).Value = syougai.Cells(j, era).Value 'エラーコード
itigi.Cells(i, 5).Value = syougai.Cells(j, syuukei1).Value '集計データ
i = i + 1
j = j + 1
Next j
Next i
End Sub
〉〉214
ネストの使い方間違ってると思うのですがどう直せばいいのかわかりません。
>>214
itigi じゃなくて itiji にしろ
シート名「にて」はやめてシート名「で」にしろ
i = i + 1 と j = j + 1 は不要なので消せ >>214
単純にシートで開始行がずれているだけなら
For i = 2 to 3
itigi.Cells(i, 1).Value = syougai.Cells(i +9, hiduke).Value
以下略
Next
でいいんじゃないでしょうか
ループはネストすると
内側のループだけ全部回して外に抜ける、を外のループの回数
だから、ネストでは意図した動作にならないでしょう
>>216も言っているけど、Nextで変数に勝手に+1されるから足さなくていい てか hiduke なんて変数名使うくらいなら「日付」のほうが10倍まし
そもそもVBAでやることなのかな
転記先の一時データのシートのセルに障害記録シートのセルを参照する式を書くだけで良くない?
>>214
値を取得しながら転記しようとするから混乱する
コレクションなり配列なりに一回格納してから転記するようにすればネスト要らん >>221
変数名は大事でしょ
こいつの変数の付け方は最悪に近いわ
代入の式見なかったらなんのことだかわからねー hidukeと日付のどちらか選べと言われたら、hidikeを選ぶ。
仕事内容を記録するエクセルを作成したく、
シート名は各個人名でフォームを開くボタン設置。
登録用に必要項目をフォームで作り、転記するサンプルマクロを書いたんですが、今後必要項目が増えたり、減ったりしたときに人数分フォームを弄ったりマクロ書き換えるのは面倒ななんですけど、一個をものを共有し使用するにはどうしたらいいですか?
各個人のエクセルを開き、作ったボタンで共通のエクセルを開きフォームを開いて転記させるとか?
共通のエクセルを読み取り専用で開き書き込む時に自分のエクセルを開いて転記させるとか?
なんかうまいやり方ないですか?
>>226
シート毎つまり人毎にボタンを作るなら
そのボタンをクリックした時にその人独自の値をグローバル変数とかに代入して
フォームは共通のものを呼び出す
フォームに入力されたものを書き込む時は
さっきのグローバル変数を見て
書き込み先のシートとかを特定する >>228
同時に複数の人がそのエクセルファイルを使わない事が前提だけど >>226
一つのエクセルファイルを複数人で同時に使うのはいろいろ大変だと思う。
共有共通にせず個人毎に違うファイルを使ってもらって、
仕事内容記録フォルダに入ってるファイル全てをまとめて集計するマクロを作った方がよさそ。 >>230
データはなんでもいいからDBに書き込んでエクセルはインプット画面として割り切りなさい
マジで エクセルの共有はマジで地雷
運用を見直した方がいい
>>230
入力するのが一人で他の人が見るだけなら問題ない
複数人が同時に書き込むならエクセルじゃなくて
ウェブアプリとかにした方が良いと思う mdbを複数ユーザーで同時に掴めるなら、SQLでデータを投げれば動作するんじゃないの。
入力フォーム作りがクソ面倒くさいからエクセルでやるのは愚策中の愚策なのは確かだけど。
>>223
健康のためなら死ねるタイプ?w
ごめんけど理解不能 どうしてもエクセルだけでやりたいなら、フォームとデータでファイル別けるべきだね
>>236
いや、常識だろ
自分でメンテするにしたって嫌だわ フォームボタンをクリックした時に
グローバル変数とかに時刻なり、その人のIDなりを記録して
編集中である事が分かるようにしておく
書き込んだらクリアする
他の人がフォームボタンをクリックしたら
編集中かどうかチェックして
編集中なら後で再実行するようにダイアログを出す
>>238
お前の常識とか知らんし興味もない。
他人の変数名にケチ付けるのは常識じゃなくてエゴだろ React では、データアクセス(CRUD)部分は、
Flux の、Store という部分で、 UI とは完全に分離させている
nmp の、immutable パッケージで、データを変更不能にしたり
変数名は結構考えるけどな。
普段なら辞書サイトでその意味の英単語から付けることが多い。
API使えば変数名の重要性が分かる。
>>243
それは変数名と言うより引数名でしょ?
それだったら確かに大事 個人的に引数含む変数名に半角英字は避けるように徹底してる。
予約語と被らなくなるし徹底すれば読みやすいしね。
一般的に、名前に半角英数使うのはコンパイラが2バイト文字対応していない事が理由なんで、
対応しているコンパイラには積極的に2バイト文字で投げた方がいい。
>>244
一年前に作ったコードの宣言部分と代入部分見ずになんの値か把握できる自信があるならどうぞ
まだシステムハンガリアンの方がポリシーあるだけマシ >>246
俺が>>244で言った意図は、「引数名は大事だがローカル変数名はたいして大事じゃない」という意味だ。
それに反論しているのかな? 大事じゃない変数なんてないんだよ
みんなそれぞれに役割があって、一生懸命に生きてるんだから
>>248
それは違うだろ
まあ、使い捨てのテストなんかは適当にやるけど
長い変数名が嫌なのは打つのが面倒だからなんだろうけど、そもそも同じ変数が何度も出てくる時点でリファクタリングの臭いがするわけでな >>250
ローカル変数に限っていうなら、上の方がよくて下に行くにしたがって悪くなると思っている
・ローカル変数がない
・tmp とか a とか x とかいう名前で十分わかる
・適切な名前をつけることでよくわかる
・適切な名前がつけられていないことで混乱する
・適切な名前がつけられているにもかかわらず混乱する
そうだよね? >・適切な名前をつけることでよくわかる
>・適切な名前がつけられていないことで混乱する
同じことじゃね?
>>252
いや、
やれば改善する可能性があるのにやっていない状態、ということで下位になっている >>251
ローカル変数がないの意味がよくわからん
値渡しの引数はローカル変数なんだけど
それを除外したとしても、変数なしで書ける処理は限られてくるし >>256
不要な変数を作るなってことだろ
そのまま代入すりゃいいのに>>222みたいにいったん変数に格納したがる奴は一定数いる >>251
tmpとか、座標系の短い変数はきちっと関数化して処理の分断ができてるときに限るけどね
大体そんなもんじゃないかな
>>257
配列に格納してから云々はそれぞれの処理を独立させることであとから見通しがよくなるんだよ
たとえば、代入する値に条件付きで何らかの処理を加えなきゃいけなくなったときなんかにループしながら直接吐き出してるとネストが深くなって可読性が低くなる
それぞれ独立してれば関数化するのも楽だしな >>259
> たとえば、代入する値に条件付きで何らかの処理を加えなきゃいけなくなったとき
その時にやればいいだけ >>260
一回変数にいれることでそれがなんの値か、というのを明示するって意味もある
意味があるからやってんだよ >>256
日付が変わっているからIDは違うが、元の俺の発言は>>248の
>「引数名は大事だがローカル変数名はたいして大事じゃない」という意味だ。
なんだよね。
つまり引数は別として狭い意味のローカル変数について語っている。
それと、>変数なしで書ける処理は限られてくるし
については、良い〜悪いの序列の話なので、「変数なしで書けるくらいスコープが狭い方が良い」ということさ。 ( ・ω・)∩シツモーン
範囲A1:C10の値をまとめてD1:F10に代入するときにさ
直接=で結ぶと駄目で
一旦変数で
tmp=range(A1:C10).value
range(D1:F10)=tmp
とかいうふうにすればオッケーなのって何でなのん?
>>264
Range(A1:C10).Value = Range(D1:F10).Value
でいけると思うけど? ごめん逆
>>264のやりたいことは
Range(D1:F10).Value = Range(A1:C10).Value
だね 値のコピーは
Range("D1:F10") = Range("A1:C10").Value
範囲が同じなら
R1.Value=R2.Valueで行けるな、普通に
Set R1=R2はなんか無理
R1=R2でいけない理由はよくわからん
RangeオブジェクトのデフォルトプロパティってValueだよね?
>>268
Rangeの既定のプロパティは、ドキュメント上だとItem
実際はちょっとトリックがあって、_Defaultっていう隠しプロパティ
こいつがアドレス指定しない場合はValueを返す >>268
Setを使うということはオブジェクトということだぞ。
それはRangeそのものを代入することを意味する。
A1セルにB1セルを代入など出来よう筈が無い。
A1セルのアドレスがB1?
意味不明だろ。 >>270
rangeオブジェクトの実体はアドレス情報ってことか? >>273
???
それだけじゃねーだろ。
が、それも含むのは当然。 indirectとかsumproductとか、便利なんだけどいまいちよく解らんよな。
>>270
Set の左辺は変数だから当然と言えば当然
A1セル自体は変数じゃなくてオブジェクトだからな >>274
いやまあ、セル同士を直接セットが無理っぽいのは何となく感覚でわかるんだが、どういう動きでそうなってんのかなーって気になるわけよ Range()みたいなのって返却値がRangeクラスなだけあってRange()自体は関数だから
Rangeオブジェクト
Rangeプロパティ
Range関数
Rangeでチン
これが区別できれば完璧
>>279
getRangeにしとけよな
紛らわしいわ リストを絞り込み別のリストで1行だけを表示できるようにしたらどうしたらいいでしょうか?
わかりやすくいうと、sheet1にA1からZ1000までのリスト置き、それを何らかの方法で絞込
sheet2のEの1にE列の絞り込んだ1行目をEの2にF列の1行目を表示し次へを押すと2行目を表示するようにしたい
オートフィルみたいなことですが表示したいセルが文文章で多くそのセルだけを表示できるようにしたいです。
1行だけならなんとなくわかるのですが次の行にコマンドボタンを押すことで表示する方法はイメージできません。
for文ならiを使えばいいんでしょうけどやりたいことと違う
>>283
Find関数使って検索してヒットした行数を返すようにして、
受け取った行数を元に情報を取得、次へボタンはFindNextにしておく。
というのが一番簡単かなぁ。本当はExcelじゃなくてAccessで扱う方がやりやすいんだけど。 以下不明点を教えて
1なぜ変数を初期化するのか?
2なぜNextjでjだけループが終わるのか?
3If Hantei Then (もしも変数の場合は。。。) もはや意味がわからない
初心者にもわかりやすく答えよ
Sub CorrectCode()
Dim i As Long
Dim j As Long
Dim Hantei As Boolean
'変数の値を初期化する
Hantei = False
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
For j = 2 To Cells(Rows.Count, 3).End(xlUp).Row
If Cells(i, 1) = Cells(j, 3) Then
'変数に"True"を代入する
Hantei = True
Exit For
End If
Next j
If Hantei Then
'変数の値を"False"に戻す
Hantei = False
Else
'セルの背景色を変える(チェックする)
Cells(i, 1).Interior.ColorIndex = 6
End If
Next i
End Sub
>>285
Next j の捉え方からすると、そもそも実行の順番が分かっていないようなので基礎からやる事をおすすめする。 俺なりに日本語訳してみた
間違っていたら教えてくれ
VBA初めて3日です
基礎は本読んでるからわかっている
変数宣言
変数に初期値を入れる わかりやすいように
変数iは2から一番下からみて最初に値の入ってセルまでをループする
変数jも同様
もしもA列とC列にループする上で同じのが見つかったら
変数にTUREを入れる
そしてループを抜ける
そんでまたjのループを繰り返す
もしも変数がTUREをもっていたら
FALSEに変える → なぜ?
セルの色を変える
そんでiのループを繰り返す
初期値をfalseにする理由
trueの時は色づけという流れにしたいので、予めfalseにしておく必要がある
boolean型の初期値はtrueなので。
途中でfalseを入れる理由
i=1 のままで j を最終行までループさせてチェック
その次に i=2 にして j を同じく最終行までループさせてチェックするのだが
i=1 でのチェックが終わった結果 true なら i=2 でのチェックに備えて false に初期化する必要がある
これは基本的に最初の初期化と同じ考え方
Hanteiの初期化、j のループの直前に置けばIf文の後の変数初期化がいらなくなる気がする・・・
>>288
なるほどわかりやすい
このプログラムを日本語化して >>285
最初の変数初期化は全く必要無い。
そもそもこういうBooleanな変数を用意することに疑問。
こういう変数は、どうにもそれが無いとプログラムが組み立てられない時に使うべきで、出来るなら使わない方向で組み立てるべき。
そして、やってる内容を見ればこんなもの使わない方向で組み立てられる。
こういうコードはやりたいことを論理的につめられていない時に安易に書き出してしまった時になりやすい。
はっきり言ってクソコード。
全く参考にならん。
1.最初の初期化はいらん。
宣言後の初期値はFalseだから。
逆に初期値をTrueにする場合は初期化が必要。
途中の初期化については、jに関する1つの処理が終わった時にTrueになってたら次の処理の結果がおかしくなるから必要。
2.Exit Forのことを言ってるなら最も内側のFor Nextから抜けるからとしか言えん。仕様だね。
3.If〜Thenは〜がTrueかどうかを判定している。
If i=0 Thenはiが0だったらと考えがちだが正しくはi=0の文がTrueかどうかを判定している。
イミディエイトウィンドウに?(10=10)と入力してEnterキーを押すとTrueとなるし?(10=5)と入力してEnterキーを押すとFalseになる。 >>285
同じこといってるかもしれんけどこの場合変数Hanteiが丸々要らない
if文の中にセルの色変更のコードを書けばいい
仮に、この変数がいるとしてもどんな値が入っててもどうせfalseにするんだからif分岐してる意味がわからない
もっと言うとHanteiとかいう変数名がクソ過ぎる
なんの判定かさっぱりわからん
canChangeColorとかnotMatchValueとかしとけば目的が分かりやすいのに A列の各セルの情報と合致するものが、C列に一件も無かった場合、
次に合致するデータが現れるまでA列の背景色を変え続ける
という処理なのでHanteiが要らない様に書き換えるって難しい気がするんだけど。
>>293
ごめん、そこちゃんと読み込めてなかったわ
一致したら変えると勘違いした
なんにしてもフラグの初期化は頭かケツでいいと思うけど 似たようなソースコードを作ってみました
なぜだかエラーがでます
Sub test()
Dim i As Long
Dim j As Long
Dim U As Long
For i = 1 To Cells(Rows.Count, 1).End(xUp).Row
For j = 1 To Cells(Rows.Count, 3).End(xUp).Row
If Cells(i, 1) = Cells(j, 3) Then
U = 1
End If
Next j
If U = 1 Then
U = 0
Else
Cells(j, 3).ColorIndex = 3
End If
Next i
End Sub
>>293
確かに一致したものが無かったらだからBoolean使う方が自然か。
使わなくても簡単だけど自然なBoolean使うのが正しいわ。
俺も勘違いした。
ちなみに、一致せずに全てチェックしてjのループを終了した場合のjの値を調べればBooleanはいらんし、そもそもFind使ってループ1つにしてもいらん。
この仕様を見た場合、絶対こんなコード書かないけど、俺が書くとした場合の配列にぶちこむ方法はBoolean使うのが自然だな。
ちなみにランダムで10000行にデータ入れた場合、このコードで320秒、Find使う方法で22秒、配列入れる方法で9秒だった。 小学生がなんで3×5が15になるの?って聞いてるのに
俺なら電卓で答えだすぜ!って息巻いてる人のようにみえる
学習の初段階でつまずいてる人への的確な回答ではないわな
なんつうか、これが俺の後輩なら、フローチャート書いてみって言いたくなるな
もうフローチャートなんて10年以上見てないけどな
>1なぜ変数を初期化するのか?
あってもなくてもこのコードなら動くけど
すべての言語が変数を初期化してくれるわけではないので、変数は必ず自分で初期化しろって作法もある
自分で初期化すれば、初期値を間違えて覚えていたりしてもバグになりにくいしな(Booleanの初期値はFalse)
>2なぜNextjでjだけループが終わるのか?
ちょっと質問の真意がわからん
ForとNextは1対1で対応するんで、Next jならjのループ終端だぞ
>3If Hantei Then (もしも変数の場合は。。。) もはや意味がわからない
IfとThenの間に書くのは、条件式と呼ばれる式(文じゃないよ)
式の値がTrueかFlaseで条件分岐する
そして変数はそれだけで式として成り立つ。この場合は変数の内容そのものが式の値
If Hantei=True Thenって書いても良いんだけど、(とくにBooleanに対する=Trueは)冗長だと言って嫌う作法もある
VBAはExcelが現役だから、いつまでたっても入門者が一定数いるよなぁ
はっきり言えば、今どきのブログラムの勉強にはVBAは向かないよ
ブック名 C:\book.xlsx
シート名 データ
説明文パート 1〜5行目
データパート
..ヘッダ A6〜Z6
..データ A7〜Z*
..データ件数 不定
プロバイダ Microsoft.ACE.OleDB.12.0
このような設定でヘッダとデータをselect文で全件取得するにはどうすればいいですか?
>>299-300
超初心者の話かよ。
VBAエキスパートの話じゃなかったんか?
あと、If Hantei Thenを分からないって言ってるのは感覚の話で、君の説明じゃ分からないと思うぜ。
Hantei=Trueという式自体に値があって、それが正しい場合にその値は(Hantei=True)=Trueという結果になっているということが感覚的に分からないと理解できんだろ。
初心者はHanteiとTrueが等しかった場合と感覚的に理解してるんだから。
その感覚ではIf Hantei Thenが理解出来ない。 >>301
SQLで任意のセル範囲を取得する場合はFROM文で取得出来たはず。
SELECT * FROM [ データ$A6:Z1000] みたいな形。
ただその条件だとデータベースに投げる前にエクセル上で整形した方が効率いいと思うけど。 if hentai = true then 変態は正義
まず>>285のプログラムを動作順に日本語訳してくれよ >>305
簡単だろ。
A列のそれぞれのセルに対してC列に同じ値が無かったら色を付けてる。
1.A2からA列の最終セルまで1つ1つのセル(以下Aiとする)について以下を繰り返す。
2.C2からC列の最終セルまでにAiと同じ値が有ったときHanteiをTrueに設定。
3.HanteiがFalseの場合(C列にAiと等しい値はなかった場合)はAiに色を付ける。
4.HanteiがTrueの場合はFalseに設定。(どんな場合だろうがFalseに設定したいが、既にFalseなのにFalseに設定する必要は無い。単にFalseに初期化してるだけ。)
5.Aiの次のセルに対して繰り返し処理続行する。 >>302
「VBAエキスパート」という資格の勉強をしている超初心者の話だろ?
VBA始めて3日と書いてるし エキスパート名乗ってる割にはバグくさいコードなんだよな。
If Not Hantei Then Cells(i, 1).Interior.ColorIndex = 6
Hantei = False
っていう書き方がたぶん本来意図した仕様に近いと思うんだけども。
>>307
勉強してる奴が質問してるんであって、
このコードはそいつが書いたもんじゃない。
VBAエキスパート公式ってんだから、
資格の参考書かなんかに載ってるんだろ。
>>308
いや、この書き方自体は良くあるよ。
あんたのも間違いじゃない。 ○○でもわかる
○○のすべて
○○エキスパート
○○完全ガイド
こういうタイトル付いてるのは初心者向け
>>310
だから初心者用の本に載ってるコードが分からないと言ってるんだからこその>>299のツッコミなわけだろ?
本に載ってるコードの評価をしてくれという質問ではない エクセル相談所にあった質問で、とりあえずVBAなしじゃ出来ないって言っといったんだけど、VBAでリストの絞り込みって一度で出来る?
多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって事だと思うんですけど。
インターネットの選択方式でそんなの見た事あるけど一から開発するの面倒くさそう。
ユーザーフォームと2次元配列でも使えばできるかな?
ちなみにこの機能の名称あれば教えて欲しいです。
自分も配列すら参考書でかじったくらいでその必要性がわかってない初心者です
お力添えをお願いします
チェックボックスでチェック入れたら行の高さを0にし、チェック入れなかったら13.5にしたいのですがうまく動作してくれません
Sub チェック8_Click()
Dim A As Boolean
Dim B As Boolean
If A = True Then
A = Rows(43).RowHeight = 13.5
B = Rows(44).RowHeight = 13.5
Else
A = Rows(43).RowHeight = 0
B = Rows(44).RowHeight = 0
End If
End Sub
どこが間違っているのかご教示お願いします。
>>315
行は適当に変えてくれ
Private Sub CheckBox1_Click()
If CheckBox1.Value Then
Rows(3).RowHeight = 13.5
Rows(4).RowHeight = 13.5
Else
Rows(3).RowHeight = 0
Rows(4).RowHeight = 0
End If
End Sub >>315
フォームコントロールならこっちだわ
コントロール名は適当に変えてくれ
Sub チェック2_Click()
If Sheet1.CheckBoxes("チェック 2").Value = 1 Then 'これでダメなら下を試そう
'If "Sheet1".Shapes("チェック 2").ControlFormat.Value = 1 Then
Rows(3).RowHeight = 13.5
Rows(4).RowHeight = 13.5
Else
Rows(3).RowHeight = 0
Rows(4).RowHeight = 0
End If
End Sub >>317
ありがとうございます!!!こちらで動作しました!!本当に有難うございます!!! 〉〉314
できるの?
入力規則の絞り込みじゃないよ?
階層化してリストから直接下層に移動(3段階くらい)して選択する方法だよ?
>>312
違う。
そのコード書いた奴に向かって言ってるのと、躓いてる奴にはそのコードはよろしくないと言ってる。
何の例かは分からんが、もっと現実的なコードにすべきなんだぜ。 >>320
しかも、わかりにくいかもしれないけど条件ちゃんと書いてあるんだけどね
入力規則の絞り込み検索じゃない。
階層ごとにクリック選択する事すらめんどくさいと言ってるんだよ。
一度の選択でリストの階層移動ができるかどうかを質問主は相談所で聞いていて
自分はVBAないとだめだよと回答したけどVBAだとどうなんだろうとこっち
で聞きなおしてみたんだけど、 >>321
こういう糞レスがつくからスレが過疎るんだぞ ちゃんと、VBAでリストの絞り込みって一度で出来る? こう書いて
その下に
多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって
こう書いてあるんだけど読み取れない?
しかも、前文にエクセル相談所にあった質問こうも書いてあるし。
で、わざわざVBAで聞いてるのにわからないかー
具体的なコードが伴わない場合は外野がなんかゴチャゴチャ言っている程度に聞き流すべき。
>>321の質問はウィンドウズ標準のメニューバーみたいな形を想定しているみたいなので、
外部参照にMicrosoft Toolbarとかあれば、それを追加して解決するんじゃないかな。 >>326
> 多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって
マウス操作にはクリックも含むのが普通だと思うぞ
>>325
無駄なレスしてなにか楽しいのか?
>>327
あっちのスレ読めばわかるけどそもそも VBA 使わずにできるかどうかの問題になってるから Toolbar 云々の話ですらない
お前さんこそ聞き流すべき >>328
どちらかというと>>313の質問に答えた形だけど。
向こうの質問にこっちで答える義理もないし。 >>313
それは、VBAでも出来ないと思う。
というかWindowsの標準動作と違う。
似たようなのは出来るかもしれないけど。
コンボボックスじゃなくメニューなら出来るかな。
見ためが違うけど。
見ためをコンボボックスにしたいならコンボボックス使わずにフォ−ムに描画した方が楽じゃね?
コンボボックスだと選択しないとイベント発生させるのが難しいし、イベント発生時にブルダウンが閉じるのが通常動作だから。
サブクラスでHITTEST検出で出来るかどうか。
VBAではウルトラC級に難しい。 >>327
メニューバーの見ためは駄目なんじゃないの?
俺もメニューバーが現実的だとは思うけど。 >>313
階層付きMenuで3項同時に入力するってこと?
自分だったらContextMenuの改造またはPopupでやるかな。
見た目悪いけど、最下層をデリミタ区切りのフルセットにすれば
Splitして投げ込むだけでいいでしょ?
CellのContextMenuだとあとで標準に戻すこと考えないと
いけないので最近はもっぱらPopupばかり使ってる。
Cellのプルダウンだと表示数に限りがあるけど、Popupだと
画面サイズいっぱいまでいけるし、、
あ、もちろんCommandBarsのアレのことです。 >>313
いえ、1つ目のリストを表示して、マウスの位置をその位置まで持ってきて
2つ目のリストを表示してって3つ目のリストを最終的に表示するみたいな。
エクセルの旧表示みたいな感じで、ファイル→検索みたいな感じです。
多分 >>333
いやだからそれって、階層メニューのことでしょ?
手近なところでいうと、、、たとえばFireFoxだと、
表示 > テキストエンコーディング > 自動判別 > 日本語
みたいな。この手のMenuって、onMouseOverイベントで
下層が勝手に開いていきますよね。
それで各階層の選択肢を全部入力値として使うことじゃないの? そう、これはメニューの動作なんだ。
コンボボックスで実現するのはとても難しい。
ほとんどの奴は上級者でも不可能と言うだろう。
それとも俺の知らない何かがあるかもしれないけど。
コンボの配下にメニュー作ろうとすると怒られた。
階層メニューによる一括入力、自分でも使うかもと思い作ってみたよ。
1) 前提:質問者のリンク先キャプチャを参考
A2:C2が回答入力欄
キャプチャにある凡例を登録するための矩形範囲を"R_Master"とする。
2)呼出部:キャプチャのA1セルにある "商品"の文字列を右クリックで発動。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Resize(1, 1).Value = "商品" Then
Cancel = True
Call Popup_FullPut(Range("R_Master"), " 個")
End If
End Sub
3)Menu生成部
Sub Popup_FullPut(rngMst As Range, Optional strUnit As String)
Dim r As Range
Dim i As Long, j As Long, k As Long
With CommandBars.Add(Position:=msoBarPopup)
For i = 0 To rngMst.Rows.Count - 1
Set r = rngMst.Offset(0, 0).Resize(1, 1).Offset(i, 0)
If r.Value = "" Then Exit For
With .Controls.Add(msoControlPopup)
.Caption = r.Value
For j = 0 To rngMst.Rows.Count - 1
Set r = rngMst.Offset(0, 1).Resize(1, 1).Offset(j, 0)
If r.Value = "" Then Exit For
With .Controls.Add(msoControlPopup)
.Caption = r.Value
For k = 0 To rngMst.Rows.Count - 1
Set r = rngMst.Offset(0, 2).Resize(1, 1).Offset(k, 0)
If r.Value = "" Then Exit For
With .Controls.Add(msoControlButton)
.Caption = r.Value & strUnit
.OnAction = MkAction( "Popup_Input", rngMst.Address(external:=True),i & "|" & j & "|" & k )
End With
Next
End With
Next
End With
Next
.ShowPopup
.Delete
End With
End Sub
4)入力実行部
Sub Popup_Input(strMst As String, strAns As String)
Dim rngR1 As Range: Set rngR1 = Range("A2")
Dim rngR2 As Range: Set rngR2 = Range("B2")
Dim rngR3 As Range: Set rngR3 = Range("C2")
Dim rngMst As Range: Set rngMst = Range(strMst)
Dim i As Long, j As Long, k As Long
i = Split(strAns, "|")(0)
j = Split(strAns, "|")(1)
k = Split(strAns, "|")(2)
rngR1.Value = rngMst(i + 1, 1).Value
rngR2.Value = rngMst(j + 1, 2).Value
rngR3.Value = rngMst(k + 1, 3).Value
End Sub
5)引数付きのOnActionコマンドの生成に普段使っている関数
ん?書き込めない、、なんで?
要は文字列生成がメンドーだから関数使ってるだけなんだけど、、
刻んでみる。
5)引数付きのOnActionコマンドの生成に普段使っている関数
Function MkAction( strCMD As String, Optional arg1 As String, Optional arg2 As String )
Dim文のところではじかれるみたい、、
5)引数付きのOnActionコマンドの生成に普段使っている関数
Function MkAction( strCMD As String, Optional arg1 As String, Optional arg2 As String )
Dim DQ As String: DQ = Chr(34)
Dim SQ As String: SQ = Chr(39)
Dim buf As String
buf = strCMD & " "
If arg1 <> "" Then buf = buf & DQ & arg1 & DQ
If arg2 <> "" Then buf = buf & "," & DQ & arg2 & DQ
MkAction = SQ & buf & SQ
End Function
書き込めたかな?
Chr関数は禁則?
書き込めた。
Chr関数で引っかかっていたみたい。実際は半角です。
インデントは全角スペースになっているので変換が必要です。
VBEにコピペすると、全角スペースは自動的に半角スペースに変換されるから意識する必要ない
エクセルのVBAで、サーバー上にディレクトリを作成して、そこにファイルを移動させたいのですが、
MkDIRで作成できませんでした。どうすればよいでしょうか?
>>345
FileSystemObject使えばできますよ。
サーバー側の権限は大丈夫ですか? >>346 ありがとうございます!
dim myFSO as new filesystemobject
myFSO.CreateFolder (サーバー上のつくるディレクトリ名)でいけますか?
それともカレントドライブをサーバー上に移動すべきでしょうか? 質問です。
プロシージャの処理の途中でイミディエイトウィンドウをうまくクリアする方法はありますか?
あるかないかでいえば、
ないこともないアル
地道にセンドキーでキー送って
全選択してデリートしてって方法がな
関係ないけどブックを開くとイミディエイトウィンドウ上の変数が消滅するの困る
>>350
その際はFocusをVBEに移してイミディエイトPaneをアクティブにする操作を挟むのでしょうか? エクセルのVBAで競馬予想ソフト作っている人っていますか?
>>352
デバッグ クリア VBAで検索したら
幸せになれるかもよ VBAでコンボボックスのリストのみクリアってどうやってやるんですか?
>>355
正式にやるのは多分すごく難しい。
Win32APIでコンボボックス内のリストボックスに対してどうにかするということになると思う。
しかし、単純に
strCombo=ComboBox1.Text
ComboBox1.Clear
ComboBox1.Text=strCombo
でテキストが一瞬クリアされたのは見えないから現実的な案だと思う。 シートの非表示設定について
Sheets(”sheet1").Visible = False
でシート非表示設定をしたのですが元々非表示だとバグになってしまいます。
釦を押せば特定のシートのみを表示できるようにしたいんですけど表示時非表示時がランダムで
非表示時でもそのコード無視するかと思ったら非表示なのに非表示にするんじゃねぇと怒られた。
>>357
VisibleプロパティがBooleanで状態を返すのでIfで分岐させる
If Sheets("sheet1").Visible Then
Sheets("sheet1").Visible = False
Else
Sheets("sheet1").Visible = True
End If
こうすると実行するたびに表示/非表示が切り替えられる >>358
ありがとうございます。できました。
なんとなく、if文使うのかなと思ったのですがif文が思いつかなかった。
Elseの下を消すことで、非表示時は非表示のままのする思い通りの事が出来ました。 >>358
それだと非表示の時は表示されるからElseはいらねえだろ。
俺も
Sheets("sheet1").Visible=(Not Sheets("sheet1").Visible)
と最初考えたけどやっぱIf文にしないと駄目かと考えた。 >>359
たぶん他人にも使わせるのだと思いますが
シートをシート名じゃなくオブジェクト名で指定すると
誰かが勝手にシート名を変えても関係ないのでオススメ。
さらにわかりやすいオブジェクト名に書き換えると、尚良し。
オブジェクト名はVBEのプロパティウィンドウの(オブジェクト名)を見てね。
初期値はSheet1なので
Sheets("sheet1")をSheet1に置き換えてもうごくはず。
>>360
あとから余計なこと書いたかなーと思ったけど、本人が気づいてくれてよかった。 〉〉361
ど素人で何もわからないままマクロの記述させながら必要なところ
コピペしてとネットコピペでほとんどコード打ち込まず作ってるので
まだ、オブジェクトまで触ってません。
今度触ってみたいと思います。
標準モジュールは逆になんのモジュールかわからなくなるの必要なモジュールと区別するために名前つけてるけど
sheet名はそのままです。
>>285
ワシはティンコを2本もっている
2本目はとっておきだ(´・ω・`)b >>363
マジ気になるわー
V字になってるのか、真ん中で2段になってんのか、前後に生えてんのか?
1本は普通だが、もう1本はデコに生えてんのか? コードのコメントについて
どこまで記入してますか?
素人なもんで変数の内容から
変更前のコードまでコメント化してるからコード自体が長くなる。
社内のVBAコード見るとコメントほとんど書いてなくてf8で追っても、よくわからないからなにがいいか分からない
設計さえキチンとしていれば大抵はコメント要らない。
Dim SLine As Long:SLine = 3 '読み込むファイルのヘッダーが二行ある為
みたいにプログラム依存でないパラメータを解説する時に使ったりはする。
ある程度の習熟が必要なので、ステップ実行でも何してるか分からない(正常に追えない原因が分からない)のであれば、
まだコメントの必要性について論ずる段階では無いので特に要らないんじゃないかな。
自分の昔書いたコードを改修しようとして訳分からないみたいなのを何度も経験して始めてコメントの要点が掴めると思う。
>>365
変数名からなるべく中身を類推できるようにつけてコメは最小限にしてる。
後で迷うくらいならつけたほうがいいと思う。コード記述して直後は完全にわかってるから迷うポイントに気づけない。一週間後とかに再レビューして、「コレなにやってんだろ?」と引っかかった所はポイントかな。
あとExcel本体の不具合、制限回避とかコメしてないと中々思い出せないことがある。 コメントは書いた方が良いんだが、余計なのはいらない。
変数名で分かるものは必要ない。
むしろどういう処理かのコメントを書く場合が多い。
それもそこのメンバーのレベルによる。
書ける奴らが集まってるなら、こんなもん分かるだろと書かない場合も多い。
コメントは処理の内容についてはしない
なぜその処理をするのかつかみにくいとリッキーだったり使用上やむを得ないときに理由を簡潔に書く
変更履歴をコード上に書くのは愚の骨頂だけどVBAだとほかに方法が少ないから自分かチームでルール決めるしかないな
質問です。
シミュレータソフトをVBAを使って制御しています。順々にモデルを解析していき、逐次計算結果がエクセルに反映表示されるような動作をします。
ただそのとき、きちんと逐次結果が表示されていく場合と画面に全く結果が表示されずプログラムが終わった途端に一気に数値が表示される場合とがあります。
途中でも解析結果が分かるよう安定して逐次表示するようにしたいのですが解決策分かる方いたら教えてください。
なお画面更新はもちろんオンです。調べたところdo eventsというのでWindowsに制御を渡すやり方もあるようですが、途中の動作が割り込む可能性がありそれは避けたいです。
自分も普段はほとんどコメント書かない。
適切な命名とコードの流れで処理は説明して、意図や補足説明にコメントを書くのが正しいと思ってる。
ただ、VBAではかなり細かく書いてる。理由は、VBAの時点でどうやっても読みづらいから。
勝手に行間調整するせいで
int n
WorkBook book
みたいな整列ができないし、Dim n As Integerって構文自体が無駄な単語多くて、数並んでいると読む気がなくなる。
スコープの区切りにEndを使うのも()よりコードに埋もれて見づらいしVBEの色設定は貧弱だし。
VBAに限ってはコメントで処理追った方が楽だって最近は思ってる。
早くエクセル操作に向いたもっとまともな言語出ないかな。
そうか、ここもvba方式なんだった。
int__________a
WorkBook___book
みたいにタイプと変数名で表っぽく配置することね。
>>372
VBAは宣言しないのがデフォなんだから、いちいちDimなんちゃらってやってたら、そりゃ不便だろ。 >>374
そうではなくて、変数の宣言構文がシンプルではないところを言っていると思うよ。 宣言しない奴のコードは読みたくないな。
宣言全部入れてから持って来いと言うかも。
>>373
VBAに慣れてれば、そんなの違和感無いけどな。 >>371
それじゃコメントのしようがない。
どんな風に制御しているのかとか、結果はそのシュミレータソフトから取ってきてるんだろうけど、そこから逐次結果が得られてるのかとかの詳細が分からんと何とも言えない。 Debug.Print もApplication.Statusbar もちょっと処理が重くなってくると表示が止まって役に立たない
>>380
Debug.Printの次にDoEventsを書けばすぐに出力される コメント関連ありがとう。
もう、人には見せない用だけどくどいくらいコメント書きまくってるw
VBAの開発環境について
デバッグ作業してると2画面欲しくなるんだけど皆さんどうしてる?
vBEの画面と通常の画面をフルスクリーンで見たいし、VBEもコード書き込む画面のほかに現在の変数が分かる画面と実行結果が分かる画面が欲しいからノート1台でやってると画面グチャグチャ
ノートはUPS付きのデスクトップとして使ってる
24インチのモニタに繋いで
無線キーボードとマウスで操作
モニタ2枚でやってるけど
ツールボックスのウィンドウとかフォームが画面の境界に表示されたりして
地味に対応していない感を醸し出してる。
フルHD以上なら1枚でもVBEを端っこによけておけば窮屈じゃないと思う。
それよりエディタの貧弱ぶりをどうにかしてほしい。
今時のIDEを触ると、VBEはふた昔前のオマケ機能なんだなと思い知る。
まあデバッグが必要になる様なマクロなんかこさえんなっで事だ
バグ発生に関与する要因としてコードの量のみを気にかけている
→ 初心者またはそれに準ずる低スキルのもち主
>>386を受けてバグが一切発生しない事を想定している
→ 0か100でしか物事を考えられないアスペ
デバッグをデバグと言っている
→ ガチのジジイか極端にセンスの悪い意識高い系
たった一言でここまでプロファイリング出来ました え??コード書き書きしたら一度も動作チェックしないで実装するの?
すげー!
ほぼ途中で止まって黄色くなる身としては信じられない.
全ての動作の確認と変数の動作に変な所がないか見るの楽しい.
それに人が書いたコードで動作チェックするにもf8必要だし
ただ、F8連打も大変だから超ゆっくり動作する機能でもあればいいのに
虫見付けるたんびに「バッグだ!バッグだ!」言うんか 自分の発言に違和感無いんか
プログラムがおかしい以上バグはバグだ
開発中に個人で見つけてるから影響が小さいというに過ぎないが
べつにいいじゃんバグでも
リリース版を出すかどうかをデバグ作業と呼ぶかどうかの境界線にしてるって事なのかな?
バグまみれでリリースして、ネット経由でパッチを当てるのが当たり前になった事が原因で、
そういう感覚が生まれたって考えるとなかなか興味深い現象だな。
お前、リアルで嫌われ者だろ
たった一文でここまでプロファイリング出来ました
質問です。(スレチかもだけど、他よりここの人たちのほうがLevel高そうなので)
Excel2013 @Win10 64bit Core i7 Mem8GB
ここ数日でAutoFilterのパフォーマンスが急に悪くなったと感じています。
テーブルは2000行*50列程度。
症状としてはフィルタリング済みのシートをSelectする際にタイムラグが発生します。
最初原因が分からなかったのですが、設計を少しずつ切り落としていった結果、
フィルタ範囲に入力規則が設定されていたのが原因でした。
その内容はIMEOffのみ。
フィルタがかかってない場合は瞬時にシート切替できるのに、フィルタリングされていると
切替に数秒待たされます。
フィルタ列が増えるとラグが倍増します。
また、列要素の先頭行付近の要素でフィルタされている場合の方が影響が大きいです。
2〜3日前までこのようなことはなかったのに、、何かExcel環境自体がかわったのかと
思いくまなく調べるのですが、原因が掴めません。
(つづく)
>>394
(つづき)
マクロやシート上の把握できていない設計要素の影響を除外するために新規xlsxファイル
で試しました。
前提:評価ブック以外のブックは開かない。
シート1:2000行*50列の表を作成、A-Zの1文字をランダムに埋め、AutoFilter設置。
書式設定、条件付き書式等は一切行わない。
入力規則は評価条件とする。(IME制御なしの場合とIME-Offの場合)
フィルタ実施時は、2列絞り込む。
シート2:空シート
評価用Macro(シート1)
Option Explicit
Dim st As Single, ed As Single
Private Sub Worksheet_Deactivate()
st = Timer
End Sub
Private Sub Worksheet_Activate()
ed = Timer: Debug.Print ed - st
End Sub
(つづく) >>394
(つづき)
評価方法:
1)フィルタ設置のシート1を表示
2)Ctrlキーを押しながら、PgDn→PgUpを連続して押下。
3)Immediateウィンドウで計測時間を確認。
上記を5回程度実施
条件と結果:
Case IME制御なし+フィルタなし ▼平均時間:約70msec
Case IME制御なし+フィルタ-On ▼平均時間:約70msec
Case IME-Off+フィルタなし ▼平均時間:約70msec
Case IME-Off+フィルタ-On ▼平均時間:約7000msec
ちなみに1列フィルタリングした場合は、約1400msec程度でした。
対症療法としては「入力規則使うな」となりそうですが、2〜3日前までは上記
現象は発生していなかったので、、原因療法が知りたいです。
どなたか上記現象分かるかたいらっしゃいませんか? >>396
思い当たるのは、FCUでIMEの挙動がおかしくなったという報告多数な件 >>397
Version1703なのでまだFallは当たってないようです。 ホントMSはアップデートなのかウイルスなのか分からんことするよな・・・
>>399
ちなみに職場の環境
Excel2010 @Win7
Excel2013 @Win8
では再現しませんでした。
やっぱりなんらかのUpdateが当たったのか、それとも自分でなんかやらかしてるのか、、、 午前中にメッセージが出てアプデするか? とか聞きゃあがったから「あいよ」ってんで気軽に再起動した
90%ぐらい完了した後で Cannot だってやんの しょーもないから電源落として午後再起動したら
また「アプデするか?」 って もうね、アホかと
Windows
押しつけがましいアップデートメッセージが出て
いいえしまくってたんだけど
ちょっと目を離して風呂入ってたら勝手に合意したことにしてOSインストールされてた
そんな俺が客先で作らされてるのは顧客が一日黙ってたら契約に合意したことになるシステム
質問です。
LastCellって簡単に取得できるのにHomePositionってこれといった決定打がないんですかね?
SendKeys以外で簡単に安定して取得する方法ってありますか?
できればSelectしなくてよい方法で。
ADODB.Streamで大きめのテキストファイルを読むときLoadFromFileが重いので、Openの引数でファイル指定してから
ReadTextするようにしたいんですがうまくいきません。
パスをそのまま書いても、"file://C:temp/data.txt"のような書き方をしてもことごとくOpenのところで落ちてしまいます。
どう書けばいいんでしょうか?
ちなみに先頭100行を試し読みするときとかに使いたいです。
>>404
それならコード貼ったほうが早い
使い方云々が知りたいだけならググればいいし 名前を付けて保存する際
最近使った“アイテム”が
今週〜,先週〜,しばらく前,という順番で使用履歴の各ファイル名が表示されます。
これを表示させない設定を教えてください。
よろしくお願いいたします。
スペック
↓
OS=Win10
Excel2016
Officeバージョン=1710
↑すいません、質問するべき板を間違えました。ここはVBAでしたね。
他で聞いてみます。
チョイ前に変数の宣言が話題になってたから俺も一ネタ言いたい
「redim で変数の宣言が出来る仕様はやめて欲しい」
変数名を間違えた時にエラーで気付けるように普段から変数の宣言を強制してるんだけど、
redim で配列を変更する時に変数名を間違えても
新たな別の変数扱いされてエラーにならないから気付かないことがある
配列変数でも宣言は dim 、要素変更は redim っていう風にしといてくれたらと願ってやまない
Application.GetOpenFilename でファイルのパスを求められることが分かった
Application.GetOpenFilename
Workbooks.Open.Filename:=Application.GetOpenFilename
ってできないことが意味がわらない
あと
Workbooks(Application.GetOpenFilename)ってやるとパス付のでエラーになってしまうこともわかった
Workbookオブジェクトに適当な変数を宣言して iとする
i = Application.GetOpenFilename
i.worksheet()ってできない意味がわからない
i = Workbooks.Open(filename:= ApplicationGetOpenFilename)
i.worksheets()
これならできる意味がわからない
()で戻り値をくくるのはわかる
でもこの場合の戻り値はパス付戻り値であるから Applcation.GetOpen....
はいらないのでは?パス付戻り値ならば
i = Application.GetOpenFilename
でもできるのでは?WorkBookオブジェクト変数だから
誰か答えられる?
わりと真面目に答えてくれ
オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない
なんのためのオブジェクト変数なんだ
Workbooks.Open(filename:= ApplicationGetOpenFilename)
これもパス付のファイル名なのになんで格納できるんだ?
まず型というものを理解してください
つぎに、プロパティというものを理解してください
つぎに、オブジェクトにはデフォルトプロパティというものがあるのを理解してください
あと名前付き引数に対する理解も必要ですね
VBAではSetでの代入とLet(を省略した)代入では意味が違うので、それもちゃんと区別してください
いちいち全部ここで解説はせんが
このぐらい理解すればたぶん答えはわかるだろ
まじめに答えといてやるけど
>オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない
たぶんお前がやってるのは、そのオブジェクト変数のデフォルトプロパティに代入しようとした
で、そのオブジェクトがそれを受け入れないからエラーがでたんだろうな
>Workbooks.Open(filename:= ApplicationGetOpenFilename)
>これもパス付のファイル名なのになんで格納できるんだ?
格納の意味が分からん
ApplicationGetOpenFilename(の結果)をたんにOpenの(filename)引数として渡してるだけ
ApplicationGetOpenFilenameの結果がOpenのfilename引数として適当だからエラーが出なかっただけ
パス付戻り値っていう表現が凄い
Application.GetOpenFilenameの戻り値は、パス文字列か、パス文字列の配列か、ダイアログがキャンセルされたときに返されるFalseかのいずれかしかない
パス付って、何にパスがくっついてると理解してるんだろう
パスが戻り値そのものだろう
>>414
意味がわからん
初心者相手に専門用語で勝った気になるなよ >>415
パスってのは
¥C:のことだろ?
openメゾットの戻り値も¥C:ついてるのに
WBオブジェクト変数に格納できる意味がわからない
専門用語でこたえるな わかりやすく答えろ
外人相手に口喧嘩して勝ち誇ってるやつと同じだわ workbookのオブジェクト変数のデフォルトプロパティってなんだよ
そこを答えろ
答えろって言わないと答え出て来ねえのかよ
ちなみにおれはVBA初めて3時間
ここまでの疑問が出るだけすごいと思うけど
>>410
>Workbooks.Open.Filename:=Application.GetOpenFilename
>ってできないことが意味がわ「か」らない
Workbooks.Open Filename:=Application.GetOpenFilename
なら動くんだが、それではダメ?(open と filename の間は半角スペース)
何故かと言えば言語の仕様として
引数はピリオドで繋ぐものではないからとしか言いようがない
(workbooks はオブジェクト、open はメソッド、filename:=~ はその引数)
>i = Application.GetOpenFilename
>i.worksheet「s」()ってできない意味がわからない
変数i が workbook型だとして、Application.GetOpenFilename の戻り値はworkbook型ではない。
戻り値はvariant型なんだけど、キャンセル時に false になるだけで、ファイルが選択されていれば文字列が返される
複数ファイルが選択されてても文字列が配列で帰るだけ
それに、i がworkbook型変数なので set を付けないとダメ
i が variant型変数 なら文字列か false が帰るだけでヤッパリ workbook としての挙動はしない
i.worksheet「s」() っていうのも、worksheetオブジェクトは
既に開いているブックのシートしか指定出来ないから、i がブックとしてオープンしてなきゃ当然ダメ
>i = Workbooks.Open(filename:= ApplicationGetOpenFilename)
>i.worksheets()
>これならできる意味がわからない
set i = Workbooks.Open(filename:= ApplicationGetOpenFilename)
じゃないと動かないよ
理由は前述のとおり >>417
Openメソッドの戻り値はパスではなく、Workbookオブジェクトそのものだ
開いているブックの集まりであるWorkbooksコレクションオブジェクトに、引数Filenameで指定したブックを追加して、戻り値としてそのブックそのものを返す処理だ
何か根本的に勘違いしてるだろ君 >>420
お前がまだわかりやすいな
ただし
おれはすでに開いているファイルじゃないと操作できないとかは全部知っている
オブジェクト型変数の前にsetステートメントを置くことも知っている
つまり
Application.GetOpenfilename = ファイルを開いた時は文字列が返される
workbook型に返せないのか?
答えはパス付きの文字列で帰って来るためにノーだ
これも知ってる
Workbooks.Open filename:=Application.GetOpenfilename
これも知っている
しかし結果としては
ファイルを選択で開いたパス付き文字列を開く
という命令なはず
同じパス付き文字列なのにworkbook型に格納できないのが意味がわからない >>421
ん?なんで?
msgboxで表示されてもパス付きになるよ? またも意味不明な現象が起きた
拡張子を指定しなかったのに開いた
拡張子を指定したらなぜかエラーが出た
なんでだ?
>>418
オブジェクトには、特にプロパティ名を指定しないでアクセスする場合に、優先的に参照されるプロパティが決められていて、それをデフォルトプロパティと呼ぶ
オブジェクト型に合わないデータを代入してしまう構文になっているときでも、データの型がデフォルトプロパティの型に適合していればVBAはデフォルトプロパティへの代入として解釈して処理を受け付ける >>421
Workbooks.Open(filename:= ApplicationGetOpenFilename)
→\C:〜〜〜〜という文字列が返される
ApplicationGetOpenFilename
→これも同じ
なぜ前者はWorkbook変数に格納できて
後者はできないんだ? >>425
そんなもん知ってるわ
Rangeやcellsのvalueみたいなもんだろ?
Workbookオブジェクトのデフォルトプロパティはなんだ? >>422
悪いけど>>410 の書き方じゃ分かってるようには見えない
set を付けてない時点でこの人は分かってないんだなと判断されても仕方ない
そして
>Application.GetOpenfilename = ファイルを開いた時は文字列が返される
も間違い
Application.GetOpenfilename は、
あくまでもファイルのパス情報を文字列(或いは false)で返すだけで
実際にブックを開けることはしない
だから正確に書くと
Application.GetOpenfilename = ファイルを「選択した」時は文字列が返される
というべきで、そのブックを開くためにworkbooks.open を用いる必要がある >>428
set
オブジェクト変数を代入するとこに扱うステートメント >>428
ファイルを開いたっていうのは
選択したって意味なんだが
オブジェクトとOPENメゾットで初めて開く
こんなの知っている >>428でもまだ不正確だった
より正確に言うと
Application.GetOpenfilename =
「開きたい(あるいは移動、コピー、改名、削除など何らかの操作をしたい)」ファイルを「選択した」時は文字列が返される
ですね >>431
んなもんしってるわ
キャンセル押されたらフェイルス
ファイルを選択したらパス文字列 >>430
いや、それが分かってるなら何を問題にしてるのかがよく分からない
それと「メゾット」じゃなくて「メソッド」ね 真面目に答えるんじゃなくて
わりと真面目に答えるように
>>418
ちなみにworkbookオブジェクトのデフォルトプロパティは存在しない
存在しないから当然、workbook型に合わないデータは代入できない >>435
じゃあなんで
workbook.openのパス文字列は入るんですかねえ 質問の意味がわからないんですよね
何が疑問なのか、独自表現を用いずに、
set やなんかも省略せずに正しく動作するコードと
動作しない理由が知りたい動かないコードを書いてみてもらえます?
>>426
workbooksは、workbookクラスではない
別のオブジェクトのクラスだ
それから、さっきも書いたが、Openメソッドの戻り値は引数で指定されたパスを持つWorkbookオブジェクトなのであって、Openメソッドによってパス自体が戻ってくる訳ではない
パスを返してくるApplicationクラスのGetOpenFilenameメソッドとは全く働きが違う
プロパティやクラスや引数の名前で何となくbookとかfileとか付けばパス付のWorkbookオブジェクトが返ってくるものと混同してるようだが、きちんと区別しないといけない >>436
Openメソッドが要求する名前付き引数Filenameに、GetOpenFilenameで取得したパスを設定して、その結果新しく開いたWorkbookオブジェクトが返っているからだよ
このFilenameはApplication.GetOpenFilenameメソッドの戻り値ではあるけど、Workbooks.Openメソッドの戻り値ではない
Worksheets.Item(Index:=ActiveSheet.Name)みたいな処理と一緒だと言えば少しは分かるか? たぶんこの質問者は、コレクションを知らないタイプだな、
それから、式に含まれるプロパティ名やメソッド名をオブジェクトのクラス名と同一視しているタイプだろう
たぶんハイパーリンクでパスが表現される事が多いところから、
パスが文字列とは異なるデータ型を持つ何かだと勘違いしてるだけじゃないの?
>>441
workbooks.open filename:=Application.GetOpenfilename
この場合はworkbooksオブジェクトに選択したパス文字列が格納されるのか?
だからworkbook型に格納できるのか? >>444
ん?
workbooks
worksheets
rows
これはコレクションだろ?
コレクションはオブジェクトの最上位
プロパティはオブジェクトの何?
メゾットはオブジェクトに命令
違うか? >>446
君の言う「格納」は、コレクションへのオブジェクトインスタンスの追加、プロパティ値の設定、変数への代入、引数の受け渡し等がごちゃごちゃになっていると思う
まず、Workbooksコレクションに、データの代入はできない
WorkbooksコレクションはWorkbookオブジェクトの集まりを要素に持つコレクションオブジェクトだから
それから、Workbooks.Open Filename:=Application.GetOpenFilenameという構文は、Workbook型の変数に値を代入しているわけではない
Filenameという名前付きで定義されたOpenメソッドの文字列型の第一引数に値を渡していて、その結果としてOpenメソッドがWorkbookオブジェクトを返しているわけで、オブジェクト型変数への代入ではない >>447
コレクションは最上位じゃない
一番上にあるのはオブジェクト >>449
いやそんなのしってるんだけど
dim i string
dim wb workbook
application.Getopen filename:=で目的のファイルを開く
そしたら「¥:目的のワークブック.xlsx」が文字列として帰って来る
workbooks.open filename:=目的のファイル
これで初めて目的のファイルが開く
ここで本題
どちらも目的のファイルのバス名が返ってきているのに
set wb = application.GetOpen filename
だとエラーで
set wb = workbooks.open (filename :=目的のワークブック.xlsx)
これならwbオブジェクト型変数に代入される意味がわからない
これをはっきり答えろ
わかりやすくな >>450
一番上
↓
最上
日本語やり直したほうがいい >>451
Set wb = Application.GetOpenFilename
は、String型をWorkbook型のポインタへ代入しようとしてエラー吐いてる。
Set wb = Workbooks.Open(Application.GetOpenFilename)
Set wb = Workbooks.Open("目的のワークブック.xlsx")
は、OpenメソッドにString型変数を渡しているから機能する。 >>453
workbook型のポインタってなに?
これがわかればすっきり >>447
コレクションはオブジェクトの最上位、という発想がそもそも間違い
コレクションは子要素に追加されているデータやオブジェクトへのアクセス等を提供する、子要素からは独立したオブジェクトだ
更に、WorkbooksコレクションオブジェクトはWorkbookオブジェクトのみを要素に持つようにあらかじめ最適化された規定のコレクションオブジェクト >>453
WB型変数に文字列代入は不可
メゾットの戻り値の代入は可能ってこと?
なんで? >>452
日本語だけ知ってても言語仕様を正確に説明する難しいんだよ
コンピューター業界では「上位」などの言葉には特別な意味を持たせる場合もあるし、
とくに相手がド素人だと、言葉の意味から説明するのも面倒だから、あえて上位という単語は避けた上で
なんとなく通じてくれそうな「上」って言い方をしたんだよ
お前の態度が気に入らないからワッチョイ Spc7はNGするわ
人に何か質問する時は最後までていねいな言葉を使え >>457
うんこーwwwwwwwwwwうんこーwwwwwwwwww >>451
そもそもApplication.GetOpenFilenameはブックを開いてブックへの参照を返すメソッドじゃなくて、ユーザーにダイアログ画面上で選択させたファイルのパスを返すメソッドなんだが
メソッド名で混乱してるだろ君 >>459
いやしってるけど
キャンセルが押されたらフェイルスだし
選択したらパス名が返って来る
何回言えば気がすむんだよ Openメゾットはただブックを開くだけだろ?
ただし 引数を戻り値として得られる
つまり 開いたファイル名がOpenメゾット内にある
違うかい?いい線いってる?
>>456
なんでも何もデータ型が一致するかどうかが問題であって、メソッドの戻り値の型は一致するってだけ。
たぶんJavaScriptから始めたせいで認識がおかしくなってるんだろうけど、
普通はデータ型が異なる変数同士の代入は出来ない。 この質問者みたいな人が言語仕様について思い込みや勘違いをしたまま共用マクロを組んだりすると、会社にとって迷惑なだけなんだよな
作ったマクロを他人と共有しないことを祈るのみ
>>460
それ俺がきのう説明したことだよねw
オブジェクト型変数にGetOpenFilenameから返った文字列型データやデータ配列を設定しようとしてるのがおかしいんだがw
データ型とか一回学んだ方が良いと思うよ
それから蛇足だけど、フェールスじゃなくて、フォルス、フォールス、ファルスの何れかの表記にしないと、Falseのことだと理解してもらえないことが多いと思うよ >>461
引数の文字列は戻り値にならない
Openの戻り値はWorkbookオブジェクトの実体だ
Workbookオブジェクトの実体とパス文字列はイコールじゃない
それから、メゾットじゃなくてメソッドな
あんまり特徴的な言葉づかいしてるとメゾット君と
フェールス君とか呼ばれたりするかもしれないから気を付けなよ >>465
実体でなに?どころどころで補足質問しねえといけねえのかよ >>462
変数同士?
workbook型あとは何?
これも補足質問 >>464
データ型の参考ページは?
猿でもわかるやつ >>468
その言い方は猿に対して失礼だぞメゾット君
WordやPowerPointのVBAと違ってExcelは「Excel VBA データ 型」でググれば腐るほど情報が出てくるから、好きなページを読んで出直してきたらいいさ
インスタンスもググってみたらいいよ >>466
Workbookの実体とは開いて実行しているエクセルブックのことだよ。ブックはVBAが管理しているメモリ上のデータではないってこと。そこにアクセスする為の情報だけがWorkbook型変数には格納されている。
これ以上はググったほうがいいな。メゾットちゃんには言葉だけでは通じないみたいだし。 どう考えてもこいつは型も文法も戻り値も理解できてないだけだろ
インスタンスはお湯かけて3分で完成するよ
(´・ω・`)b
体系だてた答えがほしいならオブジェクト指向あたりの本読んだ方がいいんじゃねえの
正確にはオブジェクト指向じゃないけどクラスとインスタンス(やそれにくっついてるメソッドやプロパティ)の関係を理解するにはそれがはや道だわ
ここは教科書じゃないから
>>470
ふーん
開いてから格納する
これだけだよね?詰まる所は Openメソッドで開かないと
workbook型に入らない
それは結果に過ぎない
ちゃんと原因や理屈を押さえないとまた同じことで詰むぞ
>>477
それをわかりやすく教えて
ほんとにわかりやすく ID:QIiUylbtpはVBA以外の言語知ってるの?
それともExcel VBAで初めてプログラミングに触れましたって人?
お前の学習レベルがわからないからお前でもわかるように説明できないんだ
ここには、彼の疑問に答えられるような人はいない。
こんぴゅうたーのでんげんをいれるとどうしてえくせるがうごくのかをせつめいするのはむずかしい。
でんきにはつうでんしてるときとつうでんしていないときがあるのでそれをりようしてぜろといちをくべつできる。
ぜろといちをくべつできればにしんすうをりようして...
大体教えてもらう立場のやつがとる態度じゃないからまともに取り合ってもらえると思ってる時点で頭が悪い
初心者なのに態度悪いからNGにしたわ。
教えてもらう態度じゃないよね。子供ならまあ納得だけど。
そもそもWorkbooksに指定するのはエクセルファイル名じゃない。
ブック名だ。
開いたブックのブック名とファイル名が同じになるから勘違いしてる奴もいるかもしれんが。
同じだったらファイル名でええやんw何鼻息荒くしてんの?w
>>485
恐らく>>484はWorkbooks.Itemの引数について話してるんだろうだが、君にはそのあたりが分からんみたいだな >>453
をもとに考えてみた
お金を入れるとカップにジュースが注がれる自販機を思い浮かべるんだ
Set wb = 'ジュースが入るカップ
Workbooks.Open( _'お金を判別してボタンが押されるとジュースを出す回路
Application.GetOpenFilename _'お金
)
→お金を入れてボタンを押したらカップにジュースが注がれる
Set wb = Application.GetOpenFilename
→カップに直接お金を入れて飲めないと騒ぐあほ
どうだ!? >>451
お前バカだろ
変数wbはただの入れ物
workbook型しか入れられない入れ物にString型入れようとしてんだぞ?
これでわからないならただのバカだから二度と来るな >>490
おまえのカアチャンは誰でも受け入れるのにwbって意外と固いんだな >>490
うん
それはしってるよ
でもworkbooks.Openでも同じだよね
文字列帰って来るよね application.getOpenfilename
→あ.xlsxを選択
C:¥あ.xlsx が帰って来る
workbooks.Open filename:=application.getOpenfilename(つまりC:¥あ.xlsx)
ん?どっちもパス付きのブック名じゃねえの?
ってことをいってる
>>493
文字列として返ってきたから文字列型と思ってるなら、一回workbook型をウォッチに入れてみたら?
ツリー形式でオブジェクトの、中身が見れるから全然別ものだとわかるはず >>492
バーカw
"C:\うんち.xlsx"がworkbooks型の変数に代入できる分けないだろw
まあデフォルトプロパティなんてものが罪なんだが
てか、workbooks型のデフォルトプロパティってNameプロパティなんだな(Pathか?)
はじめて知ったわ、使わんから Application.GetOpenFilename → 指定したファイルのパス【String型(正確にはVariant)】を取得
Workbooks.Open → filenameに【String型でファイルパスを指定】すると
そのファイルを開いた結果の【Workbook型オブジェクト】を取得
Dim str as String
Dim wb as Workbook
str = Application.GetOpenFilename →OK
str = Workbooks.Open(Application.GetOpenFilename) →NG
Set wb = Application.getOpenfilename →NG
Set wb = Workbooks.Open(Application.GetOpenFilename) →OK
オブジェクトブラウザーを見ると勉強になるよ
それぞれ、こうなっている
Class Application
Function GetOpenFilename()
Class Workbooks
Function Open(Filename As String) As Workbook
>>486
違う。
新規ブックの場合はファイル名じゃないだろ。
理解出来て無い奴に理解出来る奴向けの説明をしても駄目だ。
たまたま同じになってもブック名はファイル名じゃ無い。
だからパス付きだろうがパス無しだろうがファイルはファイルだと考えても、それとは関係ないブック名は違う。
C:¥abcd.xlsxというファイルとブック名としてのabcd.xlsxとは何の関連も無い。
似たように見えるのはたまたまだ。
だからC:¥abcd.xlsxはブック名には成りようがない。
>>493
Application.GetOpenFilenaneで帰ってくるのは"C:¥あ.xlsx"という文字だけな。
Excelブックとは関係ないファイル名だな。
例えばメモ帳で適当に入力して保存したファイルでも取ってこれるだろ。
それに別に"C:¥あ.xlsx"はExcelじゃないと開けないというわけでも無いぞ。
そもそも"C:¥あ.xlsx"はApplication.GetOpenFilenaneで取ってきたからファイル名だろうけど、取ってきた後のその文字列は=ファイル名とは限らん。
Dim wb As Workbook
Dim strFile As String
strFile=Application.GetOpenFilename
ってのはstrFileにたまたまApplication.GetOpenFilenameによってファイル名が入ったということで、
Set wb = Workbooks.Open(strFile)
のstrFileがファイル名かどうかは分からん。
このー文はApplication.GetOpenFilenameのことなんか知らんからな。
このー文の意味するところはstrFileをファイル名と思って開いてみて、開けたらwbに格納するってこと。 短くわかりやすくまとめられるやついねえの?
いくらVBAができたって引き継ぎができない奴は無能なんだが
俺もずっとROMってたけど
こいつらの説明はマジで意味不明だわ
お、良い線言ってんな って思ったらいきなりカタカナ語がでてきてググっても意味不明
こいつらマジもんのコミュ障すぎてイラつきしかない
オナニー発言ばっかで答えがない
Apllcation.GetOpen
でaaaっていうエクセルを開く
C:\aaa.xlsx が返ってくる
しかしWB(Workbookオブジェクト変数にしている)では指定できない
でも
Workbooks.Open filename:=Apllcation.GetOpen
これはWorkBook型に入る
つまるところどっちもC\aaa.xlsxって文字列を返してんじゃねえの?何がちげえの?ってこと
これいうの10回目ないい加減学習しろイラつくな
こいつらのたとえ
子供がリンゴを指さす
「これなに?」
こいつら
「これは物質○○が含まれて○○っていう色素があって赤い、つまり栄養は○○がふくまれている
ちなみにその栄養は○○って物質にも入っている」ドヤァ
って感じ
見ててムカつくから発言したわ
おれが聞きたいのは
なんでワークブックスオープンで指定したファイル名文字列だとワークブック変数に格納できんだよって話
ゲットオープンはパスがついているから格納できないのはわかった
わかりやすく答えろ
前にいた関西弁の荒しと同一人物なんだろうけど、健気にもちょっと勉強してきてるのが笑えるw
>>501
無理。
軍事用にコンピューターというものが発明されてから今日までの歴史と仕組みを説明しなきゃならんから。
そして、君にそれを理解出来るだけの能力が有るとは思えないから。
大抵の人は全てを理解しているわけじゃ無いが、自分の利用している範囲ぐらいは理解している。 >>499
ん?
>Apllcation.GetOpenでaaaっていうエクセルを開く
これ間違い。
開かない。
ファイル名を取得するだけ。
>しかしWB(Workbookオブジェクト変数にしている)では指定できない
ファイル名じゃないからな。
ブック名を指定する必要がある。
たまたま偶然ファイル名と同じだけどパス付きはブック名とは違うな。
>Workbooks.Open filename:=Apllcation.GetOpen
これはWorkBook型に入る
Workbook型に入ってるのはファイル名じゃない。
Set WB=Workbooks.Openの意味するところはfilenameに指定された文字列をファイル名と見立ててブックを開き、もし仮に運よく開くことができたらそのブックをWBに格納するという意味。 >指定された文字列をファイル名と見立ててブックを開き
これが意味不明
GetOpenで指定したファイル名を返すんだろ?
じゃあこれはファイル名になるじゃねえのか?
ファイルを開かなかった場合はファルスがかえることはわかる
>>505
GetOpenFilenameの文とWorkbooks.Openの文は別の文だろ。
プログラム組む奴はGetOpenFilenameで取得したものと違うものを入れることも出来る。
だから結果的に入ったのはファイル名でも、
Workbooks.Open自身はそれを前提にはしないだろ。 >>496
このレスの一番下がわかりやすいんじゃない? GetOpenFilenameはメモ帳のファイル名を取って来ることも出来る。
Wordのファイル名を取って来ることも出来る。
Workbooks.Openで開けないファイル名ということも有るし、Workbooks.Openで開けるファイル名だとしてもExcelで開かなければならないということも無い。
>>507
オブジェクトブラウザーでてなんだよ
わからねえよ >>509
あーなんとなくわかったかな
Openメソッドで開ける=エクセル型=ワークブック型に格納可能
ってこと? >>496
つまりだ
君が言いたいのは(要約しないとダメなのかよ、、、)
application.GetOpenfilenameだと文字列として返ってくる
workbook型には文字列は入らない
こういうことが言いたいのね? >>508
それはコンピューターというものをまるで理解出来ていないからそうなる。
厳密には
strFile = Application.GetOpenFilename
が実行されたからstrFileはファイル名だろとコンピューターに言っても、コンピューターは違います、文字列です。と言う。
strFileに入っている文字列のファイルは有るのかと問えば、有ります。と言う。
じゃあ、strFileはファイル名じゃねえかと問えば、違います、文字列です。と言う。
コンピュ−ターは人間が考えるような意味を理解しない。
定義通り動くだけ。 >>513
また回りくどい言い方してんな
頭悪いのか >>515
最初からこう言えよ
馬鹿じゃねえの?
ほんとにバカしかいねえよ
呆れるというか心配になってくる 補足するとworkbook.Openで返ってくる(開く)=workbook型ということね
>>514
君がどこまで分かって無いのか、こっちは分からないんだ。
エスパーじゃ無いんだから。
>>512の話だって型とは何だ?という説明もしなきゃならんのか?と考えれば>>513のような話も必要になって来る。 >>516
最初からみーんなそう言ってるぞw
ようやく頭が追い付いてきたのかな? メゾット君もだんだん自分の頭の悪さを自覚してきてるみたいだし、あと二日以内には恥ずかしい捨て台詞を残して消える運命かな
レス保存したからいつでも再放送出来るけどなwww
>>512,516
>>413でまっさきに型を理解しろって言ってんだが
まあここまで食い下がる根性は認めるけど、いいかげん最低限は自分で勉強してくれ 多分Excel VBA入門的な記事を読み進めればすぐに理解できたと思うんですけど
勉強の進め方が下手くそすぎる
ちなみにさ
VBAってなんでメンテナンスがいるの?
コードを直接弄るわけじゃないからバグなんてでないと思うけど
てめーの提示したコードエラー出まくりバグばっかじゃねーか
コードは変わらなくてもWindowsとかExcelとか業務仕様とか、まわりが変わっていく
VBAは楽しいぞ
俺はmos マスターだがVBAはいっさん知らんかった
最終目標としては意味不明な超複雑なコードを記述し
おれが辞めた後は誰も対処ができないという優越感を味わいたい
そしてVBEをだしてカチカチしてる姿がなんとも知的でかっこいい
ほんとこれだけのきっかけが知識につながって行く
>>528
それは能力の低い奴の言う言葉。
能力のある奴はお前が辞めても対処できるように記述する。 >>528
いや、ずっと同じ質問してる辺りこれっぽっちも知識が増えているように見えないんだが
そしてブーメランに草 >>521
そこをあっさり理解出来ないからここまで時間制掛かってる。
彼の分かってない所はみんながそういうもんだとあっさり進む所で自分中心で考えること。
コンピューターが自分と同じように考えてくれると思ってる。
アレンブラやマシン語の不自由な世界で自分と同じようには考えてくれないということを思い知った方が良い。 もの凄く複雑で他人の理解が及ばないようなコード書くのが目標なら、
なおさら誰の助けも借りずに独学で高めていくのが重要なんだよなぁ。
ネットで検索して簡単に見つかるような情報すら当たれないヤツが目指すものじゃないよね。
>>497
いやなんかまた鼻息荒くしちゃってるけど元々同じって言ったのお前だからなw
なんで素直にブック名とファイル名は違うって言えないんだよw
どうせ下手くそな説明なんだから無理して技巧的に言おうとすんなw >>533
こいつらのオナニー意見なんて一切参考にせず自己解決したんだが?
Wrokbook型変数「これは文字列だから俺の方にははまらないよ」 = _
Application.GetOpenFilename「すまん、俺はただ選択されたファイルの文字列を返すだけなんだよ」
Workbook型変数「お、WorkbooksオブジェのOpenメソッドで開いとるやん。格納できるよ」= _
Workbooks.Open (Filename:=Application.GetOpenfilename)「俺は開いた文字列をファイル名として返すね」
これでどう?誰でもわかりやすいと思うけど?
頭悪すぎね?君たち なんか
1 + 1 =2
を
「1に1を加えると2になる」
と表現してる感じだなあ
>>537
そもそもWorkbooks.Openメソッドはファイル名を返さないから、
「1+1 は 2 じゃないぞ。俺たちは 1 + 1で200だ。10倍だぞ10倍」みたいなもん。 >>536
わかった!君はプログラムじゃなくて日本語の勉強から始めよう 会話形式にしてくれないと理解できないといってくれれば誰か頑張ったかもねw
>>539
はいはいブック名ね
どっちでもいいだろアホ >>542
ブック名も返さないよ。
何にせよWorkbooks.Openメソッドが名前を返したら
Set WB = Workbooks.Open(Application.GetOpenFilename)
が成立しないから。 >>543
はいはい
workbookオブジェクトを返すのね
はいはい死ね死ね >>536
それ、全部既に言ってたからw
お前はみんながすんなり分かるところをこれだけすったもんだしてやっと分かっただけ。
これまでのやりとりが無かったら、それそのまんま言っても理解出来て無い。
そもそも、バカがどうしてバカなのかなんてこっちは理解出来ない。
お前とは違うからな。 メソッドの返り値として何の型のどんなオブジェクトが返ってくることを意識する重要さが微塵もわかってないのでこいつのVBAスキルはここで打ち止めだな
整数 + 整数の戻り値が整数なのに整数 / 整数の戻り値が整数じゃない理由がわからない、不合理だ、と
駄々をこねる人間もいるんだからしょうがない
世の中にはこういう本物のバカもいるんだなあと勉強になったよ
わりとそこかしこに居るけどな、本物のバカ
ひきこもりか?おまえw
>>547
まだ始めて2週間って話してなかった?
ちなMOSエキスパート所持者ね >>419からもう二週間も経ったのか。時が経つのは早いな。 >>552
> ちなMOSエキスパート所持者ね
ここ、笑うとこですか? MOSエキスパート?
何それ美味しいの?
昔、「初心者だから仕様がないけどさ」と説教した相手が今回君が挑戦してる言語のエキスパート持ってたけどさ。
先日、AutoFilterとValidationの不具合で質問したものです。
(まだ解決していませんが、、)
また新たな不具合に悩まされています。
このような場合、どこに報告すればMSの目にとまりますかね?
もし同一環境のかたおられましたら再現テストしていただけるとありがたいです。
[環境]
Microsoft Office Home and Business 2013
バージョン: 15.0.4989.1000 (2017/12)
Excel2013
Win10 64bit Core i7 Mem8GB
[手順]
以下の手順で実行するとシートSelectが不完全な状態になる。
Trigger: 別シートの貼付画像のOnAction
→PopupMenuのOnAction
→呼び出されたProc内で、SheetSelect
続けてAutofilter実施 (直接の原因ではない)
(その2へ)
>>556
(その2)
[現象]
・Fitering成功しているように見えるが、非表示セルにカーソル移動できてしまう。
・セル値の削除が効かない。(連動イベントが動かず、本現象に気づく)
・範囲コピー貼り付けが正しく行われない。
・セルをコピーモードにしても、選択範囲が破線矩形にならない。
→なんと恐ろしいことに、操作の対象が現在見えているActiveCellではなく、
呼出元画像のあるシートの同一番地に対して行われている様子。
破線矩形も元シートを開いたらそこにあった。
削除処理も元シートに対して行われる。
ステータスバーのセル値カウントも、現在見えているシートではなく、呼出元の情報を返す様子。
ActiveCell.Address(External:=True)は実際に見えている移動先シートを示しているのに、、、
[発生条件の再検証]
・別シートの画像.OnAction→Popup.OnActionで初めて成立。
・画像.OnActionから直接Proc実行(Sheet選択、Autofilter実施)では再現せず。
・Alt+F8からのPopup起点とすると再現せず。
・Popup.OnActionを入れ子にしても再現せず。
・ボタンをTableと同じシートに配置した場合は再現せず。
・Office2010では再現せず。
(その3へ) >>556
(その3)
[試験に用いたコード]
1) テーブルとは別シートにある画像を選択して、ImmediateからOnAction登録。
Selection.OnAction = "mkPop"
2) Popup生成
Sub mkPop()
With CommandBars.Add(Position:=msoBarPopup)
With .Controls.Add
.Caption = "Filter"
.OnAction = "DoFilter"
End With
.ShowPopup
.Delete
End With
End Sub
3) Filterling実施
Sub DoFilter()
Sheets("List").Select
Sheets("List").Range("$A$1:$C$5").AutoFilter Field:=1, Criteria1:="TEST"
Debug.Print ActiveCell.Address(external:=True) '確認用
End Sub
** 実際には機材画像のPropertyから読み込んだ文字列でフィルタリング。
** 今回はAutoFilterは無実でシート選択の不全実行が現象の概要とみています。 >>556
環境情報が抜けていました。
Win10 バージョン 1703 (OS ビルド 15063.786) >>556
(その4)
回避のためのリフレッシュ手順を忘れておりました。
[効果があるリフレッシュ操作]
' 以下、または手動によるシート切替(Screenupdating=False効かず、ちらつくが、、)
'--------------------------------
Application.SendKeys "^{PgDn}":Application.SendKeys "^{PgUp}"
' Popup表示前にSheet移動してしまう。(Cancel有無にかかわらず移動してしまうが、、)
'--------------------------------
Application.ScreenUpdating = False: Sheets("List").Select
.ShowPopup
[効果がないもの]
' Filtering直前のAutoFilter再設置
ActiveSheet.Range("$A$1:$C$5").AutoFilter
' 画面再描画処理
Application.ScreenUpdating = False: Application.ScreenUpdating = True
' その他、以下を試したがNG
Application.EnableEvents = True
Application.DisplayFullScreen = True: Application.DisplayFullScreen = False
Application.CalculateFull
Application.CalculateFullRebuild
AppActivate (Application.Caption)
Worksheets("List").Activate
Application.StatusBar = "aaaaaa": Application.StatusBar = False
MsgBox "OK" そういうときは、doeventsやwaitも試してみるべし
今パソコン無いから試す暇がない
>>561
そういえばDoEventsは試しました。
結果効果はなく、SendKeysを無効化して現象回避もできなくなるという逆効果も確認しました。
Waitはどこに入れると効果的ですかね。
間にStopを入れて一時停止したりはしてみましたけど、、、 >>561
今回のはあまり待ち要素はないと見ていますが、以下の3カ所に2秒ほど入れてみました。
・シート切替の前後、.ShowPopupの直前
再現してしまいました。 現在vbaをネットで勉強中ですが書籍も使って勉強しようと思っています
プログラミング初心者がvbaを学ぶのにお勧めの書籍を教えていただけませんか?
VBAで書籍は金の無駄だよ
最初はマクロの記録を見るのとネットでぐぐれば大抵のことはできるよ
データの入力規則にカンマ区切りの項数不定の1-9の数字のみを許容したいのですが、どうすればよいですか?
正規表現だと、こんな感じです。
/^([1-9]+,)*([1-9]+)$/
regexp使ってVBAでチェックする方法ならやり方が分かるのですが、セルのデータ入力規則で設定する方法が分かりません。
>>566
シートのChangeイベントあたりに
そのコードを仕込んでおくのはいかがでしょうか
ダメな場合はエラーメッセージ出して、セルの値を消しちゃえば
入力規則チックになるかと >>564
本格的にやりたいなら、VBAと関係ないように思えるけど
「スッキリわかるJava」シリーズをオススメしたい。
自分の場合、VBA本ではさっぱりだったけど、この本で目覚めた。
オブジェクト指向の解説は、VBAの理解にもかなり役立つ。
プログラミング言語は根幹は同じで、方言みたいなもんなので
他の言語にもすんなり入っていけるようになる。
やれることが多くなるよ。 オブジェクト指向をVBA始めて1週間だが理解してみた
まず
変数は何かの型に入れる
お前はこれしかできねえよ
っていう
そして
その型の中のさらに型の中の命令はなに?
と掘り下げて行く
これがオブジェクト指向
>>569
違うけど気にしないでいいよ
厳密なな定義ないから あと一歩というところだな、実にオシイと言っておこう
しかし始めて1週間でそこまでオブジェクト指向の真髄に迫るとは大したものだ
末恐ろしい奴が現れたもんだ、これは俺もうかうかして居られんな
Access だと、ずいぶん前から SendKeys は使うな ってのが喧しいが
Excel だと現役なんか? いいんか?
>>556
(その5)
画像リンクが外部ファイルにある場合はSendKeysも役にたたないようです。
なんかいい回避策ないですかね? たんにActiveCellのシートが思ってるものじゃないだけの気がするなぁ
そのコードどこに書いてるんだよ
>>576
どゆこと?
例えばですね、他Bookにある画像をクリックしてそこにPopupが表示され、フィルタ処理を選びます。
で、フォーカスは対象テーブルのあるブック・シートに遷移して、フィルタリングに成功します。
SDIなので画面上は呼出元ブックとテーブル用ブックが2つ並んでおります。
ここでScriptは完了するわけですが、追加の操作をするために、遷移先シートを明示的に選択。
明らかに自分はその目的のシートを選んでいます。
ここでImmediateから、ActiveCell.Address(external:=True)をたたくと明らかに今触っているセルの番地が、Book名、シート名、セル番地名のフルパスで戻ります。
ここでカレントセルのある範囲を選択反転してCopy操作を行うと、呼出元ブックの同じセル番地がコピーモードの破線矩形にかわるんです。
カーソルで下へスクロールすると、呼出元シートもリモコンで操作しているみたいに一緒にスクロールするんです。
削除操作も、、、、同一ファイルで操作している時は気づかなかったですが、別ファイルから行うと凄いびっくりなビジュアルが展開されます。
明らかに "ActiveCell" という状況が表と裏に分離されたような状態になるんです。
同じブックをWin7+Excel2010で操作した場合は起きません。
自ファイルだとSendKeysで逃げられるんですが、外部ファイルからシート切替しても呼出元が切り替わってしまって、、
テーブル側ブックがキー操作相当でシート切替されないとこの状態が解除されないみたいです。 >>578
とりあえずActiveSheetとかSelectionとか使わない方法で実装するのはダメなの?
あと同時に実行されるマクロは全て同じブックに入れておくべきだと思うよ。 >>579
(その6)
Debug用と問題回避のためにActiveCellを記述していますが、実際のコードでは使用していません。
>>558のSelectionはコードの中に記述しているわけではなく、検証用の画像ボタンを登録する手順としてImmediateから実行しているだけです。極力BackEndから操作する派です。
実際の運用Bookでは極力同一ファイルにMacroを集めています。
Macro自体は仕事を完全に全うするのですが、、、そのあとシートの状態がおかしくなるという現象です。
状態を解消するには、呼出先のBookでシート切替を行う方法のみ。
で、発想を変えて、「外部から制御できないか」と考えました。
VBE内にVBSScriptを記述し、「中の外」からシート選択してみようと。
結果NG、再現してしまいました。
じゃあ、本当に外から制御すればどうかな?と思い、上記のVBScriptを同一フォルダに置いて呼び出す作戦に。 >>579
(その7)
--------------------------------
[Popupから呼び出すProc]
Sub DoFilter()
Sheets("List").Select
Sheets("List").Range("$A$1:$C$5").AutoFilter Field:=1, Criteria1:="TEST"
Call = Shell("wscript " & ThisWorkbook.Path & "\SelectSheet.vbs", vbHide)
End Sub
--------------------------------
[SelectSheet.vbsの中身]
call SheetSelect_fromVBS
Sub SheetSelect_fromVBS()
Dim xlApp: Set xlApp = GetObject(, "Excel.Application")
With xlApp
.Workbooks("ListBook.xlsm").Activate
.Worksheets("List").Select
End With
Set xlApp = Nothing
End Sub
--------------------------------
なんとこれが功を奏し、ActiveSheetの幽体離脱状態から抜け出すことができました。
シート切替も不要に。これで一先ず凌げそうですが、MSには不具合対応してもらいたいです。
コメントいただいた方々、ありがとうございました。 >>581
あれ、一部書き間違えました。実際は、、
Call Shell("wscript " & ThisWorkbook.Path & "\SelectSheet.vbs", vbHide) つまりここでは
なんの型にはめるのか?
命令は?状態は?
だろ?
でもCellsってプロパティだろ?なんで一発で状態から入るんだ?
>>583
Cellsはオブジェクトだ
そしてWorksheetオブジェクトやCellsオブジェクトのプロパティでもある
あと、ようやく時間ができたからWorkbookオブジェクトをVariantに代入しようとしたら当然のごとく「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」になった。
一体何を試してパスが云々なんて話が出てきたんだろう。
Dim V As Variant
V = Workbooks(1)
→代入不可
Set V = Workbooks(1)
→VはVariant/Object/ThisWorkbook型
調べてみてもWorkbook型にデフォルトプロパティは設定してなさそう。 >>584
訂正
CellsはRangeオブジェクトだ
そしてWorksheetオブジェクトやRangeオブジェクトのCellsプロパティでもある >>585
cellsはrange?
意味わからない
プロパティでオブジェクトってなに?
もっとうまく説明してくんね? >>584
自分用語を使うどころかコードも正確にコピペできてないからそのまま実行しても無駄だぞ
エスパー力を全力で働かせて察してあげない限り回答しても罵倒が返ってくる >>583
メゾット君、プロパティだから状態というのは間違えやすい考え方だからこの際捨て去った方が良い
プロパティは呼び出し元プログラムに対してオブジェクトのクラス内部への変数へのアクセスを提供するもので、アクセス先の変数のデータ型はプリミティブな値であることもあれば、何らかのオブジェクトである場合もある
というか、オブジェクト式の途中で出てくるプロパティは全てオブジェクトへの参照を提供するプロパティだ
Cellsの場合はRange型のオブジェクトへのアクセスを提供するプロパティだが、Grobalのメンバプロパティだから上位オブジェクト式を省略して書けるわけ >>587
そうだよな・・
自分でクラス作ってみれば一発で理解できそうなものだが・・ >>590
あの質問者が自分でクラスを作れるようになるのって何年か先の話だろうな クラス?
オブジェクトに必要な要素を全部埋め込むやつだろ?
もうできるよ?
でもnewクラスの使い方が意味がわからない
同じクラスで(中身も同じ)なら作る意味ないんじゃねえの?
いま、クラスをみてみた
そしたらworkbookの中にworksheetsがプロパティとしていた
どういうことだ?
俺はVBAの盲点をついたか?
dim i as long
For i = 2 To i.Cells(.Rows.Count, 1).End(xlUp).Row
このi.cellsの意味がわからない
教えてくれ
プロパティは内部変数へのアクセスに限らずいろんなこと出来るし、最初さっぱり理解できなかった。
まさかただのシンタックスシュガーだなんて想像してなかったからな。
>>596
このコードは絶対にコンパイル通らないぞ
For i = 2 To i.Cells(.Rows.Count, 1).End(xlUp).Rowの意味なんてこっちが知りたいくらいだ >>594
Worksheetオブジェクトのメンバの、Worksheetsコレクションにアクセスするプロパティじゃん
何が不思議なの? New出来てないの笑える
クラスモジュールを挿入できただけでクラス使えるようになってねぇじゃん
おそらく本職プログラマじゃなく事務の効率化でVBAに手出したんでしょ?
どうせ片手間ならプログラミング適性無さそうだからおとなしくコピペで済ますのが無難だと思う
たぶん永久に理解出来ないよ
>>602
自分で考えろよ、クラス作れるんだろ?w 最近オブジェクト指向の本読んでみたんだけど
これまで作ってきた稚拙なスパゲティコードをこの際書き直してみたくなった
>>601
この人謙虚じゃないし、まぁ無理だろうな
素直に他人の文章やコードが読めず、自分の言語感覚だけで無理矢理白黒つけようとするだけの奴はそもそもプログラミングに向いてない >>604
今書き直しても、しばらくするとまた見識が増えて書き直したくなるだけやで >>604
やめとき、もう一つ稚拙なスパゲティコードを作るだけやでw
魔道に堕ちた亡者どもはそれをリファクタリングと呼んでるらしいがなw >>605
メゾット君は>>571の自演の通り、「○○が出来るなんて凄いヤツだ」って反応が欲しいだけでしょ。
その反応が欲しいだけだから本腰入れて勉強するつもりもないんだろうし、
彼の想像の中では、自分は「凄いヤツ」であり、それに反応する周囲は「凄くないヤツ」なので見下している。
見下している奴らと自分の意見がぶつかったら自分の方が凄いので自分が正しい。だから自分の考えに固執する。
要するにヒカルの碁とかハイキューとかボールルームとかの主人公みたいな展開を妄想してんだろ。
どんな反応をしても彼の妄想に付き合わされるだけだし、妄想が維持できなくなると死ね死ね言うだけになるから構うだけ無駄。 >>605
プログラミングだけじゃなくありとあらゆることに向いてないだろうな
わからんのは仕方ないけど、最低限の態度がなってない
ネットだからなにやってもいい、って考えのやつはいずれリアルでもぼろが出るわ プロシージャにconstでいくつか定義してあってこれまで何も問題なく動いてきた
さっきその定数の一つを=22から=23に変更したら
定数式が必要です、のエラーが出る
どうみても何も問題ないようにみえて分からない
まさかと思いつつ
'Const sht_right As Integer = 23
Const sht_right As Integer = 23
このように問題の起きた行をコメント行として
すぐ下に書き直したらエラーがでなくなった
こういうのってあるもん?
>>610
上の奴、本来のコードだと全角スペース入ってなくね >>602
i.cells じゃなくて ws.cells
さらに、with ws が有るので ws が省略できるから
.cells で良い >>610
99%は単なるタイプミス
等幅フォントでスペースが明示できるテキストエディタにコピペしてみる どこかから、コピペした文字列に、見えない制御文字が入っているとか?
>>610
その事例は見たことないけど、納得のいかないエラーが出たときは、とりあえずエクセル再起動 >>611
>>613
>>614
と俺も思った
んで何度も打ち直してみた
ちなみに上に貼ったのはそのままコピペしたもの
2を3にしただけなんでね、よくわからん
>>615
再起動しなかったかもしれないんでまた起きたらやってみるわ
コメント行にしたもともとの行は削除しちゃったんで実験できなくてすまん Constでエラー出した事あったけど、Endを実行してからやったら治ったことあるな。
値が記録されたままだったとかじゃね。
>>610
なんか、Enumでもそんなことがたまに起こるよ
VBEのバグらしいけど VBAってどうやったら上達しますか?
エクセル関数は達人級です
エクセル関数みたいに慣れだけじゃ無理ですかね
>>619
Javaを勉強したらvbaも上達するよ Java推しはともかく他の言語を学ぶのはVBAの上達にも実際かなり役立つ
>>621
ジャワティーの話しはしてないんだ、ごめんな VBAだけやればいい
javaは環境が大変だ
したいこともないし
プログラムの上達に早道はないんだよなあ
というか、遠回りに思えることが早道だったりする
と、自戒の意を込めて
どうしてもエクセルと絡めたいならC♯でもいいけどな
ぱいそんってアメリカではもっともメジャーなスクリプト言語なんだっけ
何故にPythonかと思ったらエクセルにPython組み込むって話が出てるんだな。勉強するか‥
>>626
自己評価だとそう感じるのかもしれないけど
できる奴は最初からできるし、できない奴はいつまでたってもできない
プログラムってそういうもん >>630
そりゃあ人によっちゃ違うが、それは才能があるからで近道しようとしてそうなってる訳じゃないだろ
わかんないことがあったら別の切り口から攻めると言うのもありじゃないの VBAerさんついに終わるのか
Pythonに駆逐されちゃうね
>>631
ないとは言ってないよ
俺が言いたいのは、別の切り口から攻めようが近道しようが
既知の問題の解決策は知識として身につくが
未知の問題に対する解決能力は上げることができないって事
つまり上達とか意識しないで楽なやり方ばかり選ぶ奴がいつだって一番賢い >>633
天才の人は苦にしないだけでちゃんと道は通ってるよ >>634
何を言いたいのかよくわからんがそもそも俺が言ってるのは天才のことじゃない
単にプログラムができる奴とできない奴の話なんだが >>635
iqないとダメなのはプログラムに限らんし
まあスレチだから退散するわ >>636
いやだからIQとかの話じゃないってば
目の前の問題をありのままに受け入れる事ができる奴と
既に自分の中に構築された知識に当てはめないと解釈できない奴の違いだって >>632
仮に採用されて皆がPython触るようになったら、今度はPython(笑)って扱いされる未来が見えるわ。
格好つけだけでやってる奴らが抜けて、AIとか作ってる真っ当なのが風評被害を受けそう。
言語は統一するよりも、それを扱うユーザー層毎に分けた方がいい。 >>616
俺も似たようなの見たことがある。
でも引きずるような問題じゃ無かったと思う。
Excel再起動かPC再起動で直るんじゃね? >>633
逆だと思うが。
未知の問題に対しての解決能力は上げることができる。
楽なやり方を選ぶ奴は上げられないだけ。
厳密には未知な問題といっても既知の問題と全く違うわけじゃない。 ここのやつらがあんまジャバジャバいうから引っ張り出して着たわ
とりあえずコードは実行せずにパラ読みしようと思う
>>641
「わー、ロレックス持ってるなんてすごーい!」
「え?こんなの普通だよ。持ってないとかwww」
みたいな展開になる事を期待してるんだろうけど腕時計の入れ方が無理やり過ぎて笑いしか出てこないw
本は中古屋で買ったみたいだし、あまりにもちぐはぐ過ぎてむしろ格を下げてるようにしか見えないんだが。 >>640
うんだから最初に言ったんだけど自己評価だとそう感じるんだってば JAVAの本でわかったこと
変数の宣言と同時に値を入れることを初期化という
変数の値が変わらないことを定数という
いま10ページ目だけどこんくらいだわ
>>644
>変数の値が変わらないことを定数という
これはちょっと違うのでは? >>643
お前の自己評価がそう感じてるだけだろw
何か自分はプログラム書ける気になってるようだけどw あ、でも彼はジャワティーの話をしてるのか
ならわからんでもない
javaのパスが通らなくて実行できない
助けてくれ
Java は環境構築が難しいから、初心者には無理
paiza.IO, codepad などのサイトで、ブラウザから実行しろ
別にJavaが難しいと感じたことはないな。
すっげえ昔にかじっただけだから今となっては初心者以下だけど。
いや、当時も初心者だったけど。
コンパイラもJavaで出来てるからJava実行環境でコンパイラ動かして、そのコンパイラへの引数にエディタで編集中のテキストを一時ファイルにしたものを渡してたな。
そのエディタもJavaで誰かが作ったものを機能拡張したやつだったな。
コマンドラインが敷居高いならeclipseでやれ
敷居高いつっても環境変数設定してそこにパス通すだけだがな
javaって効率悪すぎだろ
テキストエディタで編集
↓
名前つけて保存
↓
コマンドプロンプトでコード入力
↓
実行
どんだけ時間かかるんだよ
eclipseも知らないで手動でコンパイルしながらブチキレてるの想像してワロタ
道は遠いね
お前ら良かったな
EXCELでPythonが使えるようになるかも知れないんだって?
あれはObject指向の流れを組む関数型を目指しているところの言語っていうからやりがいはあるよね
俺もVB.NetやC#はやったけど
EXCELに載ることが確定したらこれからPython覚えるわ
まぁ構造化言語からObject指向型言語に移行したとき
めちゃくちゃ苦労したけど
今回も苦労するんだろうなぁ
Pythonはさらっと概要見たぐらいだけど面白そうだね
まあexcelにのらなくても勉強して損にはならんだろうな
必要ないもん勉強したって時間のムダだっつーの
真のエクセルマクラーだったらマクロ書くのにパイソンしか使えなくなった時に必死でググれ
Pythonはオブジェクト指向も関数型も全部後付けって感じでイケてねえ
F#にしとけって
でもこんなのはプログラマ以外が触るものだからしょうがないのかもな
100列ぐらい続く計算エクセルがある
足したり引いたりするだけのエクセル。
酷くね?VBAにできないものか
>>667
計算エクセルっていう表現が意味不明だが要は計算用のワークシートのことか?
大抵の場合、ワークシート関数とテーブル機能を組み合わせて何とかする方がVBA使うより楽だぞ
車輪の再発明をしてもしょうがないからな 質問です。
Excel側からVBE上の指定のプロシージャ記述欄にジャンプする動作をVBAで記述できる
でしょうか?
やり方がわからずとりあえずSendKeysを組み合わせて動作するようになったのですが
不慮の事故が起きそうで怖いです。
VBEのオブジェクトモデルに沿ったアクセス方法があれば教えていただけないでしょうか。
>>669
VBE上でカーソルの位置をコントロールするってこと? >>670
メンテのためにActiveBookから全Procのリストを新規Sheetに出力する
Procedureを用意したのですが、Proc名からVBE上の該当Procにジャンプ
したく、右ClickEventにジャンプ機能を割り当てました。
正しいアクセス方法がわからないので、ほぼSendKesyのみで記述している
のですが、状況により意図しない挙動をします。
VBEを開く動作は "^{F11}"の代わりに
Application.CommandBars.FindControl(ID:=1695).Execute
が使えそうなことはわかったのですが、、、
VBE上で1つもModuleが開かれていなかったり、開かれているModuleと、ツリー
側の選択されているModuleが異なったりすると、"^F"が効かないようです。
FrontEndからではなく、ObjectModelに沿ったBackEndからの操作が
知りたいのですが、うまく情報を見つけられないところです。 >>669
自己解決しました。
キーワードを英語に切り替えてGGったら、StackOverFlowですぐ見つかりました。
.CodePane.GetSelection
.CodePane.SetSelection
あたりでなんとかなりそうです。お騒がせしました。 VBAやりはじめて三年ぐらいだけど、For Eachで普通の配列もループできるの今日知ったわ
コレクションだけだと思ってた
>>674
クラスの扱いが大分変わるのよ
わざわざイテレータ自作してたわ >>672
できるんだけどセキュリティ的に問題だからお勧めしない。
.netで書いた方が良いぞ。
でもVBEを操作するコードが書ければ、.net上でも殆ど同じコードでいけるから勉強しとくと良いかな。 sheet1に置いたボタンを押してからsheet1内のセルをクリックすると、クリックしたセルに「ここ」
とはいるようにしたいです。実際作りたいものはもっと複雑ですが、とりあえず。
そこで、sheet1のシートモジュールに以下の記述をしました
しかし、どうやら前回クリックしていた場所を覚えていて、その場所に「ここ」と入ってしまいます
解決法はありますか?
Private Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
Private Sub CommandButton1_Click()
Do
If GetAsyncKeyState(VK_LBUTTON) Then
ActiveCell.Value = "ここ"
Exit Do
End If
Loop
End Sub
>>677で書き忘れ
標準モジュールの宣言部に
Public Const VK_LBUTTON = &H1
の記述もしてあります。 >>677
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count = 1 Then Target.Value = "ここ"
End Sub
クリックした場所に入れるだけならSheet1モジュールにこれで済むけど、コルーチン処理が必要というなら分からん。
いずれにしてもActiveCellとかActiveSheetとかは避けて設計すべき。 >>679
自分もググってたどりついた先がそれだったんですよね
でも常に発動してる状態だとやっぱり困るんですよ
一応application.enableevent を使って停止しておくこともできるようなので、
通常は停止しておくことも考えてはいます
設置したボタンを押したときだけ機能するようにしておけばいいのかな、と。
Worksheet_SelectionChange使う以外方法がなければそうするしかないですが
無効にしてる間はイベントが一切反応しなくなるという事なので、
イベント付きの他のブックを併用するようなケース等で問題が起きそうで迷ってます >>680
なら
If ToggleButton1.Value Then
とか加えておけばいいだけでは? >>681
お・・これはいけそうです
こういう使い方があるんですね・・・
作業を先に進められそうです
ありがとうございました フォームコントロールボタンの文字の色を変えたいんだけど
セレクトしない方法はないのですか?
Sub test01()
n = Worksheets("Sheet1").Shapes("Button 1").Name
Worksheets("Sheet1").Shapes(n).Select
Selection.Font.ColorIndex = 3
End Sub
フォームコントロールボタンの文字の色を変えたいんだけど
セレクトしない方法はないのですか?
Set n = Worksheets("Sheet1").Shapes("Button 1")
n.Font.ColorIndex = 3
みたいな?
シート上のボタンならtoggleにしなくてもモジュールレベルのクリックフラグ変数で管理できねーか?
>>685
出来合いのものを、わざわざ回避する利点は? >>686
いや、最初コマンドボタンだったからコマンドの方がいいのかなって思っただけ
別に必要無いなら必要無いでいいし >>684
逆に何でセレクトしなきゃならんのかが分からん。
普通セレクトなんてしないだろ。 >>683
Worksheets("Sheet1").Shapes("Button 1").TextFrame.Characters.Font.Color = vbRed
または
Worksheets("Sheet1").Buttons("Button 1").Font.Color = vbRed
SelectするとButtons("Button 1")をオブジェクトとしてSelectionに持つので
Selection.Font.Color = vbRed でいける
一方、ShapesはFontオブジェクトをもっていないので
Fontオブジェクトを持っているヤツまで掘り下げてかなければダメ
ということだと思う。 >>690
直感的な説明だが、オブジェクトがオブジェクトを持つという表現は間違い
オブジェクトが持つのはあくまでメソッドとプロパティからなるメンバで、いわゆる下位オブジェクトにはメンバを介してアクセスしてるだけだからな >>690
マクロの記録でやってたので。1行で可能なのですね。
TextFrame.Characters.Font.Colorでググったら出てきました。
ありがとうございました。 ちなみにButtonsとかCheckBoxesとかは隠しプロパティ
ヘルプにもでてこないからな
なんで隠してあるのかねぇ
>>692
分かるよ。
そういう人がとても多いから。
でも、殆どの処理はセレクト無しで書ける。
個人的にはセレクト無しで書けない場合でも何とかセレクトせずに書けないかを考える。 まあ、大多数の用途では得られるメリットが少なすぎてSelectを消す意味は薄いけどな
オブジェクトのプロパティにアクセスする処理でSelectメソッドはなるべく使わない
コードの実行中にデバッグ作業を行ったときなどに予期しないオブジェクトが選択されて、アクセスしたいプロパティにアクセス出来ずエラーになることがよくあるからね
Rangeオブジェクトを指定していたはずがShapeオブジェクトやOLEObjectオブジェクトを選んでいたりとか
Selectは必ず代替手段があるから、範囲選択してユーザーに注意を促すとかでなけりゃSelect使う事に疑問を持った方がいい。
起動中のIEからさらに別窓で開かれるフォーム入力用窓のIEオブジェクトを取得して操作したいと考えているのですが、
Function hoge() As WebBrowser
Dim tmp As Variant
For Each tmp In CreateObject("Shell.Application").Windows
If TypeName(tmp.document) = "HTMLDocument" Then
Set hoge = tmp
Exit Function
End If
Next tmp
End Function
のようにShellを使ってもIEオブジェクトを取得できなくて困っています
Set objIE = MAGIC(hWnd)
のような形で、ハンドルからIEオブジェクトを取得する方法は無いでしょうか
他に方法があれば、ハンドルから取得する方法にこだわりません
ただし、諸事情により外部からライブラリをダウンロードしてきて使用する、といったことはできないです
>>698
別窓かどうかの判定が抜けてる
LocationNameとかLocationURLあたりを調べないと IEが複数あるかもしれないのに見つかったら抜けちゃうコードで何かおかしいと感じないの?
Dim u As Long
Range("A1", "I5").Value = u
u = Round(u, 4)
四捨五入したいのに全部ゼロになる!
>>702
A1からI5のセルを桁指定したいんだ。
どうすればいいか教えてくれ >>705
A1からI5の範囲に初期化したばかりのu(=0)を入れてる。
入れるのは逆で、入れた後で桁変更して戻す必要もある。
最初からuを使わずに自分自身に桁変更した自分を入れる方が普通かな。
そもそも見た目だけ桁指定する方が一般的だと思うが。 桁指定したいならexcel vba 書式設定
でググりなさい
というか、値が複数(配列)だから一発でいけないだろ。
それぞれの行のB列からC列を引きたいのですが、下のコードだと
すべてB2-C2となってしまいます。
どうすればよろしいかご教示ください。
Dim i As Long
Dim Lrow As Long
Lrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To Lrow
Cells(i, "D").Formula = "=B2-C2"
Next
>>709
数式書き込んでるループ内の処理の右辺を
"=$B" & i & "-" & "$C" & i
にするだけ
折角行インデックスをiで指定してループ回してるんだから使わないと
この程度のことだったらVBA使わなくても組み込みのテーブル機能で実現できるけどね >>709
Sub foo()
Cells(2, 4).Formula = "= B2 - C2"
Cells(2, 4).Copy
Lrow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 4), Cells(Lrow, 4)).PasteSpecial
End Sub >>699-700
コードはあくまでも例で、実際はURLや文書内の文字列から判定しています
今回問題なのは、CreateObject("Shell.Application").WindowsをFor Eachで全要素を調べても、要素にそもそも含まれていない点です
IEの子窓として存在しており、タスクマネージャーで調べるとプロセスも存在するのに、IEオブジェクトを取得できません
しかし、WindowsAPIのFindWindowを用いるとハンドルの取得は可能だったので、
Set objIE = MAGIC(hWnd)のような形でハンドルからIEオブジェクトを取得する関数を作れないか質問させていただきました Excel2010です
以下のコードを実行すると、"$A$2"が表示されます。
セル範囲に添字0を付けた場合、セル範囲の先頭セルが参照される
(この場合B2)と思い込んでいたのですが、私の誤りでしょうか?
MsgBox(worksheets(1).range("B2:C3")(0).address)
>>715
ありがとうございます
OffSet()だと原点がゼロなので
そういうのと混同していたかも知れません Dim FSO As Object
Set FSO = CreateObject("scripting.filesystemobject")
Dim folder As Object
Set folder = FSO.getfolder(ファイルパス)
Dim f As Object
For Each f In folder.Files
If f.Name Like "*" & Month(Date) & "*" Then
’ここでファイル名を翌月に変えてコピーを作成したい
End If
Next
ファイル名は「AAA〇〇月BBB」で統一(ABは文字列で〇〇は月を二桁表示)
抽出できた今月ファイルをコピーして名前の〇〇を翌月に変更したもの(翌月ファイル)を同フォルダ内に作成したいです
コピー元ファイル名を継承して一部だけ変更する良い方法が見つからなかったので教えてください
>>712
そのセル全部のRangeに対して"=B2-C2"でいける。 >>717
Sub foo(FolderPath As String)
Dim FSO As New FileSystemObject
Dim c As New Collection
Dim Folder As Folder
Dim File As File
FindWord = "*" & Month(Date) & "*"
Set Folder = FSO.GetFolder(FolderPath)
For Each File In Folder.Files
If File.Name Like FindWord Then Exit For
Next
If File Is Nothing Then Exit Sub
s = Split(File.Path, "\")
For i = LBound(s) To UBound(s)
If s(i) Like FindWord Then
e = Split(s(i), ".")
s(i) = Month(DateAdd("m", 1, Date)) & s(1)
End If
FilePath = FilePath & s(i)
If i < UBound(s) Then FilePath = FilePath & "\"
Next
FSO.CopyFile File.Path, FilePath
End Sub
試してないけどこんな感じかなぁ。 >>717
fileName = Replace(fileName,○○,××) ああ、AAAとBBBに数字がない前提じゃないとダメだな
>>719>>720回答ありがとうございます
まだ試せていませんが
AAA○○月BBBじゃなくて
AAABBB○○月にした場合もう少し簡単に記述出来ますかね?
ちなみにABに数字は含まれてないです んんんんあああああああああああああああああああああああああああああああああ
コピーしてファイル名置換するだけでしょ?
フォルダもすでに取得してるなら
fso.copyfile file.Path,folder.Path & "\" & Replace(file.Name,"○○","××")
だけで行けるんじゃね
UserFormに「次へ」のボタンをつくり複数のUserFormを次々と経由することで対話式に値を取得していきたいと思っています
誤った選択をしてしまった場合に備え、戻るボタンも作るとします
○UserForm1の「次へ」ボタンのクリックイベントに以下のように記述しました
Me.Hide
UserForm2.Show
○そしてUserForm2の「戻る」ボタンのクリックイベントには以下のように
Me.Hide
UserForm1.Show
うまくいったと思いきや、一度1に戻ってからもう一度UserForm2を再表示させると
UserForm2のinitializeに書いた処理が実行されません。
仕方が無いので1の次へに
UserForm2.Show
Unload Me
と書いてみると、今度は2から戻る時に、「フォームは既に表示されています。モーダルに表示できません」と出ます
2の「戻る」には上に書いたようにMe.Hideがあるにも関わらずこのエラー表示
解決法はありますか?
>>725
ユーザーフォームの行き来はめんどくさいしスパゲティになりがちだからやめた方がいいと思う
というのはさておき、initializeじゃなくてactivateイベントにしてみたらどうかね いやいや何か間違えてる
修正
仕方が無いので2の「戻る」に
UserForm1.Show
Unload Me
と書いてみると、今度は1から2にもう一度行こうとすると、「フォームは既に表示されています。モーダルに表示できません」と出ます
ついでにとにかくhideは避けてすべてunloadにしてもやはり2→1の段階で同じアラート
解決法はありますか?
>>726
ありがとうございます
調べてみます
分からなかったらまた書きますのでお願いします・・・ >>726
うまくいったようです
3時間ほど解決法が見つからず頭抱えてました
感謝です sub test()
'マクロ起動用エクセルがあるフォルダ内のフォルダ名の取得
Dim strPattern As String
Dim strFolder As String
strPattern = "C:\xxxxx"
strFolder = Dir(strPattern, vbDirectory)
Do While Len(strFolder) > 0
If GetAttr(strPattern & strFolder) And vbDirectory Then
If strFolder <> "." And strFolder <> ".." Then 'if文始まり
'各フォルダ内にあるエクセルファイル名の取得
Dim FSO As Object
Set FSO = CreateObject("scripting.filesystemobject")
Dim folder As Object
Set folder = FSO.getfolder(strPattern & strFolder)
Dim f As Object
For Each f In folder.Files
If f.Name Like "*" & Month(Date) & "*" Then 'ファイルパスに今月が含まれている場合
FSO.copyfile f.Path, folder.Path & "\" & Replace(f.Name, Month(Date), Month(DateAdd("m", 1, Date)))
Debug.Print f.Name
End If
Next
End If 'if文終わり
End If
strFolder = Dir()
Loop
End Sub
717ですが上の記述で一応期待通りの動作をしてくれました
皆さんありがとうございました
ただこれだとファイル名に1〜12の数字を使えなかったりエクセル以外も取得できるのでまだ改良が必要そうです
>>730
ファイルの種類に関しては、ループ処理の冒頭でFSO.GetExtensionName(f.Path)の戻り値を調べて処理を分岐させるようにすれば、狙った種類のファイルだけを処理できるようになると思うよ ググったのですがどうしてもわからないので教えてください
【環境】Windows10、Excel2010
【不具合症状】新規コードの作成ができない
新規bookを作成し、VBEを起動した際、通常はプロジェクトウィンドウに
「Sheet1-3」が表示されるかと思いますが、真っ白なまま何も表示されない状態です。
メニューの「挿入」をクリックしても、標準モジュールがグレイアウトになってしまい、
新規コードの作成が行えない状態です。
ITに相談しても初めての事例とのことでわかりませんでした。
コンパネからのofficeの修復も行いましたが改善されません。
マクロのセキュリティは「全て有効」で設定されています。
xlsm形式で保存もしてみましたがダメでした。
PC再起動も試してみました。
同一PCで、既存作成マクロの実行は行えます。
既存マクロのVBEを起動した際、プロジェクトウィンドウやコードウィンドウは
普通に見えますが、コードウィンドウで1文字でも編集すると、F5実行時に
「ファイルが見つかりません」とのエラーが出ます。ステップ実行でも同じです。
編集は例えコメント行でも同じエラーが出ます。
新規作成は全てにおいて不可です。
自動記録をしようとすると「マクロが記録できませんでした」とエラーが出ます。
マクロの作成ボタンは押せますが、押してもコードウィンドウが起動しません。
新規作成と編集が制限されているようなのですが、どこから変更するのかが
どうしてもわかりませんでした。もしわかる方いらしたら教えていただけないでしょうか?
スレチであれば、該当スレッドに誘導していただけると助かります。
よろしくお願いします。
>>732
エクセルのレジストリ削除してみてもダメ? >>732
そのマシンに新規ユーザーつくって現象が発生する?
テンポラリやら消したら直るかもしれん
あとセキュリティ対策ソフト切って試すとか >>717
「01月」というファイル名のコピーが、「02月」として、同じフォルダに入れるのか
フォルダ内に、「01月」「02月」があるとして、
この状態で、もう一度、同じ事をするなよ!w
設計として、同じフォルダに入れるのはおかしい。
異なるフォルダに入れるべき
わかりやすいように投稿する時は、名前欄に、717 と入れてくれ >>733
>>734
732です、レスありがとうございます。
最悪、officeの再インストールも覚悟しています。
レジストリかも?とはITには言われましたが・・・・
新規ユーザーはまだ試していません。
セキュリティ対策ソフトはITの管轄なので、切れるかどうか不明ですが
聞いてみます。
こちらの書き込みは自宅からなので、次のレスが遅くなるかもしれません。
よろしくお願いします。 >>735
運用の話までは管轄外じゃね
あとは自分で考えりゃいいよ >>719とか>>730とかのコードで意味わかんないところがいくつかある
(コードが間違ってるって意味じゃなくて、こっちの知識が足りなくて理解が追い付かないって意味です)
まず>>719は
なんでコレクションを宣言してるのか?
しかもなぜ宣言したのに使わないのか?
変数eは何のために使ってるのか?
ファイルのパスをsplitで分割してるけど、
ファイル名だったらinstrrevで\を探したほうが話が早いんじゃないか?
等々
>>730は
ループの中でdim使うのは大丈夫なの?
複数回宣言したらエラーになりそう
後、一番知りたいのが
If strFolder <> "." And strFolder <> ".." Then
これ、どういう意味なのか解説をお願いしたい
(書いてる人たちにケチつけてるんじゃなくて、本当に分らない事を教えて欲しいだけです)
どなたか教えてください、よろしくお願いします >>738
コマンドプロンプトで cd .. って打ってみたら判る
c:>test>test1> cd ..
親ディレクトリに移動する。つまり親フォルダの事
「.」 は「.」 カレントフォルダの事 寝ぼけて書いてたからめちゃくちゃだな^^;
c:\test\test1> というフォルダがあったとしてそこで
c:\test\test1>cd .. と打てば
c:\test> と親ディレクトリ(フォルダ)に移動する
>>738
ループ内でDimしてもエラーにはならないよ
その都度メモリが割り当てられるだけじゃないかな
フォルダ名の"."と".."は相対パスじゃなかったかな
一個上と二個上の親フォルダだったと思う
間違ってるかもしれないから調べてね あ、間違ってたw
.がカレントフォルダで..がひとつ上の親フォルダね
すんませんな
あとsplitの問題に関しては読みやすさとか書きやすさじゃね
俺もよくやる
楽だからね
beforeStr = "あ12月い"
afterStr = beforeStr.sub(/\d\d月/) do |matched|
month = matched.to_i + 1
month = 1 if month == 13
sprintf("%02d", month)
end
puts afterStr
#=> あ01い
Ruby で、文字列を置換した。
こういう処理は、Ruby が良い。
PowerShell でも作ってみたが、簡単な置換方法がなかった。
置換時に、コールバック関数を取れる、sub のような関数が無かった
わかりやすいように質問者が投稿する時は、名前欄に、717 と入れてくれ
間違っていたので、修正した
beforeStr = "あ12月い"
afterStr = beforeStr.sub(/(\d\d)月/) do |matched|
month = $1.to_i + 1
month = 1 if month == 13
sprintf("%02d", month) + '月'
end
puts afterStr #=> あ01月い
VBA勉強し始めて間もない時に組んだマクロに
replaceという名前のプロシージャを作りました
そのことはすっかり忘れてたのですが、最近になってそのマクロを手直しする必要があって
その中でReplace関数を使おうとしたらエラーが出る
おかしいなと思い調べてみたらSub replace() を発見
プロシージャの名前を変えたら大丈夫かと思いきやなぜかどこかに何かが残っているようでエラーがでる
一旦そのモジュールを解放したらReplace関数は使えるようにはなりました
しかし、なぜかReplaceと打ってもreplaceとなる
replaceと打ってもそのままreplace
replaceをReplace関数と認識してくれてはいるものの、どこかに何かが残っている
他のブックでは起きないのでまぁそれほど支障はないものの、もし分かる方いらっしゃったら
どうすればいいか教えてください
>>746
大文字小文字は、現在開いてるコード全体で統一されてしまうからな。
変数でもプロシャージャでもいいから、定義し直すと内部で覚えてる大文字小文字が上書きされるぽ
この仕様のせいで、他人の書いたブック開いたまま修正保存するといつのまにか変わってたりする。
するとWinMergeとかでDIFFしたときにイラッ
独り言でした プロシージャ外に書いたオブジェクトの寿命はいつまでなのでしょうか?
グローバル変数にオブジェクトを保存してそれをfunctionで返すシングルトンオブジェクトを作ったのですが、
プログラムが一度終了して再度起動した際もオブジェクトが残っており、ゴミデータでエラーが起きています。
一度ファイルを全て閉じるまでは残るものなのでしょうか?
>>749
グローバル変数ならエラーで止まるかブックが生きてる限りは生きてるんじゃね >>751
End なあ、せめて Class_Terminate()して欲しかった >>732 です。
officeの再インストール試してみましたが
不具合解消せずでした・・・・無念
幸い既存マクロは動くので、新規作成と実行は
他のPCでやることにしました。
不具合はExcelだけで、Accessでは特に問題ありませんでした。
一応ご報告まで。 >>752
てか、マクロ終わったら初期化すりゃよくね?
できない仕様なの? >>753
マクロの記録から操作を記録すると
標準モジュール作成される? >>757
Globalで保持していると想定していた変数がいつのまにかクリアされていて想定外の動作をおこし痛い目にあったことがあります。
調べてみたら、エラー発生時またはEnd通過時にGlobal変数の寿命が尽きるようで、、
それ以来、Global変数もEnd Statementも避けています。
記憶が必要な場合は、Cell値やValidation値またはDocumentProperty等を使うようになりました。 VBA初心者です
2つのセルがイコールになるように別のセルの値を変化させるというVBAソルバを作成したいのですが、エラーばかりで全く進みません・・・
現在は7行目から10行目まで構文エラーが出ています。
どなたかご教授願います・・・
Sub Solver()
i = 1
Do Until i = 313
'-------------------------------------------
Application.DisplayAlerts = False
SolverOk SetCell:="K" & i, ByChange:="J" & i
SolverAdd cellRef:=Range("K1:K313"), _
Relation:=2, _
FormulaText:=Range("L1:L313"), _
Application.DisplayAlerts = True
'---------------------------------------------
SolverSolve
i = i + 1
Loop
End Sub
>>755
マクロ終わったらオブジェクト破棄するんじゃダメなのかと言うことだが
まあダメな使用なんだろうけど イミディエイトウィンドウにあるオブジェクトのことだよね
>>749,758
そもそもプログラムが終了ってどういう事をさしてる?
ホントにプログラムが終了すれば、すべての変数の内容は失われるよ
たんに実行するコードが無くなっただけではプログラムは終了していない
Endはプログラムを終了させるけど、エラー出ただけでは終了するとは限らない
デバッグで再実行や変数見たりできるのはプログラムは中断したけど終了してないから >>756
753です。
マクロの記録そのものができないのです。
記録しようとすると「マクロの記録ができませんでした」と
エラーが出てしまいます。
新規作成と編集が全て制限されているようです。
セキュリティは「すべて有効」で設定しており、
そこでの問題は無いと思うのですが・・・・ >>759
"_" は次の行をつなげるためにつけたのだろうけど
Application.DisplayAlearts = True の前の行にも "_" が付いているから
何か貼り付け忘れか、間違って削除してしまったものがあるのでは >>732
あー、昔そんな事象に当たったことあるよ
原因は同じかどうかは分からんけど
俺の場合とんでもなく深い階層のフォルダに置いてたら
VBEのシートモジュールが青く表示されてコードが作成できなくなった
そのファイル、とりあえず浅い階層のフォルダや
どこかのサーバに置いているなら
クライアント側にコピーして内容確認出来る? 732、753です
皆様レスありがとうございます。
作成の不具合は、全くの新規Bookでも起こります。
既存マクロの場合は、コードの表示と実行は行えますが
編集が制限されています。
問題が発生してから、他のPCで新規作成したマクロを
該当PCで実行しようとしましたが、それはコードの表示すら
できませんでした。ファイルサーバー経由とかではなく
デスクトップ上に置いて実行しても同じです。
Accessでは特に問題ないので、VBAそのものではなく、
Excel単体の何かだとは思うのですが、皆目見当がつきませぬ。
>>765
>>759です
一部コピペして使ったので何か消してしまったのかもしれません・・・
確認してみます、ありがとうございます。 CreateObject("System.Collections.ArrayList")ってやったら
.NETのArrayListがVBAで使えてしまったんですが
これ隠し機能とかじゃなくて正式に使っていいんですよね?
前にも話題に上がったけど
.NETのほんの一部はVBAからも使える
リファレンスにも書いてあったような気がする
他で代替できるのでArrayListをわざわざ使うメリットはないということで
そのときは終わったと思う
>>770
.Net Frameworkの機能でコンストラクタに引数を渡す必要のないものは使えるらしい
>>771
ArrayListは各種メソッドが揃ってるからコレクションより使いやすいんじゃね?キーを使わないなら
ただ遅いのがたまに傷 >>772
Windows APIだって使えるんだぞ? VBAの保存方法について
バックアップどうしてますか?
VBAのマクロだと戻る釦聞かないし、バグって復旧するとマクロの個所全部消えちゃうので2つくらいのバックアップを別ファイルでとってあるんですけど皆さんはどうしてますか?
まだ素人なので思ったのと違う処理になって戻せなくなることがしょっちゅうあるので
バックアップは大事
>>775
バージョン管理システム入れてないなら同じになるでしょ。
俺も同じくでファイル名_Ver nnn.xlsmと言うかたちで3世代別フォルダに保存してるけど
(時たま忘れたりする^^; マクロ有りエクセルファイル自体にデータを入れて運用するのと、
データは別エクセルファイルにしてマクロ有りエクセルファイルでデータ入りエクセルファイルを操作するのと、
どっちがメンテナンスしやすい作り方だろうか?
いつも悩んでしまう
マクロのバージョン管理ってどうやってます?
インポートファイルを分けすぎると不便なのでshareFanction見たいなインポートファイルに使いそうな関数全部入れてますが、初心者なもので開発中に関数の引数や戻り値を変えたくなるような場面が多々あり
今までのshareFanctionと互換性が保てなくなりますが、引数と戻り値を修正した関数以外でバグを潰したような関数は最新を使用したいです。
今はコピペで対応してますが
個人なのか仕事なのか書かないと有効なレスがつかないのではないかな
>>782
ならGithubとSourceTreeで快適にできるんじゃないの?
俺も全然高度な使いこなしできてないけど楽ちんだ >>783
ありがとうございます
ざっとみた感じソースファイルのバージョン管理はできそうですが、
例えばサーバーあるいはローカルマシン上にそのshareFanctionを使用している分散しておいてある場合、
それぞれのマクロを調べて更新したいファイルを選択、修正版マクロを適用する、
みたいな使い方ってできるんですかね? >>784
>>例えばサーバーあるいはローカルマシン上にそのshareFanctionを使用している分散しておいてある場合、
修正
shareFanctionを使用しているファイルが ヴァージョンって仕事じゃないからいつから何時まででUP履歴にしたらいいかわからなん
機能変更したら必ずかもしれないけど、個人用だとやりながら変更しているからバージョン数が半端ないことになる。
バージョン管理は大変だよな
インストーラーみたいなのつくってどうにかしようとしてるがうまく行くかわからん
>>786
> バージョン数が半端ないことになる。
問題ないでしょ >>787
専用のソフトがなければ1sheetをマクロ関数管理用にして各関数内にver x.y.z(x変更で互換性無し、y変更で互換性あり、z変更は互換性ありバグ修正みたいにして)
モジュールをインポートしたファイルをオープン時に、イベント検知で所定の管理ファイルを検索、新しいバージョンがあれば自動で今までのモジュールを解放、y,zバージョンが最新のファイルをインポート
みたいにすれば実現可能そうですが結構手間がかかりそうで… マクロで書けよ。
バージョン管理。
セキュリティが低下するけどな。
そもそも論として、たかがマクロでバージョン管理が必要になるような力作()作るなよw
キミたちは一体エクセルマクロで何を築こうとしておるのかねw
仕事でVBA扱ってると色々な理由から小さいマクロでもバージョン管理が必要になってくる。
>>791
内容がぐちゃぐちゃになったら困るものにはバージョン管理が必要さ
力作()でなくても再構築はかったるいからな >>793
力作()じゃないのにぐちゃぐちゃになるってどんだけ当てずっぽうにマクロ書いてんだよw 社内に展開するとかでサポートが必要ならバージョン管理ぐらいは必須だろ
>>791は無知すぎ >>795
確かにおまえらの考える事は見当もつかんけどなw
別にいいや無能思考に明るくならなくてもw OLDフォルダにファイル名の後に日付つけたファイルをコピーしてる
ていうかバイナリファイルをバージョン管理システムに登録したところで
単なる時系列バックアップにしかならんうえに
シートを更新しただけでバージョンが変わるから意味ないのでは
悩みはみんな一緒なんだね。俺はバージョンアップに悩んでアドイン化したが
これはこれで悩ましいところがあるんだな。シートを初期化(つまりClearとかClearContents)する
のにもよーく考えないと結構危ない。アドインはどのブックでも実行出来てしまうからPCに疎いヤツが使うのも考えると
別の方法を考えた方が良いんだろうかとか考えてる。
>>802
アドインてxlamのこと?
だったらそのシートは一切使っちゃダメだよ
プログラムモジュールだけの存在にするべき >>803
そりゃ分かってるての。ブックを指定する時は「ActiveWorkBook」とするしかない(決めつけはよくないが)
からよーく考えてコードを書かないと危ない場合もあるって話。使う連中の9割はマクロどころかシート関数も
知らないような連中なんだから。 >>804
・処理をスタートするFunction や Subはアドイン側にはない。当該Book側にある
・そのFunction や Subがアドイン側の機能を使う
だとするとアドイン側に「ActiveworkBook」なんて書く必要はなくて、処理対象のSheetやRangeを
引数で受け取るだけになると思うんだがね >>805
作業するBookはxlsxなんだよ。マクロはxlms側に書いてある。
なんでこうしたかというと、仕事柄、ブックは地方自治体に提出する場合があるから。
何の事かわからないだろうからもうちょっと書くと、測量データの野帳なんだよ。 >>806
マクロ有効ブックから
マクロ無効ブックを開いて処理して保存して閉じる
という方法も有ると思う 自動処理したいなら>>808だろうし、操作者が開いて何かしたいならメニューに追加しとけばいいだけだと思う
>>806は無知なのかちょっと頭固いんだろうな >>809
作業ブック側にコード書けないんだよ。知ったかすんなよボケ >>811
Workbook_AddinUninstall てのは知らなかったな。
Workbook_Open するのと効果は違うんだろうか? またメゾット君が暴れてるな
あの馬鹿が出入りするようになってから荒れすぎ
>>816
おっと、 Workbook_AddinInstallを Workbook_AddinUninstallと書き間違えた >>817
だとしてもだ
イベントの言葉の意味そのままだよ
よく考えろよ >>818
「対象のアドインを参照設定しているブックを開いた」というイベントを想定してた
そうじゃないのね >>803
そんなことはない。
設定値を保存するためのiniファイルの代わりにするとか、テンプレートの代わりにするとか、使い道は沢山ある。 アドインにするにしてもなんにしても運用がしっかりされてないと意味がない
ファイル名やシート名程度が保証されてないならマクロ化なんて諦めろ
>>820
設定値を保存するのはやめたほうが良いと思うな。
バージョンアップしたときに設定値がリセットされてしまうとか、エクセルバグの巻き添えでブック破損の危険性がある。
できるだけアドインは読み取り専用で運用するべきだと思う。
過去に内部シートに保存するように作って問題が起きたので、バージョンアップ時にxmlにコンバートさせた事があるわ まあ、設定は外出しにするのが普通に安全策じゃね?
xlamのシートは明らかに利用してほしくないっていう思いが伝わる作りな訳だから
利用者が不用意にセルデータをクリアしてそのままセーブしても自覚すらしないかも
質問よろしくお願いします。
A列,B列,C列,D列
Aa,111,bbb,20
Bb,111,aaa,30
Aa,222,bbb,10
Bb,111,aaa,10
Aa,111,bbb,15
上記の様な表を下記の様にしたいです。
A列,B列,C列,D列
Aa,111,bbb,35
Aa,222,bbb,10
Bb,111,aaa,40
A,B,C列の値が一致したらD列を加算して行を削除するという処理です。データは約1000行程です。
1000行程度ならSUMIFSとかでできるんじゃないの
>>826
要件によるけどそういうビューを作ればいいんじゃね?
create view V as (
select A列,B列,C列,sum(D列) as D列
from 表
group by A列,B列,C列
) すまん、寝ぼけててSQLスレと勘違いしてた...
>>828はなしで >>826
見るからにデータベース向けの案件
集計するキーとなる列が左端一列、その右に合計対象の数値列という2列形式なら
データタブにある統合でできるんだが >>827
すみません説明不足でした。
キー項目が1000種類以上あり、毎回CSVから読み込んでから処理をする為、事前にWorkSheet関数を作っておくのが難しい状況です。
何か手はありますか? データベース系のデータは素直にデータベースソフトで管理しようよ・・・。
アクセスでやればマウス操作だけで終わる様な問題だよ。
>>831
ADOでcsvファイルをデータベースとして接続して >>828 に挙げられた
SELECT文を実行する、という手段がとれる sqlならselectとorder byだけですむ案件だな
愚直にプログラム組むと厄介だけどね
>>826
嘔吐フィルターかけてソートしてから
一致を上からみて加算と消去
フィルター解除忘れずに(多分ソート直後にすぐ) >>826
↑
上級者じゃない俺なんかこういうのみると
全部2次元配列にぶちこんでif多用して無理矢理やっちゃうんだけど
そういうのはだめなの? >>838
だめじゃないし、初心者なら無理やりVBAで組むのも勉強になるよ
重複の無いリスト作るのがやや面倒というか、煩雑になりがちなところだな
エクセルの機能使えばいいっちゃいいけど、好みじゃないな >>839
おれこういうの無理矢理やっちゃうの大好きで完成すると充実感半端ない
俺が組むマクロってそんなのばかりだ
基本初心者レベルの知識しか使わないでやっちゃうんで、
こういう質問をする人は、無理矢理やると遅くなるとか別の理由があって聞いてるのかな?
とか思っちゃう ファーム1の中に、オプションボタンが18個あり、オブジェクト名を『OP_1』〜『OP_18』としてボタン1を押してフォーム2に切り替える時に選択されてるオプションボタンのキャプションを取得して変数TUR1に入れたいんですけどどうしたらいいですか?
>>841
For i = 1 To 18
With Me.Controls("OP_" & CStr(i))
If .Value = True Then
TUR1 = .Caption
Exit For
End If
End With
Next 初心者なんだけど以下のような表から特定のセルに入力された場合だけ、特定のセルをカウントする方法ってありますか?
Aは全て
Bは選ばれたものだけ、みたいな
Aの全てをカウントするのはわけないんだけど、Bの選ばれたものだけをカウントする方法がわからない
IF使うにしても何を指定すればいいのでしょう?
わかりにくかてすいません
>>840
普通にやり方がわからないんじゃないの
>>843
cがキーになるなら重複しないcの一覧をつくって二次元配列でも構造体でもいいけどbがtrueならカウントするっていう風にすればいいと思う
件数多いならDBの領分だと思うけどね、この手の集計は >>844
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定で すいません、間違えて書き込んでしまいました
>>844
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定でがっつりやると、指定した範囲に一つでもtrueがあるとカウントしてしまって結局全部をカウントしてしまうんです >>826
何も難しく考えなくても、E列に=A&B&Cを入れて、E列を行ラベルにしてピボットテーブルで集計するだけで出来るよ。
ABC列をもどしたいならINDEX,MATCHで引っ張って来ないといけないけども、日々エクセル使ってる人なら手慣れたものだと思う。と言うか慣れておくと色々便利。
詳しい解説いるならする >>847
一行ずつループしてるんだよね?
フラグ用に変数用意してるなら一ループごとに初期化し直さないとだめよ
ってか、今どんなコードで動かしてるか書いてくれるとやり易いんだけど フィルタとCOUNTIFで良い気がするが
どうしてもVBAでやりたいのか?
HTMLソースで
<a href = URL1</a>
<br />**** ← 4桁の特定の数字が入る
<a href = URL2>予約中</a>
<a href = URL3>[取消]</a><br /><a href = URL4>[訂正]</a>
上記の4桁の数字とURL以外同様のソースが全部で10個あるページがあり、C5セルに4桁の数字を入れ、それに対応したURL3のリンクをクリックしたいのですが、どうすれば可能でしょうか?
IEでそのページまで飛ぶのは問題ないのですが、aタグのインナーテキストが4桁の数字以外共通なためForとGetElementsByTagNameとの組み合わせでクリックできないので何か手段があれば教えて頂きたいです。
>>826
そういう処理だったらソートしても問題無さそうだからソートしてループで良いんじゃね?
>>851
4桁の数字以外共通だとどうしてForとGetElementsByTagnameとの組み合わせでクリック出来ないのかが分からん。 >>852
あ、確かに。書き間違えました。下記のコードだと10個のリンクのうち、一番上にあるやつをクリックすると思うのですが、
C5セルに入力した特定の4桁の数字の下にあるリンクをクリックしたいのです。
For Each obj In objIE.Document.getElementsByTagName("a")
If InStr(obj.innertext, "取消") > 0 Then
obj.Click
Exit For
End If
Next DOMに親要素とか隣の要素を見ていくのあったよね
あれで必要なだけ移動させればいいんじゃね
>>826を
>>833の方法で頑張ってコードにしたのを書き込みたいんだけど
403になっちゃうのよね
禁断のコードが含まれているのかしら 856デフォルトの名無しさん2018/01/07(日) 08:20:46.08
>>843
VBAを使わずにExcelの計算式で書くとこうだよね。
・C列が「10」、B列が「○」の行を数えるなら
=COUNTIFS($C$2:$C$6,10,$B$2:$B$6,"○")
・C列が「10」、B列が空以外の行を数えるなら
=COUNTIF($C$2:$C$6,10)-COUNTIFS($A$2:$A$6,10,$B$2:$B$6,"")
これをVBAで書きたいなら、そのままワークシート関数を呼び出せばいい。
・C列が「10」、B列が「○」の行を数えるなら
With Worksheets("Sheet1")
dblCnt = WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "○")
End With
・C列が「10」、B列が空以外の行を数えるなら
With Worksheets("Sheet1")
dblCnt = WorksheetFunction.CountIf(.Range("C2:C6"), 10) - WorksheetFunction.CountIfs(.Range("C2:C6"), 10, .Range("B2:B6"), "")
End With
注:COUNTIFS関数はOffice 2007で追加されたので、2003とかでも動くようにするには
計算式なら配列数式を使うかダミーの結合列 (例: F列に =B2&”:”&C2)を使う必要があるし、
VBAなら自前で1行ずつループするFor文を書く必要がある。 コンボboxを使ってサジェスト機能みたいなことをしたくて作ってみたんだけど、1文字目はうまくいくんだけど2文字目以降打つとリストの一番上が乗ってきて使い心地が良くないんだけど、どうしたらいいですか?
コンボboxのリストのみをクリアするやり方もいまいちわかりません。
j=2
Tname.rist=array()
set MstSht=worksheets(″マスター″)
str_word=controls(″Tname″&j).value
for i=2toMstSht.cells(rows.count,6).end(xlup).row
if instr(ucase(MstSht.cells(i,6).value),ucase(str_word))=1 then
controls(″Tname″&j).additem MstSht.cells(i,6).value
end if
next
エクセルの2003ですが、
並べて比較を使用した際にペアになっているブックと、
そのブックで表示されているシートを取得するには
どのように記述すればいいでしょうか。
>>858
Excel2003はサポート切れてますので
Excel2007にのりかえましょう 862デフォルトの名無しさん2018/01/12(金) 01:41:04.62
vbModelessで開いたUserForm上のTextBoxにSetFocusするようInitializeに記述しても効きません
これって無理なんですかね?
vbModelessを切るとフォーカスがちゃんとTextBoxに移るんですけどね
初期状態でフォーカスを当てたいなら
UserForm.Show vbModeless
UserForm.TextBox.SetFocus
とフォームを呼んでいるプロシージャ側に書く
フォームのイベントならActivateでどうでしょう
毎回フォームがアクティブになるたびフォーカスしちゃうけど
Initializeがなぜはしらないのかは知らない
実験してみたらInitializeは呼ばれてるけど
SetFocusだけがだめみたい
他のことは普通にできる
なんでしょうね
>>866
自分でもいろいろやってみたんですけどやっぱりダメみたいですね
ありがとうございました 試してないけど、プロパティのTabIndexも駄目だったの?
ThisWorkbook.Application.Hwndでブックのハンドルを取得して、
SetLayeredWindowAttributesで透過処理をする時、
LWA_ALPHAでは問題ないのに、
LWA_COLORKEYに変えると、なぜかブック全体ではなく、
シート上に最初に配置したコマンドボタンの方に誤爆します。
しかも、自分のPCでは問題ないのに、他人のPCだと誤爆するという意味不明さ。
ハンドルがずれる的なバグでもあるのでしょうか?
871デフォルトの名無しさん2018/01/13(土) 10:12:39.30
ウィンドウ表示時にフォーカス当てたいんならTabIndex=0にすればいいんだと思うけど、
あとはフラグを使ってInitialize直後のActivateイベントでフォーカスを当てればいいんじゃね?
Private mblnInitFlag As Boolean
Private Sub UserForm_Activate()
If mblnInitFlag Then
TextBox2.SetFocus
mblnInitFlag = False
End If
End Sub
Private Sub UserForm_Initialize()
mblnInitFlag = True
End Sub
一つ目の表
A,B,C,D,E
aaa,bb,cc,00,20
bbb,cc,dd,11,30
二つ目の表
G,H,I,J,K
aaa,bb,cc,00,10
bbb,cc,dd,11,10
上の様な表があり、一つ目のABC列と二つ目のGHI列の値が一致すれば、二つ目の表の横にE列からK列の数値を引いた値を表示したい。
一致するデータが無ければ、一致データ無しと表示。
上の表だと2つ目の表の右列に、それぞれ10,20と表示。
データ量は300~800程です。
出来る方、よろしくお願いします。
873デフォルトの名無しさん2018/01/13(土) 10:29:13.82
>>870
LWA_COLORKEYは指定した色を透明にするんだから、
その他人のPCでExcelのウィンドウの色が違うんじゃね?
知らんけど 既存プログラムで引数が多いやつを減らしたいんだけどどうすればいい?
ただグローバル変数使うと他のアプリケーションに影響出るから使えない。
今から構造化やクラスにするのは名前変更が大変そうだし、同じ型でも同じ動作でもないからまとめにくい。
>>873
それが、コマンドボタンとシートの色を同じにしても、
コマンドボタンの方だけ透過されるんです。
しかも最初に配置したコマンドボタンだけ。
2個目以降は変わらず。
透過の前後で、ハンドルの値をデバッグプリントしても変化ないですし。 876デフォルトの名無しさん2018/01/13(土) 10:49:24.82
>>872
2007以降限定でよければL列に計算式埋め込んじゃうけどね
=IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し") ちなみに、こんなのです。
Sub test(ByVal Flg As Boolean)
Dim Hwnd As Long: Hwnd = ThisWorkbook.Application.Hwnd
Call SetWindowLong(Hwnd, -20, &H80000)
If Flg Then
Call SetLayeredWindowAttributes(Hwnd, 0, 200, 1) '←成功
Else
Call SetLayeredWindowAttributes(Hwnd, 0, 200, 2) '←コマンドボタンに誤爆
End If
End Sub
変えているのは最後の引数だけなんですが。
878デフォルトの名無しさん2018/01/13(土) 11:27:43.02
>>874
Sub test1()
Dim args(5) As Variant
Dim arg1 As String
Dim arg2 As Long
Dim arg3 As Variant
Dim arg4 As Workbook
Dim arg5 As Collection
arg1 = "test"
arg2 = 123
arg3 = ActiveSheet.Cells(1, 1)
Set arg4 = ActiveWorkbook
Set arg5 = New Collection
arg5.Add New DataObject
arg5.Item(1).SetText "sample"
args(1) = arg1
args(2) = arg2
args(3) = arg3
Set args(4) = arg4
Set args(5) = arg5
Call test2(args)
End Sub
‘ ――
Sub test2(ByRef args As Variant)
Dim arg1 As String
Dim arg2 As Long
Dim arg3 As Variant
Dim arg4 As Workbook
Dim arg5 As Collection
arg1 = args(1)
arg2 = args(2)
arg3 = args(3)
Set arg4 = args(4)
Set arg5 = args(5)
Debug.Print arg1
Debug.Print arg2
Debug.Print arg3
Debug.Print arg4.Name
Debug.Print arg5.Item(1).GetText
End Sub >>876
列の挿入や削除の処理があるので、数式だと参照ズレなどが起こってしまうので出来たらVBAで処理したいと考えています。 >>861
Excel2010を用意しました。
>>859
エクセルで「Book1」「Book2」「Book3」を開いた状態で、
「Book1」「Book2」を並べて比較している時に、
ペアになっている「Book1」「Book2」を特定する方法、
もしくは「Book1」がActiveWorkbookの時に「Book2」を特定する方法が知りたいのです。 881デフォルトの名無しさん2018/01/13(土) 13:42:21.62
並べて比較って
人間が何かを見比べて確認しているわけだから
その作業は人間がやる必要ないとおもうので
全部VBAでバックグランドで処理すればいいのではないかと単純に思ってしまう
最後に比較した結果だけ表示してあげる
>>881
比較自体は計算式でできますが、
比較する対象を特定する事は計算式でできない気がします。
>>882
挿入等によって比較したい箇所がBook1と2で異なる可能性がある為、
事前に比較の起点となる箇所を選択する必要があります。 884デフォルトの名無しさん2018/01/13(土) 16:53:07.70
>>883
> 比較する対象を特定する事は計算式でできない
意味分からん
=IF(COUNTIFS($A:$A,$G1,$B:$B,$H1,$C:$C,$I1)>0,SUMIFS($E:$E,$A:$A,$G1,$B:$B,$H1,$C:$C,$I1)-$K1,"一致データ無し")
この計算式を単純にVBAに置き換えて
With Worksheets("Sheet1")
If WorksheetFunction.CountIfs(.Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) Then
.Range(“L1”) = WorksheetFunction.SumIfs(.Range(“E:E”), .Range(“A:A”), .Range(“G1”), .Range(“B:B”), .Range(“H1”), .Range(“C:C”), .Range(“I1”)) - .Range(“K1”)
Else
.Range(“L1”) = “一致データ無し”
EndIf
End With
行列を変数で指定できるように.Rangeを.Columnsや.Cellsに置き換えて数値で指定できるようにして
With Worksheets("Sheet1")
If WorksheetFunction.CountIfs(.Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) Then
.Cells(1,12) = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(1,7), .Columns(2), .Cells(1,8), .Columns(3), .Cells(1,9)) - .Cells(1,11)
Else
.Cells(1,12) = “一致データ無し”
EndIf
End With
あとは必要なところを変数化してループを回せばいいじゃん
Dim rngCell As Range
Dim lngRow As Long ‘ ループを回すため行番号を変数化
With Worksheets("Sheet1")
Set rngCell = .Cells(1, 12)
‘ 表の詳細仕様が分からないのでとりあえずK列が空じゃない限りループ続行
While rngCell.Offset(0, -1) <> “”
lngRow = rngCell.Row
If WorksheetFunction.CountIfs(.Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) Then
rngCell = WorksheetFunction.SumIfs(.Columns(5), .Columns(1), .Cells(lngRow,7), .Columns(2), .Cells(lngRow,8), .Columns(3), .Cells(lngRow,9)) - .Cells(lngRow,11)
Else
rngCell = “一致データ無し”
EndIf
Set rngCell = rngCell.Offset(1, 0) ‘ 次の行
Wend
End With
列の追加削除があるということだったら列番号も変数化すればいい 初心者で申し訳ありません
セルに入力した選手コードを選手名に置換するような動きをさせたいのですがどうするとよいでしょうか
別のシートに選手名簿は用意してありA列に選手コードB列に選手名があります
すまん「置換」を見落とした
VBAは要るな
WorksheetFunction.VLookup でやるなり、ループで検索するなりやればいい
>>885
普通はセルに入力された選手コードをわざわざVBA置換するなんてことはしないで、VLOOKUP等のワークシート関数を書くけどね
置換操作をVBAで書かなきゃいけない理由はあるの? 889デフォルトの名無しさん2018/01/13(土) 17:58:56.84
>>885
>セルに入力した選手コードを選手名に置換するような動きをさせたい
セルに選手コードを入力して、Enterを押した途端に選手名に置き換わるような動きをさせたいんだな?そうなんだな? >>887
検索置換のダイアログでシート内の選手コードを一括変換する、みたいな手作業の業務手順をそのままマクロ化しようとしているのかもしれないし、そういう場合はそもそもシートの設計や業務手順に問題がある場合が多い。
最初にVLOOKUP使えと指摘したあんたの感覚は基本的には正しいと思うぞ。 >>885
単発ならワークシート関数でやった方が簡単
VLOOKUPで変換したのを用意しといてそれをごそっと上書きする
何回もやるなら、上記をマクロにする
このくらいならマクロの記録でもいけそう
全部VBA上でやる方法もあるけどビギナーには大変でしょう
こんな感じでいいんじゃなかろうか
Dim i
i = スタートする行
Do While Not Worksheets(1).Cells(i, 1) = ""
Worksheets(1).Cells(i, 1) = WorksheetFunction.VLookup _
(Worksheets(1).Cells(i, 1), Worksheets(2).Range("名簿範囲"), 2, 0)
i = i + 1
Loop
シートのインデックスとかは書き換えてね
意味不明ならマクロ記録かさらなる修行をオススメする >>889
VBAに慣れてる人ならセル値の置換と聞いただけでワークシート更新イベントを使いたいのかなって思いがちだよな
俺も最初はそう思ったわ
でも質問者の質問内容を推測抜きで素直に読むとそうとは限らないんだよな >>888
トーナメントの結果を入力するようになっているのですが既に報告用ワークシートはあるのですが入力件数が多くなりすぎて最終的にはバーコードによる入力を試みようとしています
また、その報告用ワークシートは書式が決まっており並べ替えエラーチェックのマクロが既にあるので行を入れたりして関数をいれる対応ができないという状態です
>>889
入力後にマクロ実行用のボタンを押して置換するような想定でした
エンターを押した瞬間変わるものでも大丈夫です >>887
>>891
ありがとうございます
家に帰り次第試してみます
>>890
今まではワークシート内から対戦選手の名前を探してきてコピーアンドペーストで対応していたのですが参加者が年々増えてきて(今年の見込みは約千人位)追い付かなくなってきたために速度向上を目的としています >>884
VBAに記述のあるWorksheets("Sheet1") の箇所を、
並べて比較でペアにしているシートに特定する方法が思いつかないのです。 >>895
ファイル名とかシート名がランダムでないなら
固定値じゃないの?
どんなファイル名か分からない、シート名か分からないってなら都度入力するしかないな。
データ形式で特定することもできるけど、
無駄な作業にしか思えない。 >>893
こんな感じならどうかな
以下は、実行すると報告用シート内に含まれる選手コード全てを一気に置換する
複数の選手コードを含む場合も一発で置換できるはず
名簿にはコードの欄が空白の行がなく、名簿シートのA2セル以下に選手コードが入力されているものと仮定してる(A1は表見出し)
セル値の一部が選手コードと一致する場合も置換されてしまうので、コードのみが入力されているセルの値だけを確実に置換したい場合、Replaceメソッドの引数のLookAt:=xlPart をLookAt:=xlWholeに変更してくれ
Sub ReplaceCode
Dim sh_list As WorkSheet '選手名簿シート
Dim sh_report As WorkSheet '報告用シート
Dim i As Long
Set sh_list = WorkSheets("選手名簿シート")
Set sh_report = WorkSheets("報告用シート")
For i = 2 To sh_list.Range("A2").End("xlDown").Row
sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart
Next i
End Sub >>896
ファイルのフォーマットが複数あるので、
事前にファイル名とシート名を規定できないのです。
なので、せめてペアにしたファイル同士が特定できれば、
ファイルとシートを選択する手間が省けると思ったのですが・・・
3つ以上開けなくなるけど、workbooksからマクロブックを除外した先頭2つを比較する方法で考えてみます。 >>898
それは運用を変えよう。機械的に処理するなら人間側が合わせる必要がある。
手動で命名規則に沿うか、命名自体を自動的にして人間が意識しないようにするか。 エクセル2010でCSVファイルを開いた場合、
UTF8やshiftjisを自動で判定して表示してくれますが、
この時に判定された文字コードを取得する方法はありますか。
用途は、外部データの取り込みでCSVを開きなおすための文字コードの特定です。
>>901
ありがとうございます。
試してみます。 >>897
実行時エラー13
型が一致しませんとなっていて
For~の行でエラーを出していて止まるみたいです
あと報告シートが選手の強さ別に複数に分かれているのですが今選手コードの入力したシート(つまりいま開いているマクロ実行用のボタンを押したシート)を処理したいという場合どうするとよいのか教えていただけると助かります >>904
エラーの出たコードを転載して見せてもらえませんか?こちらの環境ではうまく動いているんですが、私がコードを転載したときにミスをしたかもしれないので
それから、コードはボタンマクロ(ボタン名_Clickのような名前のプロシージャ)として各シートのシートモジュールに書いているんでしょうか? >>905
Sub ReplaceCode()
Dim sh_list As Worksheet '選手名簿シート
Dim sh_report As Worksheet '報告用シート
Dim i As Long
Set sh_list = Worksheets("選手名簿")
Set sh_report = Worksheets("対戦結果表_A級")
For i = 2 To sh_list.Range("A2").End("xlDown").Row
sh_report.Cells.Replace What:=sh_list.Cells(i, 1).Value, Replacement:=sh_list.Cells(i, 2).Value, LookAt:=xlPart
Next i
End Sub
シート作成用のコードが既にあるのですがその中のコードを流用して各シートに実行用のボタンを置く計画でした
ActiveSheet.Buttons.Add(2, 1.5, 125, 18.75).Select
Selection.OnAction = "CSV_SAVE"
Selection.Characters.Text = Worksheets(2).Cells(1, 1).Text & "級のCSVファイル作成"
With Selection.Characters(Start:=1, Length:=15).Font
.Name = "MS Pゴシック"
.FontStyle = "標準"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
End With
これのCSV_SAVEをReplaceCodeにしてボタンの名前と場所をかえるつもりでしたがあまりよくない方法なのでしょうか
必要であれば既にあるコードを出しますので教えてください >>906
申し訳ない、Forの行でEnd("xlDown")となってるの、自分の転記ミスでした
エラーの原因もこれでしょう
二重引用符なしでEnd(xlDown)と書き直して動かしてみてください 質問です。
ソルバーで普通は目的セルをrangeなどで指定しますが、シートのセルにアクセスせず、vba内の変数を直接ソルバーにかけてvba内だけで完結したいのですが、方法あるでしょうか?
>>908
うまくいきました
ありがとうごさいます セルのA列にある文字列をコンボboxにaddですべて入れた後に、一文字入力する度に候補が絞られてくって出来ます?
コード教えてもらえないですか?
一文字入力する度にコンボボックスの候補を絞ればいいんとちゃうか?
知らんけど
社内に部品表があって、重複している名前を省いて部品種類一覧の表を作ろうと思ってます。
・ネジM5
・ネジM5
・ナットM5
・ナットM5
↓
・ネジM5
・ナットM5
というイメージです。
自分なりに下記のマクロを組んでみました。
Dim row As Long, col As Long, D As Range
col = 1
row = 1
Do Until Cells(row, col) = ""
If Not Cells(row, col) = Cells(row + 1, col) Then
If D Is Nothing Then
Set D = Cells(row, col)
Else
Set D = Union(D, Cells(row, col))
End If
End If
row = row + 1
Loop
この後レンジDをコピペするマクロです。
部品の種類が100とか200なら動いてくれますが、本来20,000件超の部品の種類があり、こちらを処理するとフリーズします。
デバックのウィンドウはユニオンのところを指定してきてるんですが、ユニオンにはまとめられる量の限界などがあるのでしょうか?
>>913
Excel VBAでやってもいいけど、RANGEオブジェクトに溜め込むやり方よりは、素直に別シートに値をコピー、さらにそれを検索して別の値が出てきたら別シートにコピーでいいんじゃないのか?
そもそもExcelのフィルタ関連の機能でもできるからVBAを使う理由がわからない。 DBMSがコンソールなんかに返した結果を
Excelセルに上手く貼り付ける方法ってある?
>>918
詳細忘れたけど代入する事で、そのまま貼り付けられるメソッドがあったはず。 >>913
ADOなら一瞬で終わる
いろいろ突っ込まれているように、別の方法のが簡単だと思うけど
シート名やら列名は読みかえてね
Dim adocon As Object, adors As Object
Set adocon = CreateObject("ADODB.Connection")
Set adors = CreateObject("ADODB.Recordset")
With adocon
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0"
.Open ThisWorkbook.Path & "\" & ThisWorkbook.Name
End With
Set adors = adocon.Execute("SELECT DISTINCT 部品名 FROM [部品表$]")
Worksheets("部品種類一覧").Range("a1").CopyFromRecordset adors
adocon.Close >>913
下手にマクロ組むよりExcelの標準機能の重複削除を使え。
VBAとは違って並列処理できるから速度が段違い 重複なしリストはいろいろやり方あるけど、標準機能使うかadoでやるかがスマートだろうね
dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね
ここ初心者スレかと思ってスレタイ見なおしてしまったわw
オレ以外初心者しかおらんやんw
.netframeworkのlistって重複削除機能なかったっけ?
>>927
リストにあるかないかはわかるみたい
これなら配列に突っ込んで総当たりしていくのと変わらなそう
読みやすくはなるけど
Dim partsList As Object
Set partsList = CreateObject("System.Collections.ArrayList")
Dim partsData
Set partsData = Range("データの列")
Dim parts
For Each parts In partsData
If Not partsList.Contains(parts.Value) Then
partsList.Add parts.Value
End If
Next
出力処理省略 >>924
> dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね
意味不明
Dictionaryとfsoになんの関係があるんだ? >>913
とりま、Union関数は遅いから絶対に使うな、それだけ
セル数がちょっと増えると簡単にフリーズする
普通に配列とかに入れてった方がいい >>930
とりま、なんでいきなりそれを言いだしたのかよく分からんが
遅いのはお前のプログラムが下手糞なだけ
脈絡のない下手糞自慢ごくろうさん require 'set'
File.readlines("ファイル名").to_set.map { |item| puts item }
Ruby の集合を使うと、以下のような行区切りのファイルを、
あ
い
あ
あ
う
い
以下のような結果にできる。
ただし、集合にはデフォルトで、順番は無いので、
順番が必要なら、お好みの基準でソートする
あ
い
う
毎度思うんだが、Rubyって他言語のスレにまで布教しに来なきゃならないほど不人気なのか?
Ruby だと、テキスト処理が、めちゃめちゃ簡単に作れる
他の言語のように、悪戦苦闘しない
どうせなら引っ越し準備も兼ねてPythonにしようゼ
単純に2万個のセルをUnionするだけで1時間かかる
Sub aaa()
Debug.Print Time
Dim u As Range
Set u = Cells(1, 1)
For r = 3 To 40000 Step 2
Set u = Union(u, Cells(r, 1))
Next
Debug.Print Time
End Sub
2万個のデータは、テキストデータだけなら、1MB ぐらいだろ
>>932
のRuby でのテキスト処理なら、1秒ぐらいじゃないか? >>937
空気読んでね
ここはテキスト処理の質問スレじゃなくて
Excel VBAの質問スレだから そんなに時間が掛かるのなら、一旦データをエクスポートして、
データをテキスト処理してから、インポートして戻せば?
たかが、2万個のデータで、1時間は現実的ではない
そんなに時間が掛かっても、どうしても、VBA でやりたいのか?
あくまでUnionを使った場合であって高速に処理する方法はいくらでもあるからなぁ。
それに仕事でVBA使う環境だと他社との協調も考えなきゃいけないからRubyインストールする方がよっぽど非現実的だし。
まぁ、たぶんおちょくってるつもりなんだろうけど、そもそもVBA以外の環境がないって前提のスレだから、
Rubyマンの煽りが煽りになっていないっていう・・・。
重複の削除はワークシートでやった方がてっとり早いと思う
>>940
> そもそもVBA以外の環境がないって前提のスレだから
そんな前提で質問に来る人もいるだろうけど、
「最適解」を求めている人が、とりあえずVBAだとどうなるか、と思って質問する場合もあるでしょ
だから、質問者が「全体にVBA以外はダメ」って制限をかけていない限りは、
上でも、ACCESSを進めている人もいたけど、実用面から考えた回答も質問者の利益になると思うんだけど
(質問者がそう思っていても、何も知らないからそう思ってるってパターンすらあり得るかな) >>942
Excel VBA質問スレでの「実用面」は、一般的な企業向けWindows PC(Office製品入り)で出来る事に制限されると思うけど。
それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
だいたい他の言語に興味があるなら、その言語のスレで質問すりゃいいわけだし、
どんな自己弁護をしたところで特定言語のスレで他言語の話をする理由にはならないよ。
せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
Rubyスレに誘導して、そちらで話を展開すべきだね。 >>943
> それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
リアルでも、相手に聞きもせずに勝手にそんな縛りをかけて要件定義する人はいないと思うよ
> せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
> Rubyスレに誘導して、そちらで話を展開すべきだね。
環境を聞くのは勿論ありだが、「○○だとより簡単にできるよ」ってこちらから言う事に何の問題があるのか?
今ある環境内で必ず実現する必要があるなら別だが、そうでない場合もよくあることでしょ
ま、いずれにせよ、何も聞かないうちに勝手に「○○に違いない」って決めつけるのは、
要件定義では一番しちゃいけないことだよ >>944
仕事している風を装いたいんだろうけど、明らかに経験が無いの丸出しなんだよな・・・。
そもそもVBAスレでRubyの話を出してくる事自体が問題なんだよ。
君が問題になっているのは要件定義の話ではなく開発環境の話だ。
明確な線引きをするなら、このスレではxlsmに記録し、特別な準備なしに実行できるものでなければ、何であれ許容範囲外だ。 またそうやって明文化されてもいない自分ルールを展開していくー
明文化されてはいないけど、過去から今までのスレでの反応を見る限りは、
だいたいxlsmファイル単体でマクロの実行が補完できるかどうかが拒絶反応の出る出ないを分けてるよ。
ただ個別にマクロが記録された二つ以上のファイルを連携させる場合の話もあるから「xlsmに記録し、準備なしに実行可能な」と定義しただけ。
押しつけるつもりはないけど、この定義で問題が無ければテンプレに加えてキチ避けしてほしいくらい。
>>929
ごめんscriptingRuntimeのやつ、の間違いだ VBAをメインとして他言語も補助的に使う。
それなりにあると思う
同じ現象が起きるようにできるだけ簡単なコードを用意しました
まっさらなxlsmにUserForm1を挿入し、TextBox1とTextBox2を横に並べます
UserForm1モジュールに下記のようにコードを記述します
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 39 Then
With TextBox2
.SetFocus
.SelStart = 0
End With
End If
End Sub
UserForm1を呼んだ後、TextBox2にabと記入します
このとき、TextBox1からTextBox2に矢印キー右でうつろうとするとaの前ではなくaとbの間にカーソルが来てしまいます。
どうすればaの前にカーソルが来るようになりますか?もちろんabは例示にすぎずいろんな文字列が入ります
よろしくお願いします
>>950ですけど、KeyCode=40、つまり矢印キー下にセッティングして
TextBox1から2に移ると頭にカーソルきますね
ということは、入力した矢印キー右がTextBox2に移ったあとも生きててその影響が出てるってことですかね
まぁ原因分かっても解決方法が分からないのですが 試していないけれど
With TextBox2 の前に
KeyCode = 0 を入れたらどう
>>949
VBAでは書きにくい or 実行速度がめちゃ遅い
かつ
その言語なら簡単に書ける or 実行速度が速い
ならありうると思う
なのでAccessとかADOならまだわかるけどRubyはないな >>952
しゅごい・・・できました
ありがとうございました 。と。の間に入ってる文字を全部同じ文字に置換したい場合ってどうすればいいでしょうか?
。。 →。ccc。
。akok。 →。ccc。
。3293i9ia。 →。ccc。
みたいな感じです
数式の中のってのがよくわかんないから実際の数式を書いてくれ
こういう事がやりたいって感じです
わかりづらくてすいません
=123456789(この9桁の数字はランダム) → =123ccc789
=123456789(この9桁の数字はランダム) → =12ccc3456789
2週間くらい前から、
フォームコントロールのボタンを配置すると
エクセルファイルの起動が
いつもの起動時間の5倍くらいかかる様になり困っています。
ちなみに、新規のファイルでも同じ現象になり、
他のパソコンでも同じ現象になっています。
どなたか、解決方法を知らないでしょうか?
今使っている環境は
Windows 10、バージョン 1709
Excel2016 バージョン 1712
です。
>>960
草生やしてんじゃねえよ真面目に質問しろ >>958
みんなこれでわかるの?
上と下に規則性があるように見えないんだが
上は値を置き換えてて、下は挿入してるよね >>913
そのテキストファイルがCSVファイルみたいにカンマ区切りで
ヘッダとして項目名が付いてて項目名に重複が無ければ
そのファイルにSQLぶん投げて結果セット取ってこれるんだけどなぁ 969デフォルトの名無しさん2018/01/24(水) 21:14:29.60
地道にループぶん回してFomulaLocalとInStrとMidしてちょ
いや、ループするにしても
VbScriptingDictionary使うかCollection使って
値をキーとして登録して
同じキーがあれば無視、無ければ登録追加で
最後にその取っておいた内容を
展開するようにすればそこそこのレスポンスで
行けるんじゃないかな。
SQLで行けるならそれが最速だとは思うけど。
ちゃんとしたDBMSならともかく、エクセル表にSQL投げて実行速度が速いとか考えられんけど
ADOだとそれなりに早いイメージなんだけど
実際はどうなのかね
誰か検証していてもよさそうだが
一項目だけの比較なんかだとVBAでやるのと変わらないけど、色々と条件が増えていくとSQLの方が速度が落ちにくい。
あと他の誰かが見ることも考慮すると、SQLで見えるようにしておいた方が分かりやすい。
ただExcelでSQLというのは絶望的に使いづらい。
UPDATEはできるけどDELETEができないんだっけ?
できなくてもやらなきゃいけない時があるんだよ男にはな
エクセルのテーブル機能ってどうなんよ
あんまり使わんから馴染みないんだけどsql使いやすくなったりせんの?
>>975
猫もだよ
穴に逃げた虫を懸命に取ろうとしている こういうのを見ると
早くPython導入して欲しいって思うよな
アンケート取られてたからちょっと入門見たけど結構面白いわアレ
こういった集約的なことに関してもずっと楽に作れそう
VBやC#でも後の方で覚えることになるラムダ式や
イテレーターとかごく基本的な当たり前のこととして
いきなり最初から出てくるし
VBAですら暴走しまくりのお前らにpythonなんか与えたら社会を困らす力作マクロ()がますます増えちゃうじゃんかw
コードをまともに読み書き出来ないメゾット君が心配するような事でもないけどな
VBAを廃止なんてできるわけないからPythonと入り乱れたプログラムになるんだろーか?
影響するのは最新バージョンだけだろうし、Excel版Pythonの初期バージョンだと使い物にならなかったり参考文献が少なかったりの問題で、
本格的に使われるようになるにしても五年以上かかりそう。そしてそこからさらに数年経たないと、そのバージョン使う会社が出てこなさそう。
っていうか今までもVBAをVB.Netへ移行させようとして失敗してたらしいし、AIブームに乗じた一時的なもんで実現しないんじゃないの。
985デフォルトの名無しさん2018/01/27(土) 00:23:34.40
Pythonって起動にめっちゃ時間がかかるから(5秒くらい)
普段使いのちょっとしたツール作るには使い物にならないという印象
多分Python載ったとしてもしばらくはVBAと共存だろうとは思う。
勉強嫌いな爺さん達にはPythonが来るのは驚異以外の何物でもないかも知れないけど
導入されたら少なからず徐々に普及し始める。
なぁに、EXCELの中のコンパクトに纏まった世界の話だし
勉強するにはうってつけだと思う。
少なくとも今後のVBAよりは次に繋がるよ。
今まで言語を変えるような具体的な話は出てなかったからなぁ
まさかObject指向言語じゃなくていきなり関数型言語が来るとはなぁ
PythonはAIブームの収束と共に消えていきそうな雰囲気だから将来性っていうと疑問が・・・。
ツッコミどころ多すぎだけどとりあえずw
オマエがギモンを感じるなw
>>985
> Pythonって起動にめっちゃ時間がかかるから(5秒くらい)
さすがにPC買い換えようよ... VBAがくっそ使えない言語だから普通はpython大歓迎でしょ…
VBA嫌いじゃないけど、Phythonの方が明らかにエレガントなコーディングできそうだから歓迎しかないわ
VBAは参照設定したら使える程度のものになるんじゃないか?
どんな言語だってできる奴はできる。
VBAが駄目だとか言う奴に限って碌なコード書けない奴ばかりなんだよなあ。
こんな書いててストレスマッハの言語はないからな
まあ全員パイソンいくでしょw
VBA→javascript→Pythonの順に覚えたけど何がそんなにストレスなのかよく分からん
>>993パイソンやとスレで相談したいときに
質問スレではインデント崩れて悲惨なことになってるな lud20230202060652ca
このスレへの固定リンク: http://5chb.net/r/tech/1510107990/ヒント:5chスレのurlに
http://xxxx.5ch
b.net/xxxx のように
bを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「Excel VBA 質問スレ Part51 ->画像>4枚 」を見た人も見ています:
・Excel VBA 質問スレ Part61
・Excel VBA 質問スレ Part64
・Excel VBA 質問スレ Part72
・Excel VBA 質問スレ Part65
・Excel VBA 質問スレ Part68
・Excel VBA 質問スレ Part67
・Excel VBA 質問スレ Part66
・Excel VBA 質問スレ Part79(ワッチョイあり)
・【RIFT】 Rift: Planes of Telara 質問スレ Part5
・【TESO質問】The Elder Scrolls Online 質問スレ Part1
・Angel Love Online 質問スレ Part27
・【アズレン】アズールレーン 質問スレ Part51
・【TESO】The Elder Scrolls Online 質問スレ Part24
・【TESO】The Elder Scrolls Online 質問スレ Part38
・ChMate 質問スレ Part55
・メギド72 質問スレ Part515
・【PoE】 Path of Exile 質問スレ part29
・【PoE】 Path of Exile 質問スレ part33
・【PoE】 Path of Exile 質問スレ part23
・【アズレン】アズールレーン 質問スレ Part58
・【アズレン】アズールレーン 質問スレ Part53
・【アズレン】アズールレーン 質問スレ Part52
・【アズレン】アズールレーン 質問スレ Part55
・【DQB2】ドラゴンクエストビルダーズ2 質問スレ part5
・【L2R】リネージュ2 レボリューション / Lineage2 Revolution 質問スレ part5
・d払い 質問スレ Part1
・PSVita 質問スレ part4
・LINE Pay 質問スレ Part1
・【PC】Terraria 質問スレ Part16
・Galaxy S8 / Galaxy S8+ 質問スレ Part1
・【アズレン】アズールレーン 質問スレ Part41
・【BnS】ブレイドアンドソウル 質問スレ Part21
・【PC】Elden Ring エルデンリング 質問スレ Part3
・【TESO】The Elder Scrolls Online 質問スレ Part27
・【PS/XB】Elden Ring エルデンリング 質問スレ Part3
・【FEH】ファイアーエムブレム ヒーローズ 質問スレ Part.21
・Avisynth 質問スレ Part10
・au by KDDI 質問スレ Part.237
・au by KDDI 質問スレ Part.240
・Windows 10 質問スレッド Part59
・Windows 10 質問スレッド Part50
・Windows 10 質問スレッド Part55
・PSVita 質問スレ part1 [無断転載禁止]
・au Xperia Z1 SOL23 質問スレ part3
・【PoE】 Path of Exile 質問スレ part22
・幻獣契約クリプトラクト 質問スレ part10
・【PoE】 Path of Exile 質問スレ part14
・【PoE】 Path of Exile 質問スレ part19
・【PoE】 Path of Exile 質問スレ part45
・【MGO】METAL GEAR ONLINE 質問スレ Part14
・【BlackDesert】黒い砂漠 質問スレ Part18
・【BlackDesert】黒い砂漠 質問スレ Part30
・【LoL】League of Legends 質問スレ Part64
・iTunes 質問スレ Part13©2ch.net・
・【LoL】League of Legends 質問スレ Part67
・The Division ディビジョン 質問スレ Part2
・Android 質問スレ Part66 【アプリ質問は他で】
・【アズレン】アズールレーン 質問スレ Part40
・【アズレン】アズールレーン 質問スレ Part18
・【アズレン】アズールレーン 質問スレ Part13
・【アズレン】アズールレーン 質問スレ Part29
・【アズレン】アズールレーン 質問スレ Part24
・【アズレン】アズールレーン 質問スレ Part33
・【アズレン】アズールレーン 質問スレ Part36
・【アズレン】アズールレーン 質問スレ Part67
・【BnS】ブレイドアンドソウル 質問スレ Part24
23:18:49 up 22 min, 0 users, load average: 4.78, 4.73, 3.71
in 0.42543506622314 sec
@0.42543506622314@0b7 on 011313
|