[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/09 14:54 / Filesize : 339 KB / Number-of Response : 1038
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part51



1 名前:デフォルトの名無しさん [2017/11/08(水) 11:26:30.13 ID:+KUB1/9hd.net]

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※関連スレ
VBAなんでも質問スレ Part2
mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/

※前スレ
Excel VBA 質問スレ Part50
mevius.2ch.net/test/read.cgi/tech/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


2 名前:デフォルトの名無しさん [2017/11/08(水) 11:28:45.81 ID:+KUB1/9hd.net]
早速質問
今vbaでマップ使って
とある表の集計を行なっております
一つのkeyに対しアイテムが複数あるので
配列で入れようと思ったのですがうまくいきません
何か良い方法はありませんか?

3 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:45:21.53 ID:oD3+O0e3E.net]
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)

4 名前:デフォルトの名無しさん [2017/11/08(水) 19:49:47.05 ID:aX63wCUb0.net]
前スレ
Excel VBA 質問スレ Part50
https://mevius.5ch.net/test/read.cgi/tech/1503805217/

5 名前:デフォルトの名無しさん [2017/11/08(水) 20:24:39.43 ID:VRSOCYqCd.net]
マップをやめて配列「で」入れる
って意味にとってたけど
マップの中に配列「を」入れる
って意味かよ

6 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 13:04:15.65 ID:W66xKF5F0.net]
アイテムが複数あっても同じkey 使えばいいんじゃねと思った

7 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 14:39:20.19 ID:goVr3jSD0.net]
集計をしたいって事じゃない?

8 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 20:19:01.12 ID:HS5Oh82mM.net]
>>6
やってみてから発言することをお勧めする

9 名前:デフォルトの名無しさん [2017/11/09(木) 20:29:22.40 ID:7b9amfpv0.net]
いい言葉を見つけた
Those who know don't talk. (知ってる人は教えようとしない)
Those who talk don't know. (教えてる人はあまり知らない)

10 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 21:19:05.18 ID:F89uizh+0.net]
立て乙です。
自宅にエクセル環境が無いのでうろ覚えで
細かい間違いはあるかもですが、該当箇所以外は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"

のどちらでも動きました
ブックもシートも両方変数で指定するとエラーになってしまうのでしょうか?
ブックもシートもそれなりに切り替えるので、可能であれば別で指定したいのですが……
心当たりがあればご教示いただけると助かります。



11 名前:デフォルトの名無しさん [2017/11/09(木) 21:25:44.32 ID:7b9amfpv0.net]
>>10
× Bn.T.cells(1,2) = "456"
○ T.cells(1,2) = "456"

オブジェクトの操作は慣れが必要だけど、こういうもんだと思っておくれ

12 名前:デフォルトの名無しさん [2017/11/09(木) 22:48:42.62 ID:5mp2zjAU0.net]
>>10
Bn.Tだと
workbookオブジェクトにTって言う属性や関数が無いからエラーになるのは当たり前

13 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 23:25:52.19 ID:r1UnXx8k0.net]
>>10
> Set Bn = Workbooks("日本")
> Set T =Worksheets("東京都")
ここは
Set T =Bn.Worksheets("東京都")
って書くべき

14 名前:10 mailto:sage [2017/11/09(木) 23:38:24.62 ID:F89uizh+0.net]
返答ありがとうございます。

やっぱり両方同時に変数指定はできないんですね……
何というか、指定先が変わる度にセットするのは見づらいような感じがしてまして

明日何とか考えてみようと思います。ありがとうございました

15 名前:デフォルトの名無しさん [2017/11/09(木) 23:57:00.50 ID:3LOjlHPk0.net]
  ●●●宇宙の外側に何があるのか?●●●
  jbbs.livedoor.jp/bbs/read.cgi/stud▲y/3729/1069922074/84-87

  この掲示板(万▲有サロン)に優秀な書き▲込みをして、総額148万円の賞金をゲットしよう!(*^^)v
  jbbs.livedoor.jp/stu▲dy/3729/ →リンクが不良なら、検▲索

16 名前:窓に入れる! []
[ここ壊れてます]

17 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 00:13:48.87 ID:anK9LaNF0.net]
>>10
名前(Workbooks)が一致していればいいってものじゃない。
オブジェクト.メンバ という構文なんだよ。メンバとはそのオブジェクトが持っているメソッドとかプロパティとかのこと。

しかし Bn.T と書くと、オブジェクトとオブジェクトを . で繋いだことになり、これは意味不明なものになる。

18 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 02:06:21.33 ID:HkDX0vBax.net]
コレクションかユーザー定義クラス使うかしたらいいと思うが

19 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 02:16:45.89 ID:HkDX0vBax.net]
>>16
質問者はオブジェクト.メンバの構文の意味が分かってなくてオブジェクトブラウザも見たことない人なんだろうな

オブジェクトのメンバ名を指定してメソッド関数やプロパティ関数を呼び出すことで別のオブジェクトインスタンスのコントロールを取得しているんだってことが理解できてないんだろう

20 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 10:37:51.15 ID:3nhwt3Be0.net]
>>10
>T.Worksheets("東京都").cells(1,2) = "456"
これホントに動いたのか?
WorksheetにWorksheetsプロパティとか無かったはずだけど

何がやりたいかよくわからんが
とりあえずブック名とシート名受け取って該当Worksheet返す関数作ればいいんじゃないかと



21 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 12:27:51.12 ID:VovrPQN6d.net]
ワークシートchangeでtargetのA1が代わったらコードが流れるようにしてて、それ以外はexitで抜けてるんだけど、コードがセルに転記してて毎回changeの所に戻ってはexit、戻ってはexitで見辛いのはなんとかなりませんか?

22 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 13:11:21.32 ID:ooNCyCJx0.net]
>>20
マクロの実行中に何度もセルに書き込みが発生する処理が美しくないので設計を見直す。

23 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 13:45:49.16 ID:Fw2iLfOX0.net]
作った人に聞いてみたら?

24 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 17:25:45.54 ID:6gcbKBqNp.net]
EnableEvents=False
でイベント制御したらだめなの?

25 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 18:26:04.03 ID:DKnywXcl6.net]
SolverOk関数のEngineまたはEngineDescの引数の規定値って何でしょうか?

26 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 03:04:03.09 ID:pW9oGH+o0.net]
>>24
俺の使ってるバージョンだとその引数が無いっぽいから分からんけど
オブジェクトブラウザで表示させれば分かるんじゃね

27 名前:デフォルトの名無しさん [2017/11/11(土) 08:36:27.60 ID:Smy5DbHD0.net]
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) ←←←★

28 名前:デフォルトの名無しさん [2017/11/11(土) 09:03:00.19 ID:Smy5DbHD0.net]
>>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.Parse

29 名前:Name(Target), 0) []
[ここ壊れてます]

30 名前:デフォルトの名無しさん [2017/11/11(土) 12:39:17.23 ID:KQr/r2/c0.net]
エクセル2013を使用しています。
今、日付を手入力しているのですが、何かで見たのですが
カレンダーから選択して入力できる機能があるのですがエクセルでもできる方法ないでしょうか?
いろいろさがした所アクセスはできるのですがエクセルは標準でもなく
カレンダーコントールなるものあるみたいですが、アクセスもインストールしていないので
VBAマクロの中にもありません



31 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 14:37:40.42 ID:iMxfLIL8a.net]
>>14
両方同時にではない。
Worksheetを変数に入れたということはブック情報も込みで入ってる。
だから便利なの。

Aブックのαシートを変数に入れてもその変数でBブックのαシートにアクセスできるわけじゃない。
君のBn.T式のやり方だとBブックのαシートにもアクセスできることになる。
それはBn.Worksheets(T)式と変わらない。
一方、もしBブックのαシートにアクセス出来ないのならBn.T式の意味が無い。
T式で良いわけだから。

32 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 15:59:40.18 ID:D533txsCa.net]
>>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)

33 名前:デフォルトの名無しさん [2017/11/11(土) 16:02:23.93 ID:vmoy6u3Z0.net]
参照設定は極力しないほうが良いよね
参照設定を忘れてドハマリすることがたまによくある

34 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 16:04:50.69 ID:D533txsCa.net]
>>28
エクセルでも出来るんだけど非常に上級者向けなんです。
上級者でも自分で1から組めない人が多いんじゃないかと思う。

上級者って何?、お前の勝手な分類だろって言われればそうなんだけど。

35 名前:デフォルトの名無しさん [2017/11/11(土) 17:24:06.37 ID:vmoy6u3Z0.net]
>>28
エクセル アドイン カレンダー
で検索すれば色々見つかるよ
使いやすいもの選べばよろし

36 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 05:18:36.72 ID:Dmy+tyrb0.net]
>>28
UserForm使えば簡単に自作できますよ。
年と月用のテキストボックスをつけて、年と月それぞれ増減させるために、スピンドルボタンをつける。
日付表示用のラベルを必要数用意。
年と月のテキストボックスの値に応じて、ラベルの表示を変更。
ラベルのクリックイベントで、年と月のテキストボックスとラベルのテキストを連結して、日付に変換。

ラベルのクリックイベントは、クラスでまとめれば、クリックイベントをたくさん書く必要もありません。

37 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 06:52:57.92 ID:UfHz6itl0.net]
スピンボタンな

38 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 11:00:33.46 ID:61FaOR6Wd.net]
コードっていろんなパターンあってたくさん書いてると思うんだけど、コードの保管ってメモ帳??

39 名前:デフォルトの名無しさん [2017/11/12(日) 11:17:54.47 ID:QqFg5+2e0.net]
>>36
エクスポートできるよ
gitとかsubversionとか使えばいい

40 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 11:23:55.96 ID:61FaOR6Wd.net]
連投すまんが、セルを方眼紙にして、フォームの中に直線コマンド、円コマンド、角コマンド等CADみたいなそれぞれ押したらそれが、反映されて作画って出来る?



41 名前:デフォルトの名無しさん [2017/11/12(日) 11:28:28.89 ID:QqFg5+2e0.net]
>>38
できるかできないかで言うと出来る

各図形の位置に当るセルの背景色を変えれば良いだけ

42 名前:デフォルトの名無しさん [2017/11/12(日) 12:15:44.63 ID:chRcmei30.net]
>>36
ブログ作ってそこによく使うコードを置いてある
いつでもどこでも検索すれば出てくるので非常に便利

43 名前:デフォルトの名無しさん [2017/11/12(日) 12:16:32.95 ID:chRcmei30.net]
>>38
できるけどかなりめんどくさい
cacooとか既存サービス使った方が良いと思う

44 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 17:01:38.36 ID:eJwcw8mO0.net]
>>34
簡単じゃないだろw
しちめんどくせーよ

45 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 17:02:12.03 ID:eJwcw8mO0.net]
>>36
モジュールをそのまま保存できるだろ

46 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 18:22:11.84 ID:syzs4wk80.net]
>>42
他に手軽な方法がないからUserFormで作れるようにしておくのが一番いいぞ。

47 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 18:36:30.88 ID:eJwcw8mO0.net]
>>44
まあそれしかないのはそうなんだけどさ

48 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 20:02:01.58 ID:Dmy+tyrb0.net]
vbのランタイムをインストールすればDateTimePicker使えるけど、Formでカレンダー自作しておけば簡単に使い回したり配布出来るから一個作っておくといいと思いますよ。

49 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 22:30:08.29 ID:XHSQB0UC0.net]
フォルダ1
┗XXX29年10月.xlsx
 XXX29年11月.xlsx
 YYY29年10月.xlsx
 YYY29年11月.xlsx
フォルダ2
フォルダN

フォルダ1内に今月のファイルがあったらコピーして名前を翌月に変更して保存
これをフォルダNまで同じように処理する方法教えてください

年月の取得はユーザーフォームが理想ですが全く分らんので
マクロ実行用ファイルのA1に年、A2に月入力して取得する感じを考えてます

50 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 23:03:42.29 ID:eJwcw8mO0.net]
>>47
今月のファイルを探したいならDate関数使えば今日の日付が出るからそっからformatなりyearとmonthくみあわせるなりで取得すればいいからわざわざ入力させる必要がないね
フォルダないのファイル名の取得ならググればいくらでも出てくるぞ
俺はfilesystemobjectを使うけど



51 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 23:12:47.43 ID:UfHz6itl0.net]
>>47
まずは最初の部分だけ

今年 = Format(Now, "e")
今月 = Month(Now)
来月 = DateAdd("m", 1, Now)
年 = Format(来月, "e")
月 = Month(来月)

52 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 23:16:31.66 ID:UfHz6itl0.net]
変数に残す必要なかった
今月 = Format(Now, "ee年mm月")
来月 = Format(DateAdd("m", 1, Now), "ee年mm月")

53 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 00:50:26.46 ID:cup53tTa0.net]
どうしてもカレンダー欲しいんだったらSysDateTimePick32使って頑張るだろうな。
面倒くさいけど他のコントロールもMSFormsを使わないウィンドウ作成もやったことある。
きちんとプロパティ作るの面倒くさいから使いたいものしか実装してないけど。

54 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 00:58:21.51 ID:cup53tTa0.net]
>>48
ファイル名取得にfilesystemobjectは激重だった気がする。
Dir関数で頑張る方がよっぽど速い。

これが原因でfilesystemobjectは使わなくなってしまった。
他では速いものもあるのに食わず嫌いになった。

55 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 01:02:34.35 ID:AtJ4gbq1x.net]
>>52
処理対象のファイルのロングパスがDirの引数の字数制限を越えてるときはどうするの?

56 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 06:21:29.66 ID:gczEvEcT0.net]
そもそも劇重なんて思ったことないが...

57 名前:デフォルトの名無しさん [2017/11/13(月) 08:01:19.66 ID:4dN82Cnsd.net]
なんか別のものと勘違いしてるんじゃないか

58 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 08:26:57.35 ID:pr331NCP0.net]
たかがファイル名を取得するのに処理負荷を感じるほど重くなるとか考えられないな。
読み取り先が等速ドライブに突っ込んだCDだったとか、回線の細いNASだったとかなら分かるけど。

59 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:22:13.43 ID:mbcSFLNRa.net]
>>52
クラスにして使いやすくしてるならDir関数でもいいと思うけど生で使う気は更々起きねーなあれは
めんどくさすぎる
早い遅いは環境次第だろう
何をしようとしたか知らんが

60 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 12:42:29.30 ID:IBZYfbeXM.net]
またVBAでクラス語る奴が来ちゃったよ...



61 名前:デフォルトの名無しさん [2017/11/13(月) 12:44:49.20 ID:U+ZWq00Pa.net]
なんかWindows10でマクロの挙動が安定しなくなったんだけど、そういうのある?

62 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:17:08.13 ID:GJIgK8HXa.net]
>>58
語ってるつもりはないし、普通に機能としてあるのに使ってバカにされる筋合いもない

63 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:21:12.07 ID:ck+reS0/0.net]
vbaでクラス使うメリットあるの?
一応あるインターフェースは使い物にならないし、継承も使えないし、コンストラクタに引数も設定出来ない。
vbaでクラス使うメリット教えて

64 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:21:56.90 ID:GJIgK8HXa.net]
>>61
カプセル化

65 名前:デフォルトの名無しさん [2017/11/13(月) 13:43:14.72 ID:4dN82Cnsd.net]
>>61
たまにある
単体の処理してる間だけじゃなく、しばらくの間は状態を持っててほしいとき
ごく素朴な使い方しか出来ないし、しようとも思わないけど

66 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:48:11.54 ID:GJIgK8HXa.net]
というか、クラスを使うデメリットって逆に何

67 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:52:55.00 ID:HKnEhqdPd.net]
そもそもクラスが必要になるほど大規模なコードを書く用途にVBAは向いてない、使うべきじゃない

ちゃんとした開発環境を使え
会社が許可しないなら転職するか我慢するかの二択、あるいは出世して自分で規則を変えろ
仕事の能率がアップして利益が増えるんなら反対する理由はないだろ

68 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 15:44:46.11 ID:XD2Cv4t70.net]
自分の好きなコードが書けないから転職とかww

69 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 15:54:24.73 ID:IBY/CNJo0.net]
不合理なことを押し付けてくる会社なら、転職も選択肢ってことだろ。日本語ダイジョブ?

70 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 16:07:38.26 ID:pr331NCP0.net]
クラスを使うとシンプルに表現出来る場合がある。規模の問題では無い。
普通に使ってるとなかなか活用するイメージが湧かないけど、覚えておくと役に立つよ。



71 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 17:08:14.63 ID:GJIgK8HXa.net]
ここでも前に書いたけど、配列のラッパークラスとか、一度作ると便利よ
コレクションだと微妙に取り回し悪かったりするからね
これ以上はスレチかな

72 名前:デフォルトの名無しさん [2017/11/13(月) 17:09:30.17 ID:4dN82Cnsd.net]
>>68
そうだよね

ただ、いちいちクラスモジュールを追加しなきゃならないから、使い捨てクラスをほいほい定義しづらい

73 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 17:20:46.73 ID:78YzXPYPa.net]
FileSystemObjectのファイル一覧取得が遅いのなんて結構有名な話だと思うんだが。
ハードディスクにあるファイル名全部取ってくるとかすれば分かる。



74 名前:、どっかに比較してる所が有ったんだが見つからないな。
Win32APIが一番速かったがDirでもそんなに大きな違いは出なかった。
が、FileSystemObjectは糞遅い結果になってた。
そもそも自分で組んだら遅くてネットで調べたらやっぱり遅かったという。
[]
[ここ壊れてます]

75 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 17:23:43.47 ID:78YzXPYPa.net]
クラスは凄く便利だが、無理に使う必要は無いと思う。
個人的には仕様を考えた段階でクラス使うのがぴったりと感覚で分かる。
そういう時以外は使わない。

76 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 17:47:02.85 ID:GJIgK8HXa.net]
>>71
そうなんか
まあ、今んとこそんな大量のファイルのやり取りしたことないから体感したことなかったわ
まあ、その辺使うにしても生で扱うよりクラスでまとめちゃった方が取り回し良さそうだがね
その辺は好みなんだろうけどね

77 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 18:55:14.32 ID:IBZYfbeXM.net]
>>64
まともな言語ならクラスを使うデメリットはないけどVBAのクラスは制限が多すぎて使う意味がない

78 名前:デフォルトの名無しさん [2017/11/13(月) 19:08:08.64 ID:wM5leOdq0.net]
>>59
bit数の関係で安定しなくなったことはある

>>61
多分、ない
class使ったほうが見通しがよくなる場合はあるけど、
正直そんなに変わらんというか、めんどくさくなるだけの場合が多い気がする

79 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:27:40.19 ID:qqs7mRHsj]
この流れで突然クソみたいな質問するの恐縮なのですが…
共有で使っている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

80 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:36:08.79 ID:S878v5EG0.net]
この流れで突然クソみたいな質問するの恐縮なのですが…
共有で使っている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



81 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:42:36.96 ID:zsNLMe3/0.net]
シート保護かけてみるとか

82 名前:デフォルトの名無しさん [2017/11/13(月) 21:45:59.98 ID:wM5leOdq0.net]
>>77
ウィルスに感染していて、セキュリティをsageているためにウィルスが実行されているというパターンなら考えられるが
其れ以前の問題として
・オートフィルタをかける
・全体をコピー
・ペースト(値として貼り付けなど)
で行が減っている可能性のほうが高いと思う
この仕様
、意外と知られていないんじゃないかなぁ

83 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 22:24:58.44 ID:S878v5EG0.net]
>>79
それって別のシートやブックに貼り付けるときに可視セルだけ貼り付けられているという意味ですか?
別のブックやシートにコピーする事は無いと思うので可能性としては低い気がします…
試しにオートフィルタしながら同じシートに

84 名前:貼り付けようとしたら「コピー領域と貼り付け領域が違うため貼付できません」となりました []
[ここ壊れてます]

85 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 22:25:14.14 ID:GJIgK8HXa.net]
>>77
まあ、自作マクロでウィルスどうこうはあり得ないわ
コード見る限りでも、フィルターかけてるだけで値の操作はしてないしな
まあ、フィルターかけっぱなしにならないようにブッククローズ時にフィルター解除すれば?

86 名前:デフォルトの名無しさん [2017/11/13(月) 22:28:52.42 ID:wM5leOdq0.net]
>>80
>それって別のシートやブックに貼り付けるときに可視セルだけ貼り付けられているという意味ですか?
そう
>別のブックやシートにコピーする事は無いと思うので可能性としては低い気がします…
そか

オートフィルタならまずこれかなーと思ったけど、コピーペーストしてないなら違うかな

87 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 22:30:45.38 ID:GJIgK8HXa.net]
フィルターで謎のデータ消失なら質問者の疑念通りフィルターかけたまんま範囲削除じゃねーかな

88 名前:デフォルトの名無しさん [2017/11/13(月) 22:32:36.92 ID:wM5leOdq0.net]
実際のコード上げたほうがいいかもねぇ

89 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 22:46:30.32 ID:S878v5EG0.net]
ありがとうございます
コードがおかしいわけじゃないなら良かったです
一応ここに貼ったコードはAAの部分に別の単語が入ってるだけで他は全て実際に使っているものと同じです
クローズ時にフィルター解除するようにはしてなかったのでやってみます

90 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 09:16:46.87 ID:8wZuibTmp.net]
インターネットが壊れた!みたいなのはやめてください!



91 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 09:53:14.55 ID:tqdP1JBma.net]
エクセルの特定の行だけ消すウイルスとか笑えるわ
まあ、バグ満載のマクロとかある意味ウイルスだけど

92 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 11:29:31.52 ID:G7+v7Fl70.net]
ウィルスは簡単に作れるだろ。
リテラシー無い奴が増えたからウィルスとは何ぞ?という議論が必要かも知れんが。
ただ、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アドインに移行中。

93 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 11:36:59.15 ID:JNyIRsqMM.net]
隙あらば自分語り

94 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 12:24:48.16 ID:vavtQv330.net]
長文はスルーで

95 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 12:38:00.31 ID:Tcgv7xMn0.net]
コンピュータウィルスって「操作している人間の意に沿わない動きをするプログラム」だったと思ったんだけど、
いつの間にか定義が変わったのか。

CDトレー開いたりマウスをランダムに動かすジョーク系もウィルスだったはずだから>>77のもウィルスと言っていいと思ったんだが。

96 名前:デフォルトの名無しさん [2017/11/14(火) 12:42:08.62 ID:dN7NjwRxp.net]
>>91
その定義だと世の中のあらゆるソフトはウイルスになるんじゃね

バグはあるからな
AndroidやiOSもウイルスになる

97 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 13:07:49.89 ID:5gpUPtII0.net]
>>91
その定義だとワームやトロイの木馬とウィルスが区別できないわけだが
いくら今だとより広義に使われるとはいえ
>>いつの間にか定義が変わったのか
はそのままお前に返してやるよ

98 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 13:09:39.12 ID:Tcgv7xMn0.net]
>>92
バグは確か「論理的に正しくない結果を

99 名前:もたらす何か」みたいな定義だったと思う。
マシン内に虫が侵入して電気的にショートするのが語源だしね。

同じ定義で使い続けるとバグとウィルスがあやふやになるというのは時代の流れだなぁ。
[]
[ここ壊れてます]

100 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 13:16:31.95 ID:Tcgv7xMn0.net]
>>93
ワームもトロイの木馬も、元々はコンピュータウィルスを感染させるテクニックというか、
媒介手順だったはずがいつの間にか独立してウィルスの親戚みたいな扱いになってるよなぁ。



101 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 14:03:33.75 ID:5gpUPtII0.net]
>>95
もともと、「感染」しないものはウィルスじゃない
いつのまにか独立したんじゃなくて、初めからちゃんと別物でちゃんと区別されていたんだが
いつのまにかまとめてウィルスと呼ばれるようになったんだ
今じゃマルウェア全般が広義にウィルスって言われる始末

バグは語源は諸説あるが、作成者の意図にそわない動作
ウィルスは作成者の意図にそった動作するプログラム
いくらなんでもそれを混同しないでくれ

102 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 17:57:06.04 ID:Tcgv7xMn0.net]
>>96
だからトロイの木馬もワームも単体ではウィルスじゃなかったんだよ。
言うなればコンテナみたいなものなんで、トロイの木馬型のパッチプログラムとかも可能だし。

たぶん想像している「定義づけられた時期」が違うせいで食い違ってるだけだな。

103 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 17:58:22.04 ID:MC75ktwb0.net]
もうやめよう

104 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 10:46:14.78 ID:PQCfnSyv0.net]
>>97
???
自己増殖しなきゃウィルスじゃない。
トロイもワームもウィルスじゃねーだろ。

105 名前:デフォルトの名無しさん [2017/11/15(水) 12:15:18.42 ID:l7NNgtZ+d.net]
プログラミングによる業務自動化絶対阻止マンがいて、ウィルスだろうがワームだろうが
題目はなんでもいいから邪魔しようとしている

という妄想をした...
...疲れているようだ

106 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 12:24:36.36 ID:CIMTn4iP0.net]
vbaが駄目なら関数でやればいいじゃない

107 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 12:41:18.42 ID:PQCfnSyv0.net]
いや、だからApplication.VBE系の実行を拒否する設定にしておけばOK。
普通はそうなってる。
マイクロソフトも散々懲りたということだろう。

Accessはそうなってないから危険だけど、どっちにしろアンチウィルスソフト入れたり、それなりに敏感ならまあ大丈夫だろう。
メールに添付されたファイルを何も考えずに開くようなバカのいる所はそもそもコンピュ−タ使うなって話。

108 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 15:25:25.16 ID:PmECE2vTd.net]
Excel2010からExcel2013にしたら「ライブラリが見つかりません」というが発生しました。
他のPCで作成したExcelファイルを開こうとしたら上記のようなエラーが発生したのです。
Excel2010の時も参照設定は参照不可になっておりましたがExcelに記載されているデータを
参照するだけでVBSは動かさないのでExcel2010ではエラーになりませんでしたが、Excel2013
ではファイルを開いた際に「ライブラリが見つかりません」というエラーになります。
これはExcelに開いた際に参照設定のチェックをしないみたいな設定があるのでしょうか?

109 名前:デフォルトの名無しさん [2017/11/15(水) 17:08:22.00 ID:MYmTne2b0.net]
>>103
説明がひどいなw

110 名前:デフォルトの名無しさん [2017/11/15(水) 20:25:36.13 ID:m2725R1N0.net]
vbeのツールのライブラリファイルって実体はなになんですか?参照不可になったりしますが
オブジェクトエクスプローラのライブラリともちがうし



111 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 21:27:06.93 ID:BuHcCqTIx.net]
>>103
VBSとオブジェクトライブラリに何の関係があるんだ?

112 名前:デフォルトの名無しさん [2017/11/15(水) 23:13:12.29 ID:gnIues9e0.net]
メモリリークはVBAでどう対処すればいい?
巨大なファイルクローズ後にまるまんまリークするのですが

113 名前:デフォルトの名無しさん [2017/11/15(水) 23:18:44.71 ID:R7mLmomD0.net]
巨大なファイルは
・作らない
・分割する
・変換する
・開かずに読み取る
・csvならテキストとして読み込む
この辺

メモリリークはある意味どうしようもないので前提からどうにかしないと解決しない

114 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 23:25:33.43 ID:gnIues9e0.net]
>>108
ありがとう。思い当たるのもあります。
・開かずに読み取る
 これ、できるんですね。調べてみます

115 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 02:14:21.20 ID:Og9f/0gn0.net]
俺なら読み取り専用で一部だけ読んで閉じる

116 名前:デフォルトの名無しさん [2017/11/16(木) 12:25:39.51 ID:NqwHUE6Zr.net]
>>107
それはメモリリークではないので気にする必要はありません

117 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 11:56:05.53 ID:8RvIbz6z0.net]
巨大なファイルをSSDのHDDに移すと速いんじゃね

118 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 11:57:22.13 ID:8RvIbz6z0.net]
HDDってかいたけどHDDじゃないけどな

119 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 12:27:16.57 ID:OabwNEEsd.net]
SSDのHHDのFFD

120 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 17:41:51.06 ID:1LBcgp5Vd.net]
VBAで原価計算してる人いる?



121 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 20:16:29.56 ID:Iig4V4n+H.net]
Dir関数で末尾$のフォルダを確認するとエラーになる。
(配下のフォルダはエラーにならない)
これ、どんな理由でしょうか?

122 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 00:56:48.74 ID:lwdaQlHz0.net]
>>116
なぜエラーの内容を書かないのか

軽く試した範囲ではエラーにならないな
環境とエラー内容と、実際にエラーになるコード晒せ

123 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 12:07:28.26 ID:+9+JGsY3H.net]
>>117
ですよね。すんません。
'Case NG
?Dir("¥¥Svr¥Share$", vbDirectory)

'Case OK
?Dir("¥¥Svr¥Share$¥Sub", vbDirectory)

アクセス権は親フォルダから継承していますので双方UNCアクセス可能な状態です。Domain Admins権限で実行しています。
GetAttrの戻りは双方 16 です。
共有名に$をつけない場合は発生しないように見受けられます、、、
と、思ったのですが、$の有無ではなくて、共有フォルダ自体を指定すると発生するようです。
エラーは、52: ファイル名または番号が不正です。となります。

ご教示お願いします。

124 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 12:11:55.49 ID:+9+JGsY3H.net]
>>117
環境は、
2008Server
Win7Pro/Excel 2010@vmware 5.4.0
です。

125 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 13:20:32.42 ID:+9+JGsY3H.net]
>>117
末尾を"¥"で終わらせるとエラーにならないことがわかりました。でも戻りが "." になります。わからなくもないですが "Share$" を期待していたので、、
どう解釈すればいいのでしょうか。
(Dir を使う際は末尾 "¥" を励行したほうがいい?)

126 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:21:41.22 ID:lwdaQlHz0.net]
UNCパスでそこは共有名であってフォルダ名じゃない気がするが

127 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:56:31.65 ID:HVgorTjE0.net]
すいません wordのVBAです。 画像貼りつけて文字列の折り返しを背景にするのに下記では2行目で
描画の対象とならないオブジェクトが選ばれているためにtypeメソッドまたはプロパティは使用できません。
となりますが、どうしたらよいですか?

Selection.InlineShapes.AddPicture FileName:="a.jpg", SaveWithDocument:=True
Selection..ShapeRange.WrapFormat.Type=wdWrapBehind

128 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 19:38:08.85 ID:+9+JGsY3H.net]
>>121
なんかややこしいですね。
共有名に "¥" をつけて初めて共有フォルダのルートフォルダとして認識される、と覚えておくことにします。

129 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 22:21:46.28 ID:+9+JGsY3H.net]
立て続けにすんません。
onAction の引数について、全角英数記号が半角に解釈されて実行されてしまうのは既知の仕様でしょうか?
ひらがなカタカナは被害を受けないようです。
CommandBars.ActiveControl.Caption
CommandBars.ActiveControl.OnAction
あたりで変換前の文字列を救出できるようですが、、根本的対応はないのでしょうか。
上記で躓いてしまい、公式で情報をみつけられなかったもので、、

130 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 10:05:19.39 ID:M3mw+ZdH0.net]
>>122
まずさ、Selection使うの辞めようぜ。
Hoge.Select
Selection.Fuga
という形が有ったらたいてい
Hoge.Fuga
という形にできる。

つまりね、大抵は選ぶ必要がない。
ある程度書ける人は選ぶ処理をいかに無くすかを考える。
そうすればApplication.ScreenUpdating=False使っても
速度が変わらなくなる。
ちらつき防止のために使うのが有用なのは変わらないんだけど。
.Selectを使うのはユーザーに明示的に場所を示す場合と、
本当にどうしようもない場合がごくまれにあるだけだ。

オブジェクトブラウザでShapeRangeとかWrapFormatを
調べてそこに何が(型)期待されてるかを調べる。
後は合わせれば良いだけだ。



131 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 10:10:14.58 ID:M3mw+ZdH0.net]
>>124
"OnAction" "全角"でググると結構出てくるね。
コメント以外で日本語使うこと無いから遭遇する事無かったわ。

132 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 11:46:20.87 ID:JvH46D6m0.net]
>>125
>.Selectを使うのはユーザーに明示的に場所を示す場合と、

「ユーザーが明示的に選択したオブジェクトを処理する場合」も追加願います

133 名前:デフォルトの名無しさん [2017/11/19(日) 11:56:21.06 ID:aexN4+ic0.net]
追加願いますって何を言ってるんだ???

134 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 12:23:26.42 ID:JvH46D6m0.net]
>>128

>>125
>.Selectを使うのはユーザーに明示的に場所を示す場合と、
>本当にどうしようもない場合がごくまれにある 「だ け」 だ。

と言ってるから、もう一つのパターンもあるよ、と言ってるわけだが?

135 名前:デフォルトの名無しさん [2017/11/19(日) 12:30:59.55 ID:aexN4+ic0.net]
select使わない理由は誤作動の原因になるからの方が多いんじゃないか
もちろんパフォーマンスも大きく変わるけど、言うほど変わらない
それよりもコード上、何のブック、シートがactivateになっているかを把握する方が遥かにめんどくさい

136 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 12:55:38.95 ID:YlgcavI50.net]
作ってるものが偏っているからActiveSheetやSelectionを使う機会がないだけで、
もっと操作補助的な面の強いマクロなら使う場面もあるかもしれない。

137 名前:デフォルトの名無しさん [2017/11/19(日) 12:57:36.65 ID:aexN4+ic0.net]
確かにコードの最後にcells(1,1).selectはよく書くけど、それ以外のselectは>>125の通り「本当にどうしようもない場合」だけだな
オートシェイプかなんかでsetできなかったような、忘れたけど

138 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:53:20.81 ID:wFQIPa4T0.net]
IOと純粋関数部分を分けるようにと、Hな言語から学んだよ。

139 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:59:20.49 ID:ZK6mPT5SM.net]
>>131
> もっと操作補助的な面の強いマクロなら使う場面もあるかもしれない。
まあそれが
> .Selectを使うのはユーザーに明示的に場所を示す場合と、
> 「ユーザーが明示的に選択したオブジェクトを処理する場合」
なわけだが

140 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:16:58.30 ID:M3mw+ZdH0.net]
>>130
誤動作とか以前に無駄なことをしたくないという自然な考えがある。
Cells(1,1).Select
Cells(1,2).Select
Cells(1,1).Select
と書かれてたらなんじゃこれと思うだろ。

マクロの記録は操作を自然に記録してしまうけど、
やりたいことはそれじゃない。
それにコードも汚くなって読みたくないものになる。



141 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:18:58.83 ID:8D87jpDPa.net]
ユーザーが明示的に選択したものに〜
ってのもぶっちゃけ運用の問題の気もするが
マクロ化の範囲にもよるんだけども
可能な限り避けるべきってのは正しいでしょ

142 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:16:48.30 ID:JvH46D6m0.net]
>>136
>可能な限り避けるべきってのは正しいでしょ

そうなの?
実際それをやることは少ないけど、別に避けてるわけじゃないな。
「ボタンを押すと、選択しているセルの書式を〜する」なんて処理はたまにある。

143 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:30:54.95 ID:SAgRzZs9a.net]
ユーザーが明示的に選択したものに処理を与えるってのはアリだとは思う。
でもそれはHoge.Selectでは無くてSelectionを使う場合だよね。

144 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:35:35.45 ID:JvH46D6m0.net]
>>138
なるほど

最初のきっかけとなった>>125の1行目が、
>まずさ、Selection使うの辞めようぜ。

だったからずっと Selection のことを語っていた

145 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:48:04.11 ID:lBNHVI9l0.net]
>>136
優先順位の問題でしょ
> ユーザーが明示的に選択したものに〜
って言う仕様の方が
> 可能な限り避けるべき
より優先されるのは当たり前

146 名前:デフォルトの名無しさん [2017/11/19(日) 17:50:02.84 ID:aexN4+ic0.net]
>>138
あぁそれはアリ
会社によっては多用するだろう

147 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:49:12.88 ID:eK6D85VJ0.net]
wordのマクロ組んでる人おらんのかな?

148 名前:デフォルトの名無しさん [2017/11/19(日) 21:18:16.41 ID:aexN4+ic0.net]
>>122>>142
そもそもwordを使わない

あととりあえず動くコードを書いてくれ
Selection..ShapeR
ピリオドがニコあって邪魔

で、差し込んだ画像の文字列の折り返しってのが何がしたいのか良く分からん
テキストボックスなら分かるしそれで通るけど

149 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:23:25.50 ID:eK6D85VJ0.net]
>>143 画像のレイアウトで背面にしたいんですよ。 なんかしらんけど動いて、なぜか前面で貼りつけられました。
なんかEXCELと勝手が違いますぬ・・・。

150 名前:デフォルトの名無しさん [2017/11/19(日) 21:27:01.10 ID:aexN4+ic0.net]
>>144
エクセルと勝手が違うんじゃなくて、ただただ猛烈に使いにくいだけ
で、上手く行ったので質問は終了ってこと?



151 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:31:31.01 ID:eK6D85VJ0.net]
>>145 とりあえずは。 また多分色々とお伺いすることになると思いますが、

なにとぞよろしくお願いいたします。

152 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 22:32:44.41 ID:Z3cAV0my0.net]
wordはスレ違いだけどな
あんまりvbaと親和性もないし
あくまで文書ツールだからな

153 名前:デフォルトの名無しさん [2017/11/19(日) 22:50:31.56 ID:1/mWyqVE0.net]
おいおいExcelかてただの文書ツールやぞw

154 名前:デフォルトの名無しさん [2017/11/19(日) 22:56:21.06 ID:aexN4+ic0.net]
>>148
釣りはほどほどに

155 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 23:23:51.19 ID:lBNHVI9l0.net]
文書ツールとしてExcel使う奴はたくさんいるけど w

156 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 08:54:30.90 ID:6BLE5ZLY0.net]
>>146
まず君が貼り付けたのは何かを考えよう。
マクロ記録が示すコードを見れば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だったな。
何のオブジェクトを触ってるのかはっきりさせずに組んでるからエラーの意味も分からない。

157 名前:デフォルトの名無しさん [2017/11/20(月) 12:21:51.39 ID:phW/Gatbr.net]
>>150
そらそれが本来の使い方やもの
なに勘違いしてニヤニヤしとんねんお前
気色悪い奴だな

158 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 13:11:30.03 ID:tncAZsVja.net]
>>152
Jカスこんなところでも下らねー釣りしてんじゃねえよ

159 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 15:08:27.78 ID:6BLE5ZLY0.net]
WordVBAで使いにくいのは記録出来ても良さそうなものが記録出来ない所。
ただ、これはこっち

160 名前:ェ出来ても良さそうと勝手に思ってるだけでMS的にはまずい何かが有るのかもしれない。

それよりも困るのは
Debug.Print Typename(hoge)
とやってSelectionが帰ってくる所。

型を知りたいのにSelectionは無いだろう。
[]
[ここ壊れてます]



161 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 17:44:20.81 ID:PC8rzjhFa.net]
>>154
型名調べる関数もうひとつあったよね
あんま使わんから忘れたけど

162 名前:デフォルトの名無しさん [2017/11/20(月) 19:16:12.47 ID:3EUEsxu/0.net]
>>154
笑ったw

163 名前:デフォルトの名無しさん [2017/11/20(月) 19:56:44.52 ID:HiJj2X0L0.net]
>>154
? typename(hoge)とやったら
Emptyと出てきたぞ。
あなた↓の頭と同じでカラッポ。

164 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 21:46:53.19 ID:dynAF7sP0.net]
>>151 ありがとうございます。 じつはそれで解決しました。
マクロで記録したらinlineshapeで、なんやねんこれ?と理解していなかったことが原因でした。

165 名前:デフォルトの名無しさん [2017/11/20(月) 22:35:57.11 ID:bUEYENj70.net]
前スレ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

自分で言うのも何だがこれ超便利。かなりオススメ

166 名前:デフォルトの名無しさん [2017/11/20(月) 23:57:02.00 ID:3EUEsxu/0.net]
こういう時はせめてエクセルアップロードできるアップローダーぐらい探してくると良いぞ

167 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 02:44:24.85 ID:eIBN2cFq0.net]
>>157
www
hogeをなんだと思ってる?
そりゃそのまま打てばEmptyが帰ってくるだろう。
hogeで察してくれんかね。

カラッポなのは誰の頭だよ。

168 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 13:03:45.67 ID:OSkNtsZi0.net]
途中経過はどうでもいいから結果を教えろ って人間がどんどん増えてんだな 経営者かよ

169 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 16:28:44.72 ID:7aGtp6cN0.net]
結果はいいから途中経過を教えろ、なんて頭おかしいだろ何言ってんだか

170 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:41:32.87 ID:rp//GM45a.net]
>>163
普通は結果教えてもらうなら過程も学ぶんだよ
まあ、別に学びの場じゃないけどね
ただ、腐ってもプログラムだからな
結果だけ知ってもその場しのぎ以上にはならんだろ



171 名前:デフォルトの名無しさん [2017/11/21(火) 18:15:13.21 ID:22dwRLVAd.net]
世の中は論理的にできているのに>>163が論理的でないのはなぜなのか

172 名前:デフォルトの名無しさん [2017/11/21(火) 19:38:11.84 ID:49Yzjg710.net]
>>165
単に逆裏待遇を理解していないだけかと

173 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:45:55.72 ID:vcSymdG+d.net]
vbaを勉強中の者です。
市販で売られている本など調べても載っていないのですが、for文で使われる変数名が「i」ですが、なぜ「i」なのですか?
「i」の意味を教えて頂けませんか?

既出でしたらすみません

174 名前:デフォルトの名無しさん [2017/11/21(火) 21:52:07.73 ID:x41b941k0.net]
>>167
iterationのiって事でいいじゃん

175 名前:デフォルトの名無しさん [2017/11/21(火) 21:58:13.94 ID:49Yzjg710.net]
>>167
>168の通りだけど、もう完全に形骸化している
「i」でもいいし「ページ番号」など日本語表記でもいい
ちなみに俺は「k」から「m」「l」「n」と続ける
単に見間違いにくいように

176 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:07:12.83 ID:L3nv/JJz0.net]
今グーグル先生に聞いたらFORTRANからの名残だってでてきた

177 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:14:29.41 ID:wrH3tJZg0.net]
>>170
昔読んだVBだかVBAだかの書籍にはトピックとして掲載してた書籍もあったような記憶が

178 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:17:05.57 ID:vcSymdG+d.net]
>>168-170
ありがとうございます!
ホント助かりました!
引っ掛かり進まなかったので、これで進みます。
納得できてよかったです
ありがとうございます

179 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:17:55.51 ID:vcSymdG+d.net]
>>171さんもレスありがとう!

180 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:18:54.65 ID:2WJixd7Q0.net]
integerのiだと思ってたわ



181 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:47:14.99 ID:FV1Lkm8B0.net]
>>167
数学でijkは行列などの添え字で使う。
fortranでネストしたループ回すときって、微分方程式を離散化したものを解いたりするパターンが多くて、
二次元や三次元の多次元配列を使ってるだろうから、自然とijkになる。

で、数学のiはintegerからきてる、といったぐあいでは?

182 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 23:38:11.98 ID:vcSymdG+d.net]
>>174、174
数学からなんですか?!
プログラムと数学は違うものと思っていました。ありがとう

183 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 06:03:08.32 ID:nhDpu2iz0.net]
今から60年前にアメリカのIBM社で開発されたFORTRAN(フォートラン)というコンピューター言語があって
そこで変数名の頭文字がI以降なら整数型と定義されたのが始まり
ループカウンターは整数だからFOR文でもIを使ったという歴史がある

一方で昔のBASIC言語ではすべての変数が実数型というのが基本仕様だったので、Iを使う意味はあまりなかったけど、
FORTRANに憧れた世代が書き方を真似してそのまま定着した

という年寄りの昔話

184 名前:デフォルトの名無しさん [2017/11/22(水) 14:34:48.52 ID:NEZKz7+Jn]
質問です。

マクロ有効ブックがデスクトップにある時はマクロが動くのに
ブックが他のフォルダにあると、マクロが動きません。
原因が判る方いらっしゃいますでしょうか?

因みにコードは以下の通りです。シートコピーの所で躓きます。

Sub フォーム()
'フォームベースを日数分コピー

Dim fd As Date, ed As Date '月初月末
Dim x As Integer, i As Integer '日数とシート枚数
Dim ans '入力欄に入力された値

ans = Application.InputBox("YYYY/MM形式で入力")
fd = DateValue(ans & "/1") '年/月/1 日となる
ed = DateSerial(Year(fd), Month(fd) + 1, 0)
x = Day(ed) '月の日数

For i = 1 To (x - 1) '日数分のシートを生成

Sheets(1).Copy After:=Sheets(Sheets.Count)

Next i '繰り返し


Sheets(1).Range("F1").Value = DateSerial(Year(fd), Month(fd), 1)

End Sub

185 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 18:32:45.15 ID:mA48vywq0.net]
>>176
数学、論理学とは非常に近しいと思う。
関数型プログラミングてスタイルもあるし、
数学の証明をある程度自動化する言語もある。CoqとかAgdaとか。

VBAにもそろそろ高階関数が欲しいですね、MSさん期待してます。

186 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 18:50:12.14 ID:k1sKIAfY0.net]
愛があるからかと思った

187 名前:デフォルトの名無しさん [2017/11/22(水) 18:53:30.30 ID:/wgdkUUe0.net]
ループカウンタにi、j、kを使うようになったのはC言語の影響が一番大きい。

188 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 20:12:17.87 ID:Ce6/du3cM.net]
どこまで使う?
自分はnまで。
ループ変数以外で1文字の変数は使わない。

189 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 20:20:06.35 ID:t2AK8w6Da.net]
出来ればkまでにしたいね。
実際は思うようにいかなくて俺もnぐらいまで使ったことある。
でも1文字辞めることもある。

190 名前:デフォルトの名無しさん [2017/11/22(水) 20:57:00.17 ID:fITl6ULj0.net]
>>182
あんまり1文字変数は使わない
処理行数や処理列数などを使ってるわ
年取ると覚えるのが大変なんだよ



191 名前:答えはI〜N mailto:sage [2017/11/22(水) 21:18:19.80 ID:W0SJQGiTM.net]
>>177
> そこで変数名の頭文字がI以降なら整数型と定義されたのが始まり
嘘書くなよ...
X, Y, Z が整数型とかあり得んわ

192 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:46:50.38 ID:T8s4U7Y50.net]
最近デザパタに凝っててイテレーターパターンやってるけどなかなかいいよ
まあいかに多重ループしないかは大事だわ

193 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:49:25.89 ID:HR2X/8WF0.net]
イテレータと多重ループ回避って関係あったっけ?

194 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:55:38.62 ID:T8s4U7Y50.net]
>>187
いやまあ、見た目上ループ変数は減るからw
よってるからよくわからんなってるわ
すまん

195 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 22:48:54.39 ID:HR2X/8WF0.net]
VBAでイテレータパターンて難しそうだ

ループをなくす、って方向の方が良さそうです。

196 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 22:51:49.31 ID:HR2X/8WF0.net]
方向の方w

197 名前:デフォルトの名無しさん [2017/11/22(水) 23:20:15.38 ID:pTVfJfW70.net]
Excel2010です。
文字列を引数に文字列を返すユーザ定義関数を作りました。
アドインにしてチーム内に配布しようと思ってます。
試しに新規ブックで使ってみたところ、開くたびに変更していないのに保存確認メッセージが出るようになってしまいました。
関数の中の処理を全て消しても保存確認メッセージがでます。
文字列を返すだけの関数なので、保存確認メッセージを出ないようにしたいのですが、どうすればよいでしょうか。

198 名前:デフォルトの名無しさん [2017/11/23(木) 00:02:49.97 ID:Kpe6aW6i0.net]
>>191
中身を見ないとわからない
Function Foo(bar As Long)
Foo = bar * 2
End Function
と作ってみたけど
>開くたびに変更していないのに保存確認メッセージが出るようになってしまいました。
この減少は起きなかったよ
何か別の所に原因があると思う

199 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 06:39:11.72 ID:Y2T7cP8D0.net]
>>191
それって要するにvlookupの事?

200 名前:デフォルトの名無しさん [2017/11/23(木) 13:05:29.27 ID:IQVJTYbd0.net]
>>192
簡単に書くとこんな感じの関数です。

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を開き何もせず閉じようとすると保存確認メッセージがでます。



201 名前:デフォルトの名無しさん [2017/11/23(木) 13:22:13.30 ID:fJlhhdGs0.net]
>>194
再計算されてるから
値は変化しないけどセルの内容は更新されていると予想

202 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 13:42:02.49 ID:UTTVtMan0.net]
>>194
アトインって *.xla じゃなかったっけ?
*.xlb だとなんかいいことあるの?
(ツールバー設定とかを記憶するファイルだと思ってた)

203 名前:デフォルトの名無しさん [2017/11/23(木) 14:06:43.11 ID:1VQF43Qed.net]
>>194
xlbってなんだっけ?
xlamじゃないの?

204 名前:デフォルトの名無しさん [2017/11/23(木) 14:07:06.07 ID:1VQF43Qed.net]
かぶった

205 名前:デフォルトの名無しさん [2017/11/23(木) 14:35:16.43 ID:IQVJTYbd0.net]
すいません。拡張子は違ったかもしれません。

206 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 15:49:16.74 ID:AvEDQSYF0.net]
>>194
ネットで検索してみると回答は>>195氏の「再計算」で正解だと思うよ
そのユーザー定義関数の中で使ってる関数の中に再計算が発生する関数が含まれているのでは?

簡単な例でいくと新規ブックのセルA1に=TODAY()と入力し確定、そのブックを保存し閉じる
そのブックを開くとTODAY関数による再計算が発生するため何もせずに閉じようとしても保存確認出る
それと同じことでは

207 名前:デフォルトの名無しさん [2017/11/23(木) 17:02:33.93 ID:IQVJTYbd0.net]
>>200
192の通り使っているのはif文とLeft関数だけです。
試しに関数の中の処理を全て消してみたのですが、
状況は変わりませんでした。

208 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 17:02:38.88 ID:mWIv05A8x.net]
>>115
要らない

209 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 17:22:13.82 ID:k3nQdCAx0.net]
>>201
おそらく

A1が変わってないときに、=Kubun(A1) という式が必ず同じ値を返すという「保証」ができないので
B1セルが変更されている可能性を排除できない
ということで変更されている(可能性がある)と判断されてる

ユーザ定義関数は中身チェックしないで非決定的だって判断だな
シート開くときに再計算するかどうかのオプション設定なかったっけ?最悪手動かな

210 名前:デフォルトの名無しさん [2017/11/23(木) 17:30:51.41 ID:JDomtUrWp.net]
>>201
その関数にDebug.print 文を仕込んでおいて
呼ばれたかどうかを確認してみたら?



211 名前:デフォルトの名無しさん [2017/11/23(木) 19:42:47.05 ID:IQVJTYbd0.net]
>>203
保存確認メッセージを防ぐ方法はないですかね?

>>204
関数は呼ばれていますが、それだと何か方法ありますか?

212 名前:デフォルトの名無しさん [2017/11/23(木) 20:00:32.08 ID:fJlhhdGs0.net]
>>205
関数が呼ばれると言うことは変更されると言うことだから
保存確認ダイアログが出るのが普通

savedプロパティを変更する方法とか
calculationプロパティをマニュアルにする方法とか
方法はあるかもしれないけど
他の問題が起きるようになるかもしれない

213 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 23:21:24.29 ID:SB9DcOfL0.net]
Application.DisplayAlerts = False
のこと?

214 名前:デフォルトの名無しさん [2017/11/24(金) 11:41:27.83 ID:h1FhSyIp0.net]
質問です。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行)がイミディエイトに表示されます。
絞り込まれた結果のみを表示するためにはどうしたら良いのでしょうか?

215 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 11:52:22.18 ID:BOT2k7iW0.net]
>>208
Set rgFilter = ws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)

216 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 12:05:42.58 ID:h1FhSyIp0.net]
>>209
素早いご回答ありがとうございます。
修正してみましたが、今度は絞込みあり/なし何れも1行だけになりました

何だか難しい操作ですねえ…

217 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 12:12:04.66 ID:h1FhSyIp0.net]
Dim MaxRow As Long
MaxRow = ws.Range("A" & Rows.Count).End(xlUp).row

これを追加して、
Set rgFilter = ws.Range("A1:A" & MaxRow).CurrentRegion.SpecialCells(xlCellTypeVisible)

にしてみても、結果は>>208と同じになりました。
んー謎です

218 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 13:34:47.29 ID:bxAooAvMa.net]
>>205
あるにはあるけどクソめんどくさいぞ
すべてのセルの初期値保持しといて、閉じるときに確認して値に変更なければsavedをtrueにしてから閉じる、とかね

219 名前:デフォルトの名無しさん [2017/11/24(金) 16:52:13.42 ID:x6NJ51zce.net]
Sheets("Sheet1").Columns(2).Insert Shift:=xlToLeft
Sheets("Sheet1").Columns(2).Insert Shift:=xlToRight

この二行の動作の差が分からないので
違いを教えてください

220 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:34:32.78 ID:HKDmIDHRH.net]
>>213
現在のcolumns(2)の中身が左にずれるか、そのままか、かな?
当てずっぽうだけど。



221 名前:デフォルトの名無しさん [2017/11/24(金) 19:18:42.44 ID:V+PY16OM0.net]
>>206
>>212
アドインをあきらめます。
ありがとうございました。

222 名前:デフォルトの名無しさん [2017/11/25(土) 12:49:09.41 ID:roqaXNhOa.net]
エクセル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

223 名前:デフォルトの名無しさん [2017/11/25(土) 13:36:20.17 ID:fp6T8Ewd0.net]
〉〉214
ネストの使い方間違ってると思うのですがどう直せばいいのかわかりません。

224 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 13:39:02.15 ID:Sg1k8TV00.net]
>>216
itigi じゃなくて itiji にしろ
シート名「にて」はやめてシート名「で」にしろ
i = i + 1 と j = j + 1 は不要なので消せ

225 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 13:55:20.06 ID:QhU2UVSF0.net]
>>216
単純にシートで開始行がずれているだけなら

For i = 2 to 3
itigi.Cells(i, 1).Value = syougai.Cells(i +9, hiduke).Value
以下略
Next

でいいんじゃないでしょうか
ループはネストすると
内側のループだけ全部回して外に抜ける、を外のループの回数
だから、ネストでは意図した動作にならないでしょう
>>218も言っているけど、Nextで変数に勝手に+1されるから足さなくていい

226 名前:デフォルトの名無しさん [2017/11/25(土) 14:08:02.51 ID:fp6T8Ewd0.net]
ありがとうございました。
できました。

227 名前:デフォルトの名無しさん [2017/11/25(土) 15:25:06.65 ID:P/RTUJJid.net]
てか hiduke なんて変数名使うくらいなら「日付」のほうが10倍まし

228 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:03:29.39 ID:dlgn0p0Vx.net]
そもそもVBAでやることなのかな
転記先の一時データのシートのセルに障害記録シートのセルを参照する式を書くだけで良くない?

229 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:17:31.37 ID:4suMRhlB0.net]
変数名ぐらい自由にしてやれw

230 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:23:34.66 ID:Yv0FOuti0.net]
>>216
値を取得しながら転記しようとするから混乱する
コレクションなり配列なりに一回格納してから転記するようにすればネスト要らん



231 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:30:52.78 ID:Yv0FOuti0.net]
>>223
変数名は大事でしょ
こいつの変数の付け方は最悪に近いわ
代入の式見なかったらなんのことだかわからねー

232 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:32:47.09 ID:+Jz8ZPqE0.net]
本人できたって言ってるのにグダグダ言う奴ウザイわ

233 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:35:56.02 ID:ISZ6M3sb0.net]
hidukeと日付のどちらか選べと言われたら、hidikeを選ぶ。

234 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:37:28.74 ID:S5e4mFeJd.net]
仕事内容を記録するエクセルを作成したく、
シート名は各個人名でフォームを開くボタン設置。
登録用に必要項目をフォームで作り、転記するサンプルマクロを書いたんですが、今後必要項目が増えたり、減ったりしたときに人数分フォームを弄ったりマクロ書き換えるのは面倒ななんですけど、一個をものを共有し使用するにはどうしたらいいですか?

各個人のエクセルを開き、作ったボタンで共通のエクセルを開きフォームを開いて転記させるとか?

共通のエクセルを読み取り専用で開き書き込む時に自分のエクセルを開いて転記させるとか?

なんかうまいやり方ないですか?

235 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:42:32.82 ID:Sg1k8TV00.net]
>>227
何が言いたいんだW

236 名前:デフォルトの名無しさん [2017/11/25(土) 17:52:49.62 ID:M1jU9gED0.net]
>>228
シート毎つまり人毎にボタンを作るなら
そのボタンをクリックした時にその人独自の値をグローバル変数とかに代入して
フォームは共通のものを呼び出す

フォームに入力されたものを書き込む時は
さっきのグローバル変数を見て
書き込み先のシートとかを特定する

237 名前:デフォルトの名無しさん [2017/11/25(土) 17:53:40.22 ID:M1jU9gED0.net]
>>230
同時に複数の人がそのエクセルファイルを使わない事が前提だけど

238 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:31:33.42 ID:S5e4mFeJd.net]
>>231
同時に開くことがあるんですよ。

239 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:33:58.83 ID:MqKvnHus0.net]
>>228
一つのエクセルファイルを複数人で同時に使うのはいろいろ大変だと思う。
共有共通にせず個人毎に違うファイルを使ってもらって、
仕事内容記録フォルダに入ってるファイル全てをまとめて集計するマクロを作った方がよさそ。

240 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:34:51.02 ID:Sg1k8TV00.net]
>>232
データはなんでもいいからDBに書き込んでエクセルはインプット画面として割り切りなさい
マジで



241 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:38:42.16 ID:Yv0FOuti0.net]
エクセルの共有はマジで地雷
運用を見直した方がいい

242 名前:デフォルトの名無しさん [2017/11/25(土) 19:34:05.10 ID:PrfYax++p.net]
>>232
入力するのが一人で他の人が見るだけなら問題ない

複数人が同時に書き込むならエクセルじゃなくて
ウェブアプリとかにした方が良いと思う

243 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 19:37:11.17 ID:T5+qbkCf0.net]
mdbを複数ユーザーで同時に掴めるなら、SQLでデータを投げれば動作するんじゃないの。
入力フォーム作りがクソ面倒くさいからエクセルでやるのは愚策中の愚策なのは確かだけど。

244 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 19:44:15.61 ID:4suMRhlB0.net]
>>225
健康のためなら死ねるタイプ?w
ごめんけど理解不能

245 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 19:46:52.39 ID:4suMRhlB0.net]
どうしてもエクセルだけでやりたいなら、フォームとデータでファイル別けるべきだね

246 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:15:23.25 ID:Yv0FOuti0.net]
>>238
いや、常識だろ
自分でメンテするにしたって嫌だわ

247 名前:デフォルトの名無しさん [2017/11/25(土) 20:24:47.32 ID:fZkth5mu0.net]
フォームボタンをクリックした時に
グローバル変数とかに時刻なり、その人のIDなりを記録して
編集中である事が分かるようにしておく

書き込んだら

248 名前:Nリアする

他の人がフォームボタンをクリックしたら
編集中かどうかチェックして
編集中なら後で再実行するようにダイアログを出す
[]
[ここ壊れてます]

249 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:38:06.48 ID:4suMRhlB0.net]
>>240
お前の常識とか知らんし興味もない。
他人の変数名にケチ付けるのは常識じゃなくてエゴだろ

250 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:40:07.39 ID:99QBz+fh0.net]
React では、データアクセス(CRUD)部分は、
Flux の、Store という部分で、 UI とは完全に分離させている

nmp の、immutable パッケージで、データを変更不能にしたり



251 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:41:41.46 ID:4suMRhlB0.net]
日本語でおk

252 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 21:19:48.45 ID:d0mIe/tRa.net]
変数名は結構考えるけどな。
普段なら辞書サイトでその意味の英単語から付けることが多い。
API使えば変数名の重要性が分かる。

253 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 21:53:57.63 ID:Sg1k8TV00.net]
>>245
それは変数名と言うより引数名でしょ?
それだったら確かに大事

254 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 22:00:33.02 ID:T5+qbkCf0.net]
個人的に引数含む変数名に半角英字は避けるように徹底してる。
予約語と被らなくなるし徹底すれば読みやすいしね。

一般的に、名前に半角英数使うのはコンパイラが2バイト文字対応していない事が理由なんで、
対応しているコンパイラには積極的に2バイト文字で投げた方がいい。

255 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 23:35:03.26 ID:Yv0FOuti0.net]
>>246
一年前に作ったコードの宣言部分と代入部分見ずになんの値か把握できる自信があるならどうぞ
まだシステムハンガリアンの方がポリシーあるだけマシ

256 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 23:36:51.22 ID:Yv0FOuti0.net]
レスの相手間違えたわ
>>242
に対するレスね

257 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 23:47:28.66 ID:Sg1k8TV00.net]
>>248
俺が>>246で言った意図は、「引数名は大事だがローカル変数名はたいして大事じゃない」という意味だ。
それに反論しているのかな?

258 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 09:00:43.39 ID:/OBEl30Ad.net]
大事じゃない変数なんてないんだよ
みんなそれぞれに役割があって、一生懸命に生きてるんだから

259 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 09:30:00.33 ID:ci9PkC0t0.net]
>>250
それは違うだろ
まあ、使い捨てのテストなんかは適当にやるけど
長い変数名が嫌なのは打つのが面倒だからなんだろうけど、そもそも同じ変数が何度も出てくる時点でリファクタリングの臭いがするわけでな

260 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:10:58.75 ID:A1ZwwN/70.net]
>>252
ローカル変数に限っていうなら、上の方がよくて下に行くにしたがって悪くなると思っている

・ローカル変数がない
・tmp とか a とか x とかいう名前で十分わかる
・適切な名前をつけることでよくわかる
・適切な名前がつけられていないことで混乱する
・適切な名前がつけられているにもかかわらず混乱する

そうだよね?



261 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:15:24.53 ID:hep87Sd80.net]
>・適切な名前をつけることでよくわかる
>・適切な名前がつけられていないことで混乱する

同じことじゃね?

262 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:16:38.23 ID:KMInKg0R0.net]
ソンタクして変数名にvarを採用

263 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:24:16.70 ID:A1ZwwN/70.net]
>>254
いや、
やれば改善する可能性があるのにやっていない状態、ということで下位になっている

264 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:44:51.98 ID:DTyNodR2M.net]
>>251
底辺のお前も頑張ってるもんな w

265 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:50:05.48 ID:ApNVvKeX0.net]
>>253
ローカル変数がないの意味がよくわからん
値渡しの引数はローカル変数なんだけど
それを除外したとしても、変数なしで書ける処理は限られてくるし

266 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 12:54:24.61 ID:pGcZHtwF0.net]
>>258
不要な変数を作るなってことだろ
そのまま代入すりゃいいのに>>224みたいにいったん変数に格納したがる奴は一定数いる

267 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 12:56:36.30 ID:OTnHPyYR0.net]
VBAからどんどん離れて公開オナニーになってきた

268 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 13:04:15.84 ID:ci9PkC0t0.net]
>>253
tmpとか、座標系の短い変数はきちっと関数化して処理の分断ができてるときに限るけどね
大体そんなもんじゃないかな
>>259
配列に格納してから云々はそれぞれの処理を独立させることであとから見通しがよくなるんだよ
たとえば、代入する値に条件付きで何らかの処理を加えなきゃいけなくなったときなんかにループしながら直接吐き出してるとネストが深くなって可読性が低くなる
それぞれ独立してれば関数化するのも楽だしな

269 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 13:33:08.74 ID:pGcZHtwF0.net]
>>261
> たとえば、代入する値に条件付きで何らかの処理を加えなきゃいけなくなったとき
その時にやればいいだけ

270 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 14:16:29.61 ID:ci9PkC0t0.net]
>>262
一回変数にいれることでそれがなんの値か、というのを明示するって意味もある
意味があるからやってんだよ



271 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 14:40:03.00 ID:pGcZHtwF0.net]
>>263
>>216ならコメントで十分

272 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 15:20:43.89 ID:A1ZwwN/70.net]
>>258
日付が変わっているからIDは違うが、元の俺の発言は>>250
>「引数名は大事だがローカル変数名はたいして大事じゃない」という意味だ。
なんだよね。
つまり引数は別として狭い意味のローカル変数について語っている。

それと、>変数なしで書ける処理は限られてくるし
については、良い〜悪いの序列の話なので、「変数なしで書けるくらいスコープが狭い方が良い」ということさ。

273 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 16:18:08.52 ID:t/ZpdAAca.net]
( ・ω・)∩シツモーン
範囲A1:C10の値をまとめてD1:F10に代入するときにさ
直接=で結ぶと駄目で
一旦変数で
tmp=range(A1:C10).value
range(D1:F10)=tmp
とかいうふうにすればオッケーなのって何でなのん?

274 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 16:56:09.10 ID:A1ZwwN/70.net]
>>266
Range(A1:C10).Value = Range(D1:F10).Value

でいけると思うけど?

275 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 17:06:14.25 ID:A1ZwwN/70.net]
ごめん逆
>>266のやりたいことは
Range(D1:F10).Value = Range(A1:C10).Value
だね

276 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 17:18:28.93 ID:ApNVvKeX0.net]
値のコピーは
Range("D1:F10") = Range("A1:C10").Value

277 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 09:03:15.77 ID:3l0DMD54a.net]
範囲が同じなら
R1.Value=R2.Valueで行けるな、普通に
Set R1=R2はなんか無理
R1=R2でいけない理由はよくわからん
RangeオブジェクトのデフォルトプロパティってValueだよね?

278 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 12:39:02.79 ID:Hzamsy590.net]
>>270
Rangeの既定のプロパティは、ドキュメント上だとItem

実際はちょっとトリックがあって、_Defaultっていう隠しプロパティ
こいつがアドレス指定しない場合はValueを返す

279 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 22:21:45.18 ID:HF1f2kGW0.net]
>>270
Setを使うということはオブジェクトということだぞ。
それはRangeそのものを代入することを意味する。
A1セルにB1セルを代入など出来よう筈が無い。
A1セルのアドレスがB1?
意味不明だろ。

280 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 22:54:13.44 ID:scsxtpuJM.net]
indirectの悪口はそこまでだ



281 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 23:55:45.37 ID:++h0dxh80.net]
indirectが未だに理解できない

282 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 23:58:34.84 ID:VuuuCAGm0.net]
>>272
rangeオブジェクトの実体はアドレス情報ってことか?

283 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 02:02:42.04 ID:+NcnLu/Q0.net]
>>275
???
それだけじゃねーだろ。
が、それも含むのは当然。

284 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 07:27:08.64 ID:ZnyBsd4x0.net]
indirectとかsumproductとか、便利なんだけどいまいちよく解らんよな。

285 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 09:30:34.94 ID:PHeqRDr40.net]
忘れちまえよindirectの事なんか

286 名前:デフォルトの名無しさん [2017/11/28(火) 09:41:03.64 ID:/j8R3q5Od.net]
>>272
Set の左辺は変数だから当然と言えば当然
A1セル自体は変数じゃなくてオブジェクトだからな

287 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 10:01:09.63 ID:mtOclWiza.net]
>>276
いやまあ、セル同士を直接セットが無理っぽいのは何となく感覚でわかるんだが、どういう動きでそうなってんのかなーって気になるわけよ

288 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 12:43:56.96 ID:ZLcA5r8L0.net]
Range()みたいなのって返却値がRangeクラスなだけあってRange()自体は関数だから

289 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 14:06:44.13 ID:WkhkCF1D0.net]
Rangeオブジェクト
Rangeプロパティ
Range関数
Rangeでチン
これが区別できれば完璧

290 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 22:19:20.97 ID:0EijvfTXM.net]
ら...らんげ?


(´・ω・`)b



291 名前:デフォルトの名無しさん mailto:sage [2017/11/29(水) 19:36:16.84 ID:vIwO7IkJ0.net]
>>281
getRangeにしとけよな
紛らわしいわ

292 名前:デフォルトの名無しさん [2017/11/30(木) 20:52:21.44 ID:Acf/eaNYa.net]
リストを絞り込み別のリストで1行だけを表示できるようにしたらどうしたらいいでしょうか?
わかりやすくいうと、sheet1にA1からZ1000までのリスト置き、それを何らかの方法で絞込
sheet2のEの1にE列の絞り込んだ1行目をEの2にF列の1行目を表示し次へを押すと2行目を表示するようにしたい
オートフィルみたいなことですが表示したいセルが文文章で多くそのセルだけを表示できるようにしたいです。
1行だけならなんとなくわかるのですが次の行にコマンドボタンを押すことで表示する方法はイメージできません。
for文ならiを使えばいいんでしょうけどやりたいことと違う

293 名前:デフォルトの名無しさん mailto:sage [2017/11/30(木) 21:50:06.23 ID:ECoRVPVY0.net]
>>285
Find関数使って検索してヒットした行数を返すようにして、
受け取った行数を元に情報を取得、次へボタンはFindNextにしておく。

というのが一番簡単かなぁ。本当はExcelじゃなくてAccessで扱う方がやりやすいんだけど。

294 名前:デフォルトの名無しさん [2017/12/01(金) 14:32:31.35 ID:4uYh51s/0.net]
以下不明点を教えて
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

295 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 14:54:37.77 ID:RC6w6Z/F0.net]
>>287
Next j の捉え方からすると、そもそも実行の順番が分かっていないようなので基礎からやる事をおすすめする。

296 名前:デフォルトの名無しさん [2017/12/01(金) 15:05:39.92 ID:4uYh51s/0.net]
俺なりに日本語訳してみた
間違っていたら教えてくれ
VBA初めて3日です
基礎は本読んでるからわかっている


変数宣言

変数に初期値を入れる わかりやすいように

変数iは2から一番下からみて最初に値の入ってセルまでをループする
変数jも同様
もしもA列とC列にループする上で同じのが見つかったら
変数にTUREを入れる
そしてループを抜ける
そんでまたjのループを繰り返す
もしも変数がTUREをもっていたら
FALSEに変える → なぜ?
セルの

297 名前:色を変える
そんでiのループを繰り返す
[]
[ここ壊れてます]

298 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 15:48:12.50 ID:AGjDU3vg0.net]
初期値をfalseにする理由
trueの時は色づけという流れにしたいので、予めfalseにしておく必要がある
boolean型の初期値はtrueなので。

途中でfalseを入れる理由
i=1 のままで j を最終行までループさせてチェック
その次に i=2 にして j を同じく最終行までループさせてチェックするのだが
i=1 でのチェックが終わった結果 true なら i=2 でのチェックに備えて false に初期化する必要がある
これは基本的に最初の初期化と同じ考え方

299 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 15:49:27.01 ID:Mw452gW7E.net]
Hanteiの初期化、j のループの直前に置けばIf文の後の変数初期化がいらなくなる気がする・・・

300 名前:デフォルトの名無しさん [2017/12/01(金) 16:20:04.74 ID:4uYh51s/0.net]
>>290
なるほどわかりやすい
このプログラムを日本語化して



301 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 16:42:02.13 ID:xc+Vk5Dr0.net]
>>287
最初の変数初期化は全く必要無い。
そもそもこういう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になる。

302 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 17:52:43.75 ID:P9JEW6xna.net]
>>287
同じこといってるかもしれんけどこの場合変数Hanteiが丸々要らない
if文の中にセルの色変更のコードを書けばいい
仮に、この変数がいるとしてもどんな値が入っててもどうせfalseにするんだからif分岐してる意味がわからない
もっと言うとHanteiとかいう変数名がクソ過ぎる
なんの判定かさっぱりわからん
canChangeColorとかnotMatchValueとかしとけば目的が分かりやすいのに

303 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 19:09:05.50 ID:RC6w6Z/F0.net]
A列の各セルの情報と合致するものが、C列に一件も無かった場合、
次に合致するデータが現れるまでA列の背景色を変え続ける

という処理なのでHanteiが要らない様に書き換えるって難しい気がするんだけど。

304 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 19:13:14.77 ID:P9JEW6xna.net]
>>295
ごめん、そこちゃんと読み込めてなかったわ
一致したら変えると勘違いした
なんにしてもフラグの初期化は頭かケツでいいと思うけど

305 名前:デフォルトの名無しさん [2017/12/01(金) 19:49:15.65 ID:4uYh51s/0.net]
ちなみにこのコードはVBAエキスパート公式のだよ

306 名前:デフォルトの名無しさん [2017/12/01(金) 20:08:56.93 ID:4uYh51s/0.net]
似たようなソースコードを作ってみました
なぜだかエラーがでます

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

307 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 22:17:56.90 ID:eRljVU/z0.net]
xUp → xlUp

308 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 00:44:57.80 ID:aL/u+cy30.net]
>>295
確かに一致したものが無かったらだからBoolean使う方が自然か。
使わなくても簡単だけど自然なBoolean使うのが正しいわ。
俺も勘違いした。
ちなみに、一致せずに全てチェックしてjのループを終了した場合のjの値を調べればBooleanはいらんし、そもそもFind使ってループ1つにしてもいらん。

この仕様を見た場合、絶対こんなコード書かないけど、俺が書くとした場合の配列にぶちこむ方法はBoolean使うのが自然だな。

ちなみにランダムで10000行にデータ入れた場合、このコードで320秒、Find使う方法で22秒、配列入れる方法で9秒だった。

309 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 01:37:25.51 ID:jpak6rxd0.net]
小学生がなんで3×5が15になるの?って聞いてるのに
俺なら電卓で答えだすぜ!って息巻いてる人のようにみえる
学習の初段階でつまずいてる人への的確な回答ではないわな

310 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 05:02:50.84 ID:EvURnJTn0.net]
なんつうか、これが俺の後輩なら、フローチャート書いてみって言いたくなるな
もうフローチャートなんて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は向かないよ



311 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:17:12.76 ID:/lrBlva0M.net]
ブック名 C:\book.xlsx
シート名 データ

説明文パート 1〜5行目

データパート
..ヘッダ A6〜Z6
..データ A7〜Z*
..データ件数 不定

プロバイダ Microsoft.ACE.OleDB.12.0

このような設定でヘッダとデータをselect文で全件取得するにはどうすればいいですか?

312 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:26:37.96 ID:aL/u+cy30.net]
>>301-302
超初心者の話かよ。
VBAエキスパートの話じゃなかったんか?

あと、If Hantei Thenを分からないって言ってるのは感覚の話で、君の説明じゃ分からないと思うぜ。
Hantei=Trueという式自体に値があって、それが正しい場合にその値は(Hantei=True)=Trueという結果になっているということが感覚的に分からないと理解できんだろ。
初心者はHanteiとTrueが等しかった場合と感覚的に理解してるんだから。
その感覚ではIf Hantei Thenが理解出来ない。

313 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:27:57.05 ID:cPyK88Sm0.net]
>>303
SQLで任意のセル範囲を取得する場合はFROM文で取得出来たはず。
SELECT * FROM [ データ$A6:Z1000] みたいな形。

ただその条件だとデータベースに投げる前にエクセル上で整形した方が効率いいと思うけど。

314 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:31:27.69 ID:7+Ics+9V0.net]
if hentai = true then 変態は正義

315 名前:デフォルトの名無しさん [2017/12/02(土) 09:32:03.18 ID:1C3LInkCp.net]
まず>>287のプログラムを動作順に日本語訳してくれよ

316 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:12:44.97 ID:aL/u+cy30.net]
>>307
簡単だろ。
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の次のセルに対して繰り返し処理続行する。

317 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:17:14.58 ID:tnWofmmQ0.net]
>>304
「VBAエキスパート」という資格の勉強をしている超初心者の話だろ?
VBA始めて3日と書いてるし

318 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:45:34.19 ID:cPyK88Sm0.net]
エキスパート名乗ってる割にはバグくさいコードなんだよな。

If Not Hantei Then Cells(i, 1).Interior.ColorIndex = 6
Hantei = False

っていう書き方がたぶん本来意図した仕様に近いと思うんだけども。

319 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:46:30.49 ID:ab3YxIeg0.net]
Hantei が Hentai に見える

320 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:09:12.13 ID:aL/u+cy30.net]
>>309
勉強してる奴が質問してるんであって、
このコードはそいつが書いたもんじゃない。
VBAエキスパート公式ってんだから、
資格の参考書かなんかに載ってるんだろ。

>>310
いや、この書き方自体は良くあるよ。
あんたのも間違いじゃない。



321 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:24:58.47 ID:fk+w59AEa.net]
○○でもわかる
○○のすべて
○○エキスパート
○○完全ガイド
こういうタイトル付いてるのは初心者向け

322 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:38:18.30 ID:zmHPgLHa0.net]
>>312
だから初心者用の本に載ってるコードが分からないと言ってるんだからこその>>301のツッコミなわけだろ?
本に載ってるコードの評価をしてくれという質問ではない

323 名前:デフォルトの名無しさん [2017/12/03(日) 08:02:30.09 ID:Q2bt/ZXPa.net]
エクセル相談所にあった質問で、とりあえずVBAなしじゃ出来ないって言っといったんだけど、VBAでリストの絞り込みって一度で出来る?
多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって事だと思うんですけど。
インターネットの選択方式でそんなの見た事あるけど一から開発するの面倒くさそう。
ユーザーフォームと2次元配列でも使えばできるかな?
ちなみにこの機能の名称あれば教えて欲しいです。
自分も配列すら参考書でかじったくらいでその必要性がわかってない初心者です

324 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 08:42:40.14 ID:U0ESQ6dD0.net]
残念ながらVBAなしで実現可能

325 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 09:19:50.58 ID:lwbJHU3ya.net]
お力添えをお願いします
チェックボックスでチェック入れたら行の高さを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

どこが間違っているのかご教示お願いします。

326 名前:デフォルトの名無しさん [2017/12/03(日) 09:52:22.12 ID:ObUuqjZI0.net]
>>317

行は適当に変えてくれ

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

327 名前:デフォルトの名無しさん [2017/12/03(日) 10:04:41.09 ID:ObUuqjZI0.net]
>>317
フォームコントロールならこっちだわ
コントロール名は適当に変えてくれ

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

328 名前:デフォルトの名無しさん [2017/12/03(日) 10:11:57.07 ID:lwbJHU3ya.net]
>>319
ありがとうございます!!!こちらで動作しました!!本当に有難うございます!!!

329 名前:デフォルトの名無しさん [2017/12/03(日) 10:42:36.13 ID:HLUSF6su0.net]
〉〉314
できるの?
入力規則の絞り込みじゃないよ?
階層化してリストから直接下層に移動(3段階くらい)して選択する方法だよ? <

330 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 11:18:12.75 ID:U0ESQ6dD0.net]
おいおい急に条件増やすなよw

www.tschoolbank.com/excel/validation-list-linkage/

こういうことじゃないのかよ



331 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 11:24:14.71 ID:pXIsIngK0.net]
>>322
これの話だから知らないなら絡んでくるなよ
mevius.2ch.net/test/read.cgi/bsoft/1506938295/713

332 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 11:39:56.54 ID:JkBkmVnb0.net]
>>314
違う。
そのコード書いた奴に向かって言ってるのと、躓いてる奴にはそのコードはよろしくないと言ってる。

何の例かは分からんが、もっと現実的なコードにすべきなんだぜ。

333 名前:デフォルトの名無しさん [2017/12/03(日) 12:12:17.46 ID:HLUSF6su0.net]
>>322
しかも、わかりにくいかもしれないけど条件ちゃんと書いてあるんだけどね
入力規則の絞り込み検索じゃない。
階層ごとにクリック選択する事すらめんどくさいと言ってるんだよ。
一度の選択でリストの階層移動ができるかどうかを質問主は相談所で聞いていて
自分はVBAないとだめだよと回答したけどVBAだとどうなんだろうとこっち
で聞きなおしてみたんだけど、

334 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 12:58:31.51 ID:A600L+iiM.net]
>>325
さすがにそれは読み取れん

335 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 13:12:35.66 ID:bN8T4SKTM.net]
>>323
こういう糞レスがつくからスレが過疎るんだぞ

336 名前:デフォルトの名無しさん [2017/12/03(日) 13:54:27.80 ID:HLUSF6su0.net]
ちゃんと、VBAでリストの絞り込みって一度で出来る? こう書いて
その下に
多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって
こう書いてあるんだけど読み取れない?
しかも、前文にエクセル相談所にあった質問こうも書いてあるし。
で、わざわざVBAで聞いてるのにわからないかー

337 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 15:23:42.34 ID:icSWQcwl0.net]
具体的なコードが伴わない場合は外野がなんかゴチャゴチャ言っている程度に聞き流すべき。

>>323の質問はウィンドウズ標準のメニューバーみたいな形を想定しているみたいなので、
外部参照にMicrosoft Toolbarとかあれば、それを追加して解決するんじゃないかな。

338 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 15:57:02.43 ID:pXIsIngK0.net]
>>328
> 多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって
マウス操作にはクリックも含むのが普通だと思うぞ

>>327
無駄なレスしてなにか楽しいのか?

>>329
あっちのスレ読めばわかるけどそもそも VBA 使わずにできるかどうかの問題になってるから Toolbar 云々の話ですらない
お前さんこそ聞き流すべき

339 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 16:12:49.11 ID:icSWQcwl0.net]
>>330
どちらかというと>>315の質問に答えた形だけど。
向こうの質問にこっちで答える義理もないし。

340 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 17:11:02.86 ID:JkBkmVnb0.net]
>>315
それは、VBAでも出来ないと思う。
というかWindowsの標準動作と違う。
似たようなのは出来るかもしれないけど。

コンボボックスじゃなくメニューなら出来るかな。
見ためが違うけど。
見ためをコンボボックスにしたいならコンボボックス使わずにフォ−ムに描画した方が楽じゃね?
コンボボックスだと選択しないとイベント発生させるのが難しいし、イベント発生時にブルダウンが閉じるのが通常動作だから。
サブクラスでHITTEST検出で出来るかどうか。

VBAではウルトラC級に難しい。



341 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 17:13:47.51 ID:JkBkmVnb0.net]
>>329
メニューバーの見ためは駄目なんじゃないの?
俺もメニューバーが現実的だとは思うけど。

342 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 18:36:56.64 ID:RpLqv7Ag0.net]
>>315
階層付きMenuで3項同時に入力するってこと?
自分だったらContextMenuの改造またはPopupでやるかな。
見た目悪いけど、最下層をデリミタ区切りのフルセットにすれば
Splitして投げ込むだけでいいでしょ?
CellのContextMenuだとあとで標準に戻すこと考えないと
いけないので最近はもっぱらPopupばかり使ってる。
Cellのプルダウンだと表示数に限りがあるけど、Popupだと
画面サイズいっぱいまでいけるし、、
あ、もちろんCommandBarsのアレのことです。

343 名前:デフォルトの名無しさん [2017/12/03(日) 22:48:18.35 ID:DUCKYmEka.net]
>>315
いえ、1つ目のリストを表示して、マウスの位置をその位置まで持ってきて
2つ目のリストを表示してって3つ目のリストを最終的に表示するみたいな。
エクセルの旧表示みたいな感じで、ファイル→検索みたいな感じです。
多分

344 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 00:43:15.26 ID:oPXdl+lm0.net]
>>335
いやだからそれって、階層メニューのことでしょ?
手近なところでいうと、、、たとえばFireFoxだと、

 表示 > テキストエンコーディング > 自動判別 > 日本語

みたいな。この手のMenuって、onMouseOverイベントで
下層が勝手に開いていきますよね。
それで各階層の選択肢を全部入力値として使うことじゃないの?

345 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 02:58:02.92 ID:Fxj9yJGL0.net]
そう、これはメニューの動作なんだ。
コンボボックスで実現するのはとても難しい。
ほとんどの奴は上級者でも不可能と言うだろう。

それとも俺の知らない何かがあるかもしれないけど。

346 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:21:07.64 ID:oPXdl+lm0.net]
コンボの配下にメニュー作ろうとすると怒られた。
階層メニューによる一括入力、自分でも使うかもと思い作ってみたよ。

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

347 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:23:18.02 ID:oPXdl+lm0.net]
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

348 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:24:02.05 ID:oPXdl+lm0.net]
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

349 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:28:37.65 ID:oPXdl+lm0.net]
5)引数付きのOnActionコマンドの生成に普段使っている関数

ん?書き込めない、、なんで?
要は文字列生成がメンドーだから関数使ってるだけなんだけど、、

350 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:36:14.51 ID:oPXdl+lm0.net]
刻んでみる。

5)引数付きのOnActionコマンドの生成に普段使っている関数

Function MkAction( strCMD



351 名前: As String, Optional arg1 As String, Optional arg2 As String ) []
[ここ壊れてます]

352 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:41:24.99 ID:oPXdl+lm0.net]
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関数は禁則?

353 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:44:57.18 ID:oPXdl+lm0.net]
書き込めた。
Chr関数で引っかかっていたみたい。実際は半角です。
インデントは全角スペースになっているので変換が必要です。

354 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 07:27:39.63 ID:65GoxPZl0.net]
VBEにコピペすると、全角スペースは自動的に半角スペースに変換されるから意識する必要ない

355 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 07:55:50.52 ID:oPXdl+lm0.net]
>>345
本当ですね。 tnx!

356 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 20:57:29.50 ID:dwGLun0F0.net]
エクセルのVBAで、サーバー上にディレクトリを作成して、そこにファイルを移動させたいのですが、
MkDIRで作成できませんでした。どうすればよいでしょうか?

357 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 21:25:35.80 ID:JPkeWfWn0.net]
>>347
FileSystemObject使えばできますよ。
サーバー側の権限は大丈夫ですか?

358 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 21:34:50.27 ID:dwGLun0F0.net]
>>348 ありがとうございます!

dim myFSO as new filesystemobject
myFSO.CreateFolder (サーバー上のつくるディレクトリ名)でいけますか?
それともカレントドライブをサーバー上に移動すべきでしょうか?

359 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 00:43:40.01 ID:D6s1mPo40.net]
>>349
試してみたら?

360 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 11:15:00.00 ID:8dpxpCOD0.net]
質問です。
プロシージャの処理の途中でイミディエイトウィンドウをうまくクリアする方法はありますか?



361 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 11:39:53.74 ID:MQk7+ulPa.net]
あるかないかでいえば、
ないこともないアル
地道にセンドキーでキー送って
全選択してデリートしてって方法がな

362 名前:デフォルトの名無しさん [2017/12/06(水) 11:46:45.28 ID:vAzWmOhld.net]
関係ないけどブックを開くとイミディエイトウィンドウ上の変数が消滅するの困る

363 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 13:39:40.38 ID:yYTt94fN0.net]
>>352
その際はFocusをVBEに移してイミディエイトPaneをアクティブにする操作を挟むのでしょうか?

364 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 16:07:50.81 ID:ykbUk5IV0.net]
エクセルのVBAで競馬予想ソフト作っている人っていますか?

365 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 19:37:25.77 ID:sdGXOm2ja.net]
>>354
デバッグ クリア VBAで検索したら
幸せになれるかもよ

366 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 21:02:08.65 ID:H8Zs2M1B0.net]
VBAでコンボボックスのリストのみクリアってどうやってやるんですか?

367 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 23:12:55.48 ID:ClwZMpdPa.net]
>>357
正式にやるのは多分すごく難しい。
Win32APIでコンボボックス内のリストボックスに対してどうにかするということになると思う。

しかし、単純に
strCombo=ComboBox1.Text
ComboBox1.Clear
ComboBox1.Text=strCombo
でテキストが一瞬クリアされたのは見えないから現実的な案だと思う。

368 名前:デフォルトの名無しさん [2017/12/07(木) 10:43:49.53 ID:cGZzJnMw0.net]
シートの非表示設定について
Sheets(”sheet1").Visible = False
でシート非表示設定をしたのですが元々非表示だとバグになってしまいます。
釦を押せば特定のシートのみを表示できるようにしたいんですけど表示時非表示時がランダムで
非表示時でもそのコード無視するかと思ったら非表示なのに非表示にするんじゃねぇと怒られた。

369 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 10:55:46.75 ID:SgQPpSGG0.net]
>>359
VisibleプロパティがBooleanで状態を返すのでIfで分岐させる

If Sheets("sheet1").Visible Then
Sheets("sheet1").Visible = False
Else
Sheets("sheet1").Visible = True
End If

こうすると実行するたびに表示/非表示が切り替えられる

370 名前:デフォルトの名無しさん [2017/12/07(木) 11:24:06.29 ID:cGZzJnMw0.net]
>>35
ありがとうございます。できました。
なんとなく、if文使うのかなと思ったのですがif文が思いつかなかった。
Elseの下を消すことで、非表示時は非表示のままのする思い通りの事が出来ました。



371 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 11:50:17.69 ID:/U/N3RBoa.net]
>>360
それだと非表示の時は表示されるからElseはいらねえだろ。
俺も
Sheets("sheet1").Visible=(Not Sheets("sheet1").Visible)
と最初考えたけどやっぱIf文にしないと駄目かと考えた。

372 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 12:06:28.65 ID:SgQPpSGG0.net]
>>361
たぶん他人にも使わせるのだと思いますが
シートをシート名じゃなくオブジェクト名で指定すると
誰かが勝手にシート名を変えても関係ないのでオススメ。
さらにわかりやすいオブジェクト名に書き換えると、尚良し。
オブジェクト名はVBEのプロパティウィンドウの(オブジェクト名)を見てね。
初期値はSheet1なので
Sheets("sheet1")をSheet1に置き換えてもうごくはず。

>>362
あとから余計なこと書いたかなーと思ったけど、本人が気づいてくれてよかった。

373 名前:デフォルトの名無しさん [2017/12/07(木) 13:06:30.92 ID:cGZzJnMw0.net]
〉〉361
ど素人で何もわからないままマクロの記述させながら必要なところ
コピペしてとネットコピペでほとんどコード打ち込まず作ってるので
まだ、オブジェクトまで触ってません。
今度触ってみたいと思います。
標準モジュールは逆になんのモジュールかわからなくなるの必要なモジュールと区別するために名前つけてるけど
sheet名はそのままです。

374 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 21:42:15.17 ID:F/BnOZfeM.net]
>>287
ワシはティンコを2本もっている
2本目はとっておきだ(´・ω・`)b

375 名前:デフォルトの名無しさん [2017/12/07(木) 22:24:29.94 ID:QxT2u2P9d.net]
>>365
マジ気になるわー
V字になってるのか、真ん中で2段になってんのか、前後に生えてんのか?
1本は普通だが、もう1本はデコに生えてんのか?

376 名前:デフォルトの名無しさん [2017/12/08(金) 00:07:26.11 ID:8mEkhztWa.net]
コードのコメントについて
どこまで記入してますか?
素人なもんで変数の内容から
変更前のコードまでコメント化してるからコード自体が長くなる。
社内のVBAコード見るとコメントほとんど書いてなくてf8で追っても、よくわからないからなにがいいか分からない

377 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 00:27:27.18 ID:tPe4A27O0.net]
設計さえキチンとしていれば大抵はコメント要らない。

Dim SLine As Long:SLine = 3 '読み込むファイルのヘッダーが二行ある為

みたいにプログラム依存でないパラメータを解説する時に使ったりはする。
ある程度の習熟が必要なので、ステップ実行でも何してるか分からない(正常に追えない原因が分からない)のであれば、
まだコメントの必要性について論ずる段階では無いので特に要らないんじゃないかな。

自分の昔書いたコードを改修しようとして訳分からないみたいなのを何度も経験して始めてコメントの要点が掴めると思う。

378 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 00:40:24.89 ID:MH/bn/0fH.net]
>>367
変数名からなるべく中身を類推できるようにつけてコメは最小限にしてる。
後で迷うくらいならつけたほうがいいと思う。コード記述して直後は完全にわかってるから迷うポイントに気づけない。一週間後とかに再レビューして、「コレなにやってんだろ?」と引っかかった所はポイントかな。
あとExcel本体の不具合、制限回避とかコメしてないと中々思い出せないことがある。

379 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 00:50:05.27 ID:04xg1k3G0.net]
コメントは書いた方が良いんだが、余計なのはいらない。
変数名で分かるものは必要ない。
むしろどういう処理かのコメントを書く場合が多い。
それもそこのメンバーのレベルによる。
書ける奴らが集まってるなら、こんなもん分かるだろと書かない場合も多い。

380 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 08:12:21.44 ID:WX0K1LcLa.net]
コメントは処理の内容についてはしない
なぜその処理をするのかつかみにくいとリッキーだったり使用上やむを得ないときに理由を簡潔に書く
変更履歴をコード上に書くのは愚の骨頂だけどVBAだとほかに方法が少ないから自分かチームでルール決めるしかないな



381 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 08:13:11.00 ID:WX0K1LcLa.net]
とリッキー→トリッキー
使用→仕様

382 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 18:16:29.95 ID:3k7CQU1Hd.net]
質問です。
シミュレータソフトをVBAを使って制御しています。順々にモデルを解析していき、逐次計算結果がエクセルに反映表示されるような動作をします。
ただそのとき、きちんと逐次結果が表示されていく場合と画面に全く結果が表示されずプログラムが終わった途端に一気に数値が表示される場合とがあります。
途中でも解析結果が分かるよう安定して逐次表示するようにしたいのですが解決策分かる方いたら教えてください。

なお画面更新はもちろんオンです。調べたところdo eventsというのでWindowsに制御を渡すやり方もあるようですが、途中の動作が割り込む可能性がありそれは避けたいです。

383 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 19:13:35.05 ID:jJUgyerEM.net]
自分も普段はほとんどコメント書かない。
適切な命名とコードの流れで処理は説明して、意図や補足説明にコメントを書くのが正しいと思ってる。
ただ、VBAではかなり細かく書いてる。理由は、VBAの時点でどうやっても読みづらいから。
勝手に行間調整するせいで
int n
WorkBook book
みたいな整列ができないし、Dim n As Integerって構文自体が無駄な単語多くて、数並んでいると読む気がなくなる。
スコープの区切りにEndを使うのも()よりコードに埋もれて見づらいしVBEの色設定は貧弱だし。
VBAに限ってはコメントで処理追った方が楽だって最近は思ってる。
早くエクセル操作に向いたもっとまともな言語出ないかな。

384 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 19:16:35.83 ID:wpv6YuQca.net]
そうか、ここもvba方式なんだった。
int__________a
WorkBook___book
みたいにタイプと変数名で表っぽく配置することね。

385 名前:デフォルトの名無しさん mailto:sage [2017/12/08(金) 19:34:22.58 ID:tPe4A27O0.net]
>>374
VBAは宣言しないのがデフォなんだから、いちいちDimなんちゃらってやってたら、そりゃ不便だろ。

386 名前:デフォルトの名無しさん [2017/12/08(金) 20:15:19.13 ID:F+K0Jtko0.net]
>>376
そうではなくて、変数の宣言構文がシンプルではないところを言っていると思うよ。

387 名前:デフォルトの名無しさん [2017/12/08(金) 20:45:47.90 ID:kuqPkTCcd.net]
やれやれ、また長い関数を書いてしまった

388 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 01:25:45.78 ID:naguWC2La.net]
宣言しない奴のコードは読みたくないな。
宣言全部入れてから持って来いと言うかも。

389 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 01:27:01.02 ID:vu3Y0INla.net]
>>375
VBAに慣れてれば、そんなの違和感無いけどな。

390 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 01:39:08.64 ID:vu3Y0INla.net]
>>373
それじゃコメントのしようがない。
どんな風に制御しているのかとか、結果はそのシュミレータソフトから取ってきてるんだろうけど、そこから逐次結果が得られてるのかとかの詳細が分からんと何とも言えない。



391 名前:デフォルトの名無しさん [2017/12/09(土) 11:52:36.39 ID:oQ1pndO0d.net]
Debug.Print もApplication.Statusbar もちょっと処理が重くなってくると表示が止まって役に立たない

392 名前:デフォルトの名無しさん mailto:sage [2017/12/09(土) 13:26:29.70 ID:Px3+LsGd0.net]
>>382
Debug.Printの次にDoEventsを書けばすぐに出力される

393 名前:デフォルトの名無しさん [2017/12/09(土) 20:32:20.11 ID:uW7BpcjHa.net]
コメント関連ありがとう。
もう、人には見せない用だけどくどいくらいコメント書きまくってるw

394 名前:デフォルトの名無しさん [2017/12/10(日) 08:18:11.50 ID:PzHPENwqa.net]
VBAの開発環境について
デバッグ作業してると2画面欲しくなるんだけど皆さんどうしてる?
vBEの画面と通常の画面をフルスクリーンで見たいし、VBEもコード書き込む画面のほかに現在の変数が分かる画面と実行結果が分かる画面が欲しいからノート1台でやってると画面グチャグチャ

395 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 08:41:31.53 ID:2VZ9i3vi0.net]
ノートはUPS付きのデスクトップとして使ってる
24インチのモニタに繋いで
無線キーボードとマウスで操作

396 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 09:29:22.82 ID:s+zBVK9X0.net]
モニタ2枚でやってるけど
ツールボックスのウィンドウとかフォームが画面の境界に表示されたりして
地味に対応していない感を醸し出してる。
フルHD以上なら1枚でもVBEを端っこによけておけば窮屈じゃないと思う。

それよりエディタの貧弱ぶりをどうにかしてほしい。
今時のIDEを触ると、VBEはふた昔前のオマケ機能なんだなと思い知る。

397 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 12:22:00.56 ID:w7IPLNC5r.net]
まあデバッグが必要になる様なマクロなんかこさえんなっで事だ

398 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 13:02:23.44 ID:rJurKCVR0.net]
デバグが不要なマクロって相当短くないと無理だろ

399 名前:デフォルトの名無しさん [2017/12/10(日) 19:23:33.18 ID:RKQe6ZfS0.net]
バグ発生に関与する要因としてコードの量のみを気にかけている
→ 初心者またはそれに準ずる低スキルのもち主

>>388を受けてバグが一切発生しない事を想定している
→ 0か100でしか物事を考えられないアスペ

デバッグをデバグと言っている
→ ガチのジジイか極端にセンスの悪い意識高い系

たった一言でここまでプロファイリング出来ました

400 名前:デフォルトの名無しさん [2017/12/10(日) 20:54:53.56 ID:DUp9AezHa.net]
え??コード書き書きしたら一度も動作チェックしないで実装するの?
すげー!
ほぼ途中で止まって黄色くなる身としては信じられない.
全ての動作の確認と変数の動作に変な所がないか見るの楽しい.
それに人が書いたコードで動作チェックするにもf8必要だし
ただ、F8連打も大変だから超ゆっくり動作する機能でもあればいいのに



401 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 21:56:00.33 ID:tyDER63C0.net]
虫見付けるたんびに「バッグだ!バッグだ!」言うんか 自分の発言に違和感無いんか

402 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 22:02:23.86 ID:UfhTQ4hV0.net]
プログラムがおかしい以上バグはバグだ
開発中に個人で見つけてるから影響が小さいというに過ぎないが
べつにいいじゃんバグでも

403 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 22:28:29.51 ID:rJurKCVR0.net]
リリース版を出すかどうかをデバグ作業と呼ぶかどうかの境界線にしてるって事なのかな?

バグまみれでリリースして、ネット経由でパッチを当てるのが当たり前になった事が原因で、
そういう感覚が生まれたって考えるとなかなか興味深い現象だな。

404 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 22:54:03.35 ID:5raOMeRU0.net]
お前、リアルで嫌われ者だろ

たった一文でここまでプロファイリング出来ました

405 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:42:33.59 ID:05lOR9eq0.net]
質問です。(スレチかもだけど、他よりここの人たちのほうがLevel高そうなので)
Excel2013 @Win10 64bit Core i7 Mem8GB

ここ数日でAutoFilterのパフォーマンスが急に悪くなったと感じています。
テーブルは2000行*50列程度。
症状としてはフィルタリング済みのシートをSelectする際にタイムラグが発生します。
最初原因が分からなかったのですが、設計を少しずつ切り落としていった結果、
フィルタ範囲に入力規則が設定されていたのが原因でした。
その内容はIMEOffのみ。
フィルタがかかってない場合は瞬時にシート切替できるのに、フィルタリングされていると
切替に数秒待たされます。
フィルタ列が増えるとラグが倍増します。
また、列要素の先頭行付近の要素でフィルタされている場合の方が影響が大きいです。

2〜3日前までこのようなことはなかったのに、、何かExcel環境自体がかわったのかと
思いくまなく調べるのですが、原因が掴めません。
(つづく)

406 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:43:42.33 ID:05lOR9eq0.net]
>>396
(つづき)
マクロやシート上の把握できていない設計要素の影響を除外するために新規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
(つづく)

407 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:44:00.59 ID:05lOR9eq0.net]
>>396
(つづき)

評価方法:
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日前までは上記
現象は発生していなかったので、、原因療法が知りたいです。

どなたか上記現象分かるかたいらっしゃいませんか?

408 名前:デフォルトの名無しさん mailto:sage [2017/12/10(日) 23:47:36.15 ID:VPQqZskd0.net]
>>398
思い当たるのは、FCUでIMEの挙動がおかしくなったという報告多数な件

409 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 03:47:36.99 ID:/hRyHJmR0.net]
>>399
Version1703なのでまだFallは当たってないようです。

410 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 11:20:26.75 ID:TIu41blJ0.net]
ホントMSはアップデートなのかウイルスなのか分からんことするよな・・・



411 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 13:06:28.39 ID:NoGJiqM0H.net]
>>401
ちなみに職場の環境
 Excel2010 @Win7
 Excel2013 @Win8
では再現しませんでした。
やっぱりなんらかのUpdateが当たったのか、それとも自分でなんかやらかしてるのか、、、

412 名前:デフォルトの名無しさん mailto:sage [2017/12/11(月) 13:32:28.01 ID:pEROMoD00.net]
午前中にメッセージが出てアプデするか? とか聞きゃあがったから「あいよ」ってんで気軽に再起動した
90%ぐらい完了した後で Cannot だってやんの しょーもないから電源落として午後

413 名前:再起動したら
また「アプデするか?」 って もうね、アホかと
[]
[ここ壊れてます]

414 名前:デフォルトの名無しさん mailto:sage [2017/12/12(火) 01:03:48.16 ID:vtwEo9S/0.net]
Windows
押しつけがましいアップデートメッセージが出て
いいえしまくってたんだけど
ちょっと目を離して風呂入ってたら勝手に合意したことにしてOSインストールされてた

そんな俺が客先で作らされてるのは顧客が一日黙ってたら契約に合意したことになるシステム

415 名前:デフォルトの名無しさん mailto:sage [2017/12/12(火) 04:17:56.67 ID:VGkGFTOK0.net]
質問です。
LastCellって簡単に取得できるのにHomePositionってこれといった決定打がないんですかね?
SendKeys以外で簡単に安定して取得する方法ってありますか?
できればSelectしなくてよい方法で。

416 名前:デフォルトの名無しさん [2017/12/12(火) 11:56:45.28 ID:R9+tEHmjd.net]
ADODB.Streamで大きめのテキストファイルを読むときLoadFromFileが重いので、Openの引数でファイル指定してから
ReadTextするようにしたいんですがうまくいきません。
パスをそのまま書いても、"file://C:temp/data.txt"のような書き方をしてもことごとくOpenのところで落ちてしまいます。
どう書けばいいんでしょうか?
ちなみに先頭100行を試し読みするときとかに使いたいです。

417 名前:名無し mailto:sage [2017/12/12(火) 12:18:28.61 ID:KlMiw57eM.net]
>>406
それならコード貼ったほうが早い
使い方云々が知りたいだけならググればいいし

418 名前:デフォルトの名無しさん [2017/12/12(火) 12:50:26.86 ID:R9+tEHmjd.net]
>>407
スマホなのでちょっと待ってて

419 名前:デフォルトの名無しさん mailto:sage [2017/12/13(水) 11:40:21.94 ID:5F7kXiJk0.net]
名前を付けて保存する際
最近使った“アイテム”が
今週〜,先週〜,しばらく前,という順番で使用履歴の各ファイル名が表示されます。

これを表示させない設定を教えてください。
よろしくお願いいたします。


スペック

OS=Win10
Excel2016
Officeバージョン=1710

420 名前:デフォルトの名無しさん mailto:407 [2017/12/13(水) 14:40:49.78 ID:5F7kXiJk0.net]
↑すいません、質問するべき板を間違えました。ここはVBAでしたね。
他で聞いてみます。



421 名前:デフォルトの名無しさん mailto:sage [2017/12/13(水) 22:03:05.49 ID:lbNGI0B20.net]
チョイ前に変数の宣言が話題になってたから俺も一ネタ言いたい

「redim で変数の宣言が出来る仕様はやめて欲しい」

変数名を間違えた時にエラーで気付けるように普段から変数の宣言を強制してるんだけど、
redim で配列を変更する時に変数名を間違えても
新たな別の変数扱いされてエラーにならないから気付かないことがある

配列変数でも宣言は dim 、要素変更は redim っていう風にしといてくれたらと願ってやまない

422 名前:デフォルトの名無しさん [2017/12/13(水) 23:22:51.89 ID:b+I23nON0.net]
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オブジェクト変数だから

誰か答えられる?

423 名前:デフォルトの名無しさん mailto:sage [2017/12/13(水) 23:34:03.63 ID:fRI8/I3E0.net]
そういう言語仕様なので

424 名前:デフォルトの名無しさん [2017/12/13(水) 23:49:56.82 ID:b+I23nON0.net]
わりと真面目に答えてくれ

オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない

なんのためのオブジェクト変数なんだ

Workbooks.Open(filename:= ApplicationGetOpenFilename)
これもパス付のファイル名なのになんで格納できるんだ?

425 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:01:33.96 ID:iqnmwrCv0.net]
まず型というものを理解してください
つぎに、プロパティというものを理解してください
つぎに、オブジェクトにはデフォルトプロパティというものがあるのを理解してください
あと名前付き引数に対する理解も必要ですね
VBAではSetでの代入とLet(を省略した)代入では意味が違うので、それもちゃんと区別してください

いちいち全部ここで解説はせんが
このぐらい理解すればたぶん答えはわかるだろ

426 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:13:48.84 ID:iqnmwrCv0.net]
まじめに答えといてやるけど
>オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない
たぶんお前がやってるのは、そのオブジェクト変数のデフォルトプロパティに代入しようとした
で、そのオブジェクトがそれを受け入れないからエラーがでたんだろうな

>Workbooks.Open(filename:= ApplicationGetOpenFilename)
>これもパス付のファイル名なのになんで格納できるんだ?
格納の意味が分からん
ApplicationGetOpenFilename(の結果)をたんにOpenの(filename)引数として渡してるだけ
ApplicationGetOpenFilenameの結果がOpenのfilename引数として適当だからエラーが出なかっただけ

427 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:14:33.99 ID:FrwGQASIx.net]
パス付戻り値っていう表現が凄い
Application.GetOpenFilenameの戻り値は、パス文字列か、パス文字列の配列か、ダイアログがキャンセルされたときに返されるFalseかのいずれかしかない
パス付って、何にパスがくっついてると理解してるんだろう
パスが戻り値そのものだろう

428 名前:デフォルトの名無しさん [2017/12/14(木) 00:18:35.88 ID:oVDd8Fug0.net]
>>416
意味がわからん
初心者相手に専門用語で勝った気になるなよ

429 名前:デフォルトの名無しさん [2017/12/14(木) 00:21:23.88 ID:oVDd8Fug0.net]
>>417
パスってのは
¥C:のことだろ?
openメゾットの戻り値も¥C:ついてるのに
WBオブジェクト変数に格納できる意味がわからない
専門用語でこたえるな わかりやすく答えろ
外人相手に口喧嘩して勝ち誇ってるやつと同じだわ

430 名前:デフォルトの名無しさん [2017/12/14(木) 00:23:38.19 ID:oVDd8Fug0.net]
workbookのオブジェクト変数のデフォルトプロパティってなんだよ
そこを答えろ
答えろって言わないと答え出て来ねえのかよ



431 名前:デフォルトの名無しさん [2017/12/14(木) 00:24:22.55 ID:oVDd8Fug0.net]
ちなみにおれはVBA初めて3時間
ここまでの疑問が出るだけすごいと思うけど

432 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:24:26.11 ID:0XKK4N9O0.net]
>>412
>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)
じゃないと動かないよ
理由は前述のとおり

433 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:32:01.43 ID:FrwGQASIx.net]
>>419
Openメソッドの戻り値はパスではなく、Workbookオブジェクトそのものだ

開いているブックの集まりであるWorkbooksコレクションオブジェクトに、引数Filenameで指定したブックを追加して、戻り値としてそのブックそのものを返す処理だ


何か根本的に勘違いしてるだろ君

434 名前:デフォルトの名無しさん [2017/12/14(木) 00:33:36.37 ID:oVDd8Fug0.net]
>>422
お前がまだわかりやすいな

ただし
おれはすでに開いているファイルじゃないと操作できないとかは全部知っている
オブジェクト型変数の前にsetステートメントを置くことも知っている

つまり
Application.GetOpenfilename = ファイルを開いた時は文字列が返される
workbook型に返せないのか?
答えはパス付きの文字列で帰って来るためにノーだ
これも知ってる

Workbooks.Open filename:=Application.GetOpenfilename

これも知っている
しかし結果としては
ファイルを選択で開いたパス付き文字列を開く
という命令なはず

同じパス付き文字列なのにworkbook型に格納できないのが意味がわからない

435 名前:デフォルトの名無しさん [2017/12/14(木) 00:35:42.03 ID:oVDd8Fug0.net]
>>423
ん?なんで?
msgboxで表示されてもパス付きになるよ?

436 名前:デフォルトの名無しさん [2017/12/14(木) 00:41:28.15 ID:oVDd8Fug0.net]
またも意味不明な現象が起きた

拡張子を指定しなかったのに開いた
拡張子を指定したらなぜかエラーが出た
なんでだ?


https://i.imgur.com/lqUNtRU.jpg

437 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:42:52.81 ID:FrwGQASIx.net]
>>420
オブジェクトには、特にプロパティ名を指定しないでアクセスする場合に、優先的に参照されるプロパティが決められていて、それをデフォルトプロパティと呼ぶ
オブジェクト型に合わないデータを代入してしまう構文になっているときでも、データの型がデフォルトプロパティの型に適合していればVBAはデフォルトプロパティへの代入として解釈して処理を受け付ける

438 名前:デフォルトの名無しさん [2017/12/14(木) 00:44:33.92 ID:oVDd8Fug0.net]
>>423

Workbooks.Open(filename:= ApplicationGetOpenFilename)
→\C:〜〜〜〜という文字列が返される

ApplicationGetOpenFilename
→これも同じ

なぜ前者はWorkbook変数に格納できて
後者はできないんだ?

439 名前:デフォルトの名無しさん [2017/12/14(木) 00:45:53.39 ID:oVDd8Fug0.net]
>>427
そんなもん知ってるわ
Rangeやcellsのvalueみたいなもんだろ?

Workbookオブジェクトのデフォルトプロパティはなんだ?

440 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:48:20.20 ID:0XKK4N9O0.net]
>>424
悪いけど>>412 の書き方じゃ分かってるようには見えない
set を付けてない時点でこの人は分かってないんだなと判断されても仕方ない

そして
>Application.GetOpenfilename = ファイルを開いた時は文字列が返される
も間違い
Application.GetOpenfilename は、
あくまでもファイルのパス情報を文字列(或いは false)で返すだけで
実際にブックを開けることはしない
だから正確に書くと
Application.GetOpenfilename = ファイルを「選択した」時は文字列が返される
というべきで、そのブックを開くためにworkbooks.open を用いる必要がある



441 名前:デフォルトの名無しさん [2017/12/14(木) 00:51:58.64 ID:oVDd8Fug0.net]
>>430
set

オブジェクト変数を代入するとこに扱うステートメント

442 名前:デフォルトの名無しさん [2017/12/14(木) 00:53:08.36 ID:oVDd8Fug0.net]
>>430
ファイルを開いたっていうのは
選択したって意味なんだが

オブジェクトとOPENメゾットで初めて開く

こんなの知っている

443 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:53:19.64 ID:0XKK4N9O0.net]
>>430でもまだ不正確だった
より正確に言うと

Application.GetOpenfilename =
「開きたい(あるいは移動、コピー、改名、削除など何らかの操作をしたい)」ファイルを「選択した」時は文字列が返される

ですね

444 名前:デフォルトの名無しさん [2017/12/14(木) 00:55:08.87 ID:oVDd8Fug0.net]
>>433
んなもんしってるわ
キャンセル押されたらフェイルス
ファイルを選択したらパス文字列

445 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:56:13.50 ID:0XKK4N9O0.net]
>>432
いや、それが分かってるなら何を問題にしてるのかがよく分からない
それと「メゾット」じゃなくて「メソッド」ね

446 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:56:39.81 ID:pIjJ7/MG0.net]
真面目に答えるんじゃなくて
わりと真面目に答えるように

447 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 00:58:18.78 ID:FrwGQASIx.net]
>>420
ちなみにworkbookオブジェクトのデフォルトプロパティは存在しない
存在しないから当然、workbook型に合わないデータは代入できない

448 名前:デフォルトの名無しさん [2017/12/14(木) 01:00:54.08 ID:oVDd8Fug0.net]
>>437
じゃあなんで
workbook.openのパス文字列は入るんですかねえ

449 名前: []
[ここ壊れてます]

450 名前:デフォルトの名無しさん [2017/12/14(木) 01:01:13.61 ID:oVDd8Fug0.net]
ここまで答えなしだが
誰もわからないのか?



451 名前:デフォルトの名無しさん [2017/12/14(木) 01:01:34.43 ID:oVDd8Fug0.net]
おれの質問ってVBAの穴をついた?

452 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:04:09.93 ID:0XKK4N9O0.net]
質問の意味がわからないんですよね
何が疑問なのか、独自表現を用いずに、
set やなんかも省略せずに正しく動作するコードと
動作しない理由が知りたい動かないコードを書いてみてもらえます?

453 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:05:31.95 ID:FrwGQASIx.net]
>>428
workbooksは、workbookクラスではない
別のオブジェクトのクラスだ

それから、さっきも書いたが、Openメソッドの戻り値は引数で指定されたパスを持つWorkbookオブジェクトなのであって、Openメソッドによってパス自体が戻ってくる訳ではない
パスを返してくるApplicationクラスのGetOpenFilenameメソッドとは全く働きが違う
プロパティやクラスや引数の名前で何となくbookとかfileとか付けばパス付のWorkbookオブジェクトが返ってくるものと混同してるようだが、きちんと区別しないといけない

454 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:13:20.35 ID:FrwGQASIx.net]
>>438
Openメソッドが要求する名前付き引数Filenameに、GetOpenFilenameで取得したパスを設定して、その結果新しく開いたWorkbookオブジェクトが返っているからだよ
このFilenameはApplication.GetOpenFilenameメソッドの戻り値ではあるけど、Workbooks.Openメソッドの戻り値ではない
Worksheets.Item(Index:=ActiveSheet.Name)みたいな処理と一緒だと言えば少しは分かるか?

455 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:13:59.17 ID:FrwGQASIx.net]
>>440
突いてない
典型的な初心者の質問

456 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:17:18.86 ID:LaUulqGP0.net]
典型ではないな
低次元な初心者の質問

457 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:22:45.67 ID:FrwGQASIx.net]
たぶんこの質問者は、コレクションを知らないタイプだな、
それから、式に含まれるプロパティ名やメソッド名をオブジェクトのクラス名と同一視しているタイプだろう

458 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 01:34:07.25 ID:n2gI2QxJ0.net]
たぶんハイパーリンクでパスが表現される事が多いところから、
パスが文字列とは異なるデータ型を持つ何かだと勘違いしてるだけじゃないの?

459 名前:デフォルトの名無しさん [2017/12/14(木) 07:32:56.86 ID:oVDd8Fug0.net]
>>443
workbooks.open filename:=Application.GetOpenfilename

この場合はworkbooksオブジェクトに選択したパス文字列が格納されるのか?
だからworkbook型に格納できるのか?

460 名前:デフォルトの名無しさん [2017/12/14(木) 07:37:06.65 ID:oVDd8Fug0.net]
>>446
ん?
workbooks
worksheets
rows

これはコレクションだろ?
コレクションはオブジェクトの最上位

プロパティはオブジェクトの何?
メゾットはオブジェクトに命令

違うか?



461 名前:デフォルトの名無しさん [2017/12/14(木) 07:40:17.60 ID:oVDd8Fug0.net]
マジでわかりやすい答えがない

462 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 08:30:04.65 ID:mohvOYX1x.net]
>>448
君の言う「格納」は、コレクションへのオブジェクトインスタンスの追加、プロパティ値の設定、変数への代入、引数の受け渡し等がごちゃごちゃになっていると思う
まず、Workbooksコレクションに、データの代入はできない
WorkbooksコレクションはWorkbookオブジェクトの集まりを要素に持つコレクションオブジェクトだから

それから、Workbooks.Open Filename:=Application.GetOpenFilenameという構文は、Workbook型の変数に値を代入しているわけではない
Filenameという名前付きで定義されたOpenメソッドの文字列型の第一引数に値を渡していて、その結果としてOpenメソッドがWorkbookオブジェクトを返しているわけで、オブジェクト型変数への代入ではない

463 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 08:45:33.01 ID:YV9D93CW0.net]
>>449
コレクションは最上位じゃない
一番上にあるのはオブジェクト

464 名前:デフォルトの名無しさん [2017/12/14(木) 08:46:43.07 ID:QIiUylbtp.net]
>>451
いやそんなのしってるんだけど

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オブジェクト型変数に代入される意味がわからない
これをはっきり答えろ
わかりやすくな

465 名前:デフォルトの名無しさん [2017/12/14(木) 08:47:18.91 ID:QIiUylbtp.net]
>>452
一番上

最上

日本語やり直したほうがいい

466 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:00:03.55 ID:n2gI2QxJ0.net]
>>453
Set wb = Application.GetOpenFilename

は、String型をWorkbook型のポインタへ代入しようとしてエラー吐いてる。

Set wb = Workbooks.Open(Application.GetOpenFilename)
Set wb = Workbooks.Open("目的のワークブック.xlsx")

は、OpenメソッドにString型変数を渡しているから機能する。

467 名前:デフォルトの名無しさん [2017/12/14(木) 09:02:02.66 ID:QIiUylbtp.net]
>>455
workbook型のポインタってなに?
これがわかればすっきり

468 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:02:04.79 ID:CHPwg0pDx.net]
>>449
コレクションはオブジェクトの最上位、という発想がそもそも間違い
コレクションは子要素に追加されているデータやオブジェクトへのアクセス等を提供する、子要素からは独立したオブジェクトだ

更に、WorkbooksコレクションオブジェクトはWorkbookオブジェクトのみを要素に持つようにあらかじめ最適化された規定のコレクションオブジェクト

469 名前:デフォルトの名無しさん [2017/12/14(木) 09:05:19.87 ID:QIiUylbtp.net]
>>455
WB型変数に文字列代入は不可
メゾットの戻り値の代入は可能ってこと?

なんで?

470 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:05:51.56 ID:YV9D93CW0.net]
>>454
日本語だけ知ってても言語仕様を正確に説明する難しいんだよ

コンピューター業界では「上位」などの言葉には特別な意味を持たせる場合もあるし、
とくに相手がド素人だと、言葉の意味から説明するのも面倒だから、あえて上位という単語は避けた上で
なんとなく通じてくれそうな「上」って言い方をしたんだよ

お前の態度が気に入らないからワッチョイ Spc7はNGするわ
人に何か質問する時は最後までていねいな言葉を使え



471 名前:デフォルトの名無しさん [2017/12/14(木) 09:07:28.47 ID:QIiUylbtp.net]
>>459
うんこーwwwwwwwwwwうんこーwwwwwwwwww

472 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:08:52.24 ID:CHPwg0pDx.net]
>>453
そもそもApplication.GetOpenFilenameはブックを開いてブックへの参照を返すメソッドじゃなくて、ユーザーにダイアログ画面上で選択させたファイルのパスを返すメソッドなんだが
メソッド名で混乱してるだろ君

473 名前:デフォルトの名無しさん [2017/12/14(木) 09:11:20.55 ID:QIiUylbtp.net]
>>461
いやしってるけど

キャンセルが押されたらフェイルスだし
選択したらパス名が返って来る

何回言えば気がすむんだよ

474 名前:デフォルトの名無しさん [2017/12/14(木) 09:12:47.30 ID:QIiUylbtp.net]
Openメゾットはただブックを開くだけだろ?
ただし 引数を戻り値として得られる
つまり 開いたファイル名がOpenメゾット内にある

違うかい?いい線いってる?

475 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:13:02.91 ID:n2gI2QxJ0.net]
>>458
なんでも何もデータ型が一致するかどうかが問題であって、メソッドの戻り値の型は一致するってだけ。

たぶんJavaScriptから始めたせいで認識がおかしくなってるんだろうけど、
普通はデータ型が異なる変数同士の代入は出来ない。

476 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:14:18.68 ID:CHPwg0pDx.net]
この質問者みたいな人が言語仕様について思い込みや勘違いをしたまま共用マクロを組んだりすると、会社にとって迷惑なだけなんだよな
作ったマクロを他人と共有しないことを祈るのみ

477 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:20:19.35 ID:CHPwg0pDx.net]
>>462
それ俺がきのう説明したことだよねw
オブジェクト型変数にGetOpenFilenameから返った文字列型データやデータ配列を設定しようとしてるのがおかしいんだがw
データ型とか一回学んだ方が良いと思うよ

それから蛇足だけど、フェールスじゃなくて、フォルス、フォールス、ファルスの何れかの表記にしないと、Falseのことだと理解してもらえないことが多いと思うよ

478 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 09:25:08.03 ID:CHPwg0pDx.net]
>>463
引数の文字列は戻り値にならない
Openの戻り値はWorkbookオブジェクトの実体だ
Workbookオブジェクトの実体とパス文字列はイコールじゃない

それから、メゾットじゃなくてメソッドな
あんまり特徴的な言葉づかいしてるとメゾット君と
フェールス君とか呼ばれたりするかもしれないから気を付けなよ

479 名前:デフォルトの名無しさん [2017/12/14(木) 09:30:34.82 ID:QIiUylbtp.net]
>>467
実体でなに?どころどころで補足質問しねえといけねえのかよ

480 名前:デフォルトの名無しさん [2017/12/14(木) 09:31:25.92 ID:QIiUylbtp.net]
>>464
変数同士?
workbook型あとは何?
これも補足質問



481 名前:デフォルトの名無しさん [2017/12/14(木) 09:32:51.20 ID:QIiUylbtp.net]
>>466
データ型の参考ページは?
猿でもわかるやつ

482 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 12:17:27.13 ID:7XekaZVWx.net]
>>470
その言い方は猿に対して失礼だぞメゾット君

WordやPowerPointのVBAと違ってExcelは「Excel VBA データ 型」でググれば腐るほど情報が出てくるから、好きなページを読んで出直してきたらいいさ
インスタンスもググってみたらいいよ

483 名前:名無し mailto:sage [2017/12/14(木) 12:34:50.44 ID:DWbie50BM.net]
>>468
Workbookの実体とは開いて実行しているエクセルブックのことだよ。ブックはVBAが管理しているメモリ上のデータではないってこと。そこにアクセスする為の情報だけがWorkbook型変数には格納されている。
これ以上はググったほうがいいな。メゾットちゃんには言葉だけでは通じないみたいだし。

484 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 12:36:44.73 ID:bra/P7/Ad.net]
どう考えてもこいつは型も文法も戻り値も

485 名前:理解できてないだけだろ []
[ここ壊れてます]

486 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 12:45:31.15 ID:PlqHEg1vH.net]
インスタンスはお湯かけて3分で完成するよ

(´・ω・`)b

487 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 13:37:10.14 ID:D0PQd/9/a.net]
体系だてた答えがほしいならオブジェクト指向あたりの本読んだ方がいいんじゃねえの
正確にはオブジェクト指向じゃないけどクラスとインスタンス(やそれにくっついてるメソッドやプロパティ)の関係を理解するにはそれがはや道だわ
ここは教科書じゃないから

488 名前:デフォルトの名無しさん [2017/12/14(木) 14:17:01.84 ID:QIiUylbtp.net]
なんでぱぱっと答えられねえの?頭悪いの?

489 名前:デフォルトの名無しさん [2017/12/14(木) 14:18:03.10 ID:QIiUylbtp.net]
>>472
ふーん
開いてから格納する

これだけだよね?詰まる所は

490 名前:デフォルトの名無しさん [2017/12/14(木) 14:27:22.00 ID:QIiUylbtp.net]
Openメソッドで開かないと
workbook型に入らない



491 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 14:28:58.06 ID:oiVEYMPnp.net]
それは結果に過ぎない
ちゃんと原因や理屈を押さえないとまた同じことで詰むぞ

492 名前:デフォルトの名無しさん [2017/12/14(木) 14:49:26.55 ID:QIiUylbtp.net]
>>479
それをわかりやすく教えて
ほんとにわかりやすく

493 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 14:51:48.29 ID:/xE3TN/oa.net]
>>480
無理だよ

494 名前:デフォルトの名無しさん [2017/12/14(木) 15:05:19.17 ID:QIiUylbtp.net]
>>481
別の言葉に置き換えればいいだろ?

495 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 15:22:14.17 ID:yqG/N6/gM.net]
ID:QIiUylbtpはVBA以外の言語知ってるの?
それともExcel VBAで初めてプログラミングに触れましたって人?
お前の学習レベルがわからないからお前でもわかるように説明できないんだ

496 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 15:43:20.73 ID:Sk339KZTa.net]
ここには、彼の疑問に答えられるような人はいない。

こんぴゅうたーのでんげんをいれるとどうしてえくせるがうごくのかをせつめいするのはむずかしい。
でんきにはつうでんしてるときとつうでんしていないときがあるのでそれをりようしてぜろといちをくべつできる。
ぜろといちをくべつできればにしんすうをりようして...

497 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 17:51:08.32 ID:Gx1HQ3cua.net]
大体教えてもらう立場のやつがとる態度じゃないからまともに取り合ってもらえると思ってる時点で頭が悪い

498 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 18:34:15.80 ID:Dm16MIru0.net]
初心者なのに態度悪いからNGにしたわ。
教えてもらう態度じゃないよね。子供ならまあ納得だけど。

499 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 19:23:24.80 ID:IXGcMbV0a.net]
そもそもWorkbooksに指定するのはエクセルファイル名じゃない。
ブック名だ。
開いたブックのブック名とファイル名が同じになるから勘違いしてる奴もいるかもしれんが。

500 名前:デフォルトの名無しさん [2017/12/14(木) 19:24:50.30 ID:oezENCsV0.net]
同じだったらファイル名でええやんw何鼻息荒くしてんの?w



501 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 20:32:08.46 ID:g1PrWAQxx.net]
>>487
恐らく>>486はWorkbooks.Itemの引数について話してるんだろうだが、君にはそのあたりが分からんみたいだな

502 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 20:33:08.02 ID:g1PrWAQxx.net]
>>489
安価間違えた、これは>>488

503 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 21:01:41.06 ID:bra/P7/Ad.net]
>>455
をもとに考えてみた

お金を入れるとカップにジュースが注がれる自販機を思い浮かべるんだ

Set wb = 'ジュースが入るカップ
Workbooks.Open( _'お金を判別してボタンが押されるとジュースを出す回路
Application.GetOpenFilename _'お金
)
→お金を入れてボタンを押したらカップにジュースが注がれる

Set wb = Application.GetOpenFilename
→カップに直接お金を入れて飲めないと騒ぐあほ

どうだ!?

504 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 21:06:22.48 ID:zDxHi8mM0.net]
>>453
お前バカだろ
変数wbはただの入れ物
workbook型しか入れられない入れ物にString型入れようとしてんだぞ?
これでわからないならただのバカだから二度と来るな

505 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 21:25:56.75 ID:oezENCsV0.net]
>>492
おまえのカアチャンは誰でも受け入れるのにwbって意外と固いんだな

506 名前:デフォルトの名無しさん [2017/12/14(木) 21:27:02.90 ID:QIiUylbtp.net]
>>492
うん
それはしってるよ
でもworkbooks.Openでも同じだよね
文字列帰って来るよね

507 名前:デフォルトの名無しさん [2017/12/14(木) 21:32:46.73 ID:QIiUylbtp.net]
application.getOpenfilename
→あ.xlsxを選択
C:¥あ.xlsx が帰って来る

workbooks.Open filename:=application.getOpenfilename(つまりC:¥あ.xlsx)

ん?どっちもパス付きのブック名じゃねえの?
ってことをいってる

508 名前:名無し mailto:sage [2017/12/14(木) 21:55:08.02 ID:5D+dY0yO0.net]
>>495
文字列として返ってきたから文字列型と思ってるなら、一回workbook型をウォッチに入れてみたら?
ツリー形式でオブジェクトの、中身が見れるから全然別ものだとわかるはず

509 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 21:58:53.83 ID:zDxHi8mM0.net]
>>494
バーカw
"C:\うんち.xlsx"がworkbooks型の変数に代入できる分けないだろw
まあデフォルトプロパティなんてものが罪なんだが
てか、workbooks型のデフォルトプロパティってNameプロパティなんだな(Pathか?)
はじめて知ったわ、使わんから

510 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 22:19:18.62 ID:cH/6/SdG0.net]
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



511 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 23:32:44.97 ID:IXGcMbV0a.net]
>>488
違う。
新規ブックの場合はファイル名じゃないだろ。
理解出来て無い奴に理解出来る奴向けの説明をしても駄目だ。

たまたま同じになってもブック名はファイル名じゃ無い。
だからパス付きだろうがパス無しだろうがファイルはファイルだと考えても、それとは関係ないブック名は違う。
C:¥abcd.xlsxというファイルとブック名としてのabcd.xlsxとは何の関連も無い。
似たように見えるのはたまたまだ。
だからC:¥abcd.xlsxはブック名には成りようがない。

>>495
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に格納するってこと。

512 名前:デフォルトの名無しさん [2017/12/14(木) 23:34:29.57 ID:oVDd8Fug0.net]
短くわかりやすくまとめられるやついねえの?
いくらVBAができたって引き継ぎができない奴は無能なんだが

513 名前:デフォルトの名無しさん [2017/12/14(木) 23:41:16.00 ID:oVDd8Fug0.net]
俺もずっとROMってたけど
こいつらの説明はマジで意味不明だわ

お、良い線言ってんな って思ったらいきなりカタカナ語がでてきてググっても意味不明
こいつらマジもんのコミュ障すぎてイラつきしかない

オナニー発言ばっかで答えがない

Apllcation.GetOpen
でaaaっていうエクセルを開く

C:\aaa.xlsx が返ってくる
しかしWB(Workbookオブジェクト変数にしている)では指定できない

でも
Workbooks.Open filename:=Apllcation.GetOpen
これはWorkBook型に入る

つまるところどっちもC\aaa.xlsxって文字列を

514 名前:返してんじゃねえの?何がちげえの?ってこと

これいうの10回目ないい加減学習しろイラつくな
[]
[ここ壊れてます]

515 名前:デフォルトの名無しさん [2017/12/14(木) 23:44:38.82 ID:oVDd8Fug0.net]
こいつらのたとえ

子供がリンゴを指さす
「これなに?」

こいつら
「これは物質○○が含まれて○○っていう色素があって赤い、つまり栄養は○○がふくまれている
ちなみにその栄養は○○って物質にも入っている」ドヤァ

って感じ
見ててムカつくから発言したわ

516 名前:デフォルトの名無しさん [2017/12/14(木) 23:46:05.94 ID:oVDd8Fug0.net]
おれが聞きたいのは

なんでワークブックスオープンで指定したファイル名文字列だとワークブック変数に格納できんだよって話
ゲットオープンはパスがついているから格納できないのはわかった

わかりやすく答えろ

517 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 23:55:54.24 ID:n2gI2QxJ0.net]
前にいた関西弁の荒しと同一人物なんだろうけど、健気にもちょっと勉強してきてるのが笑えるw

518 名前:デフォルトの名無しさん mailto:sage [2017/12/14(木) 23:56:28.06 ID:qidVZ8HWa.net]
>>503
無理。
軍事用にコンピューターというものが発明されてから今日までの歴史と仕組みを説明しなきゃならんから。
そして、君にそれを理解出来るだけの能力が有るとは思えないから。

大抵の人は全てを理解しているわけじゃ無いが、自分の利用している範囲ぐらいは理解している。

519 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:06:16.08 ID:sv72SjNaa.net]
>>501
ん?
>Apllcation.GetOpenでaaaっていうエクセルを開く

これ間違い。
開かない。
ファイル名を取得するだけ。

>しかしWB(Workbookオブジェクト変数にしている)では指定できない

ファイル名じゃないからな。
ブック名を指定する必要がある。
たまたま偶然ファイル名と同じだけどパス付きはブック名とは違うな。

>Workbooks.Open filename:=Apllcation.GetOpen
これはWorkBook型に入る

Workbook型に入ってるのはファイル名じゃない。
Set WB=Workbooks.Openの意味するところはfilenameに指定された文字列をファイル名と見立ててブックを開き、もし仮に運よく開くことができたらそのブックをWBに格納するという意味。

520 名前:デフォルトの名無しさん [2017/12/15(金) 00:18:22.73 ID:qta4Ddk+0.net]
>指定された文字列をファイル名と見立ててブックを開き

これが意味不明

GetOpenで指定したファイル名を返すんだろ?
じゃあこれはファイル名になるじゃねえのか?
ファイルを開かなかった場合はファルスがかえることはわかる



521 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:22:57.61 ID:OGmesrFEa.net]
>>507
GetOpenFilenameの文とWorkbooks.Openの文は別の文だろ。
プログラム組む奴はGetOpenFilenameで取得したものと違うものを入れることも出来る。
だから結果的に入ったのはファイル名でも、
Workbooks.Open自身はそれを前提にはしないだろ。

522 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:25:39.28 ID:HZMi2rOwd.net]
>>498
このレスの一番下がわかりやすいんじゃない?

523 名前:デフォルトの名無しさん [2017/12/15(金) 00:26:48.82 ID:qta4Ddk+0.net]
>>508
日本語話して
ドヤ顔くん

524 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:26:50.88 ID:Ma3k2IENa.net]
GetOpenFilenameはメモ帳のファイル名を取って来ることも出来る。
Wordのファイル名を取って来ることも出来る。
Workbooks.Openで開けないファイル名ということも有るし、Workbooks.Openで開けるファイル名だとしてもExcelで開かなければならないということも無い。

525 名前:デフォルトの名無しさん [2017/12/15(金) 00:27:25.61 ID:qta4Ddk+0.net]
>>509
オブジェクトブラウザーでてなんだよ
わからねえよ

526 名前:デフォルトの名無しさん [2017/12/15(金) 00:28:29.79 ID:qta4Ddk+0.net]
>>511
あーなんとなくわかったかな
Openメソッドで開ける=エクセル型=ワークブック型に格納可能

ってこと?

527 名前:デフォルトの名無しさん [2017/12/15(金) 00:32:05.55 ID:qta4Ddk+0.net]
>>498
つまりだ
君が言いたいのは(要約しないとダメなのかよ、、、)
application.GetOpenfilenameだと文字列として返ってくる
workbook型には文字列は入らない

こういうことが言いたいのね?

528 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:33:26.47 ID:JSBwNcqSa.net]
>>510
それはコンピューターというものをまるで理解出来ていないからそうなる。
厳密には
strFile = Application.GetOpenFilename
が実行されたからstrFileはファイル名だろとコンピューターに言っても、コンピューターは違います、文字列です。と言う。
strFileに入っている文字列のファイルは有るのかと問えば、有ります。と言う。
じゃあ、strFileはファイル名じゃねえかと問えば、違います、文字列です。と言う。

コンピュ−ターは人間が考えるような意味を理解しない。
定義通り動くだけ。

529 名前:デフォルトの名無しさん [2017/12/15(金) 00:35:45.56 ID:qta4Ddk+0.net]
>>515
また回りくどい言い方してんな


530 名前:頭悪いのか []
[ここ壊れてます]



531 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:39:33.42 ID:OGmesrFEa.net]
>>514
その理解で良い。

532 名前:デフォルトの名無しさん [2017/12/15(金) 00:41:12.92 ID:qta4Ddk+0.net]
>>517
最初からこう言えよ
馬鹿じゃねえの?
ほんとにバカしかいねえよ
呆れるというか心配になってくる

533 名前:デフォルトの名無しさん [2017/12/15(金) 00:42:06.72 ID:qta4Ddk+0.net]
補足するとworkbook.Openで返ってくる(開く)=workbook型ということね

534 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:42:07.75 ID:W4xtzKqva.net]
>>516
君がどこまで分かって無いのか、こっちは分からないんだ。
エスパーじゃ無いんだから。

>>514の話だって型とは何だ?という説明もしなきゃならんのか?と考えれば>>515のような話も必要になって来る。

535 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 00:57:45.39 ID:2M4lhz74x.net]
>>518
最初からみーんなそう言ってるぞw
ようやく頭が追い付いてきたのかな?

536 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 01:03:08.36 ID:2M4lhz74x.net]
メゾット君もだんだん自分の頭の悪さを自覚してきてるみたいだし、あと二日以内には恥ずかしい捨て台詞を残して消える運命かな
レス保存したからいつでも再放送出来るけどなwww

537 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 01:23:44.47 ID:IJmI7Oq80.net]
>>514,518
>>415でまっさきに型を理解しろって言ってんだが
まあここまで食い下がる根性は認めるけど、いいかげん最低限は自分で勉強してくれ

538 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 01:24:37.63 ID:JMZCHg3W0.net]
多分Excel VBA入門的な記事を読み進めればすぐに理解できたと思うんですけど
勉強の進め方が下手くそすぎる

539 名前:デフォルトの名無しさん [2017/12/15(金) 09:26:34.27 ID:qta4Ddk+0.net]
で、この型をしっかりと説明してるのはどこだ?

540 名前:デフォルトの名無しさん [2017/12/15(金) 09:27:43.96 ID:qta4Ddk+0.net]
URLでもなんでも貼ってよ



541 名前:デフォルトの名無しさん [2017/12/15(金) 10:46:54.06 ID:qta4Ddk+0.net]
ちなみにさ
VBAってなんでメンテナンスがいるの?
コードを直接弄るわけじゃないからバグなんてでないと思うけど

542 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 11:01:21.94 ID:sRcKW4ZTM.net]
てめーの提示したコードエラー出まくりバグばっかじゃねーか

543 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 11:23:22.68 ID:HChVIO9E0.net]
コードは変わらなくてもWindowsとかExcelとか業務仕様とか、まわりが変わっていく

544 名前:デフォルトの名無しさん [2017/12/15(金) 11:26:16.78 ID:qta4Ddk+0.net]
VBAは楽しいぞ
俺はmos マスターだがVBAはいっさん知らんかった
最終目標としては意味不明な超複雑なコードを記述し
おれが辞めた後は誰も対処ができないという優越感を味わいたい
そしてVBEをだしてカチカチしてる姿がなんとも知的でかっこいい
ほんとこれだけのきっかけが知識につながって行く

545 名前:デフォルトの名無しさん [2017/12/15(金) 11:36:34.77 ID:yfj2Ro7Gd.net]
今どきVBAに新規参入者がいる驚き

546 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 11:48:05.70 ID:HChVIO9E0.net]
>>530
>>500

547 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 12:00:52.51 ID:IqUBh/zH0.net]
>>530
それは能力の低い奴の言う言葉。
能力のある奴はお前が辞めても対処できるように記述する。

548 名前:名無し mailto:sage [2017/12/15(金) 12:08:15.31 ID:aoP9DSfXM.net]
>>530
いや、ずっと同じ質問してる辺りこれっぽっちも知識が増えているように見えないんだが
そしてブーメランに草

549 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 12:11:37.98 ID:IqUBh/zH0.net]
>>523
そこをあっさり理解出来ないからここまで時間制掛かってる。
彼の分かってない所はみんながそういうもんだとあっさり進む所で自分中心で考えること。
コンピューターが自分と同じように考えてくれると思ってる。

アレンブラやマシン語の不自由な世界で自分と同じようには考えてくれないということを思い知った方が良い。

550 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 12:26:43.87 ID:SvHkecGU0.net]
もの凄く複雑で他人の理解が及ばな



551 名前:「ようなコード書くのが目標なら、
なおさら誰の助けも借りずに独学で高めていくのが重要なんだよなぁ。

ネットで検索して簡単に見つかるような情報すら当たれないヤツが目指すものじゃないよね。
[]
[ここ壊れてます]

552 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 12:27:05.72 ID:JZsZmqT4r.net]
>>499
いやなんかまた鼻息荒くしちゃってるけど元々同じって言ったのお前だからなw

なんで素直にブック名とファイル名は違うって言えないんだよw
どうせ下手くそな説明なんだから無理して技巧的に言おうとすんなw

553 名前:デフォルトの名無しさん [2017/12/15(金) 12:27:38.94 ID:qta4Ddk+0.net]
>>535
こいつらのオナニー意見なんて一切参考にせず自己解決したんだが?

Wrokbook型変数「これは文字列だから俺の方にははまらないよ」 = _
Application.GetOpenFilename「すまん、俺はただ選択されたファイルの文字列を返すだけなんだよ」

Workbook型変数「お、WorkbooksオブジェのOpenメソッドで開いとるやん。格納できるよ」= _
Workbooks.Open (Filename:=Application.GetOpenfilename)「俺は開いた文字列をファイル名として返すね」

これでどう?誰でもわかりやすいと思うけど?
頭悪すぎね?君たち

554 名前:デフォルトの名無しさん [2017/12/15(金) 13:00:25.68 ID:yfj2Ro7Gd.net]
なんか
1 + 1 =2

「1に1を加えると2になる」
と表現してる感じだなあ

555 名前:名無し mailto:sage [2017/12/15(金) 13:01:13.53 ID:aoP9DSfXM.net]
もう突っ込まないぞ!
次のお客様どうぞ

556 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 13:03:33.01 ID:SvHkecGU0.net]
>>539
そもそもWorkbooks.Openメソッドはファイル名を返さないから、
「1+1 は 2 じゃないぞ。俺たちは 1 + 1で200だ。10倍だぞ10倍」みたいなもん。

557 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 13:34:09.09 ID:8rowC9ysa.net]
>>538
わかった!君はプログラムじゃなくて日本語の勉強から始めよう

558 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 13:34:59.69 ID:8rowC9ysa.net]
会話形式にしてくれないと理解できないといってくれれば誰か頑張ったかもねw

559 名前:デフォルトの名無しさん [2017/12/15(金) 13:57:32.57 ID:qta4Ddk+0.net]
>>541
はいはいブック名ね
どっちでもいいだろアホ

560 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 14:06:04.35 ID:SvHkecGU0.net]
>>544
ブック名も返さないよ。
何にせよWorkbooks.Openメソッドが名前を返したら

Set WB = Workbooks.Open(Application.GetOpenFilename)

が成立しないから。



561 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 14:12:36.10 ID:sRcKW4ZTM.net]
いいからMSDNのリファレンス読んでこいよ

562 名前:デフォルトの名無しさん [2017/12/15(金) 14:42:08.62 ID:qta4Ddk+0.net]
>>545
はいはい
workbookオブジェクトを返すのね
はいはい死ね死ね

563 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 14:44:22.53 ID:IqUBh/zH0.net]
>>538
それ、全部既に言ってたからw
お前はみんながすんなり分かるところをこれだけすったもんだしてやっと分かっただけ。
これまでのやりとりが無かったら、それそのまんま言っても理解出来て無い。

そもそも、バカがどうしてバカなのかなんてこっちは理解出来ない。
お前とは違うからな。

564 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 14:47:50.40 ID:xyZ0U828M.net]
メソッドの返り値として何の型のどんなオブジェクトが返ってくることを意識する重要さが微塵もわかってないのでこいつのVBAスキルはここで打ち止めだな

565 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 15:09:10.26 ID:vqijPR8bp.net]
以降はスルーしよう

566 名前:デフォルトの名無しさん [2017/12/15(金) 15:21:09.44 ID:yfj2Ro7Gd.net]
整数 + 整数の戻り値が整数なのに整数 / 整数の戻り値が整数じゃない理由がわからない、不合理だ、と
駄々をこねる人間もいるんだからしょうがない

567 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 19:31:32.21 ID:lmKJ5VLWa.net]
世の中にはこういう本物のバカもいるんだなあと勉強になったよ

568 名前:デフォルトの名無しさん [2017/12/15(金) 19:39:48.70 ID:IAZ3SurN0.net]
わりとそこかしこに居るけどな、本物のバカ
ひきこもりか?おまえw

569 名前:デフォルトの名無しさん [2017/12/15(金) 21:40:28.03 ID:qta4Ddk+0.net]
>>549
まだ始めて2週間って話してなかった?
ちなMOSエキスパート所持者ね

570 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 21:49:11.45 ID:SvHkecGU0.net]
>>421からもう二週間も経ったのか。時が経つのは早いな。



571 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 22:06:37.13 ID:5LKBHQ7A0.net]
>>554
> ちなMOSエキスパート所持者ね

ここ、笑うとこですか?

572 名前:デフォルトの名無しさん mailto:sage [2017/12/15(金) 22:06:40.33 ID:sA/nQpBXa.net]
MOSエキスパート?
何それ美味しいの?

昔、「初心者だから仕様がないけどさ」と説教した相手が今回君が挑戦してる言語のエキスパート持ってたけどさ。

573 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 04:53:25.79 ID:kSf4Qz7z0.net]
先日、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へ)

574 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 04:53:47.87 ID:kSf4Qz7z0.net]
>>558
(その2)
[現象]
 ・Fitering成功しているように見えるが、非表示セルにカーソル移動できてしまう。
 ・セル値の削除が効かない。(連動イベントが動かず、本現象に気づく)
 ・範囲コピー貼り付けが正しく行われない。
 ・セルをコピーモードにしても、選択範囲が破線矩形にならない。
  →なんと恐ろしいことに、操作の対象が現在見えているActiveCellではなく、
   呼出元画像のあるシートの同一番地に対して行われている様子。
   破線矩形も元シートを開いたらそこにあった。
   削除処理も元シートに対して行われる。
   ステータスバーのセル値カウントも、現在見えているシートではなく、呼出元の情報を返す様子。
   ActiveCell.Address(External:=True)は実際に見えている移動先シートを示しているのに、、、

[発生条件の再検証]
 ・別シートの画像.OnAction→Popup.OnActionで初めて成立。
 ・画像.OnActionから直接Proc実行(Sheet選択、Autofilter実施)では再現せず。
 ・Alt+F8からのPopup起点とすると再現せず。
 ・Popup.OnActionを入れ子にしても再現せず。
 ・ボタンをTableと同じシートに配置した場合は再現せず。
 ・Office2010では再現せず。
(その3へ)

575 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 04:54:06.08 ID:kSf4Qz7z0.net]
>>558
(その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は無実でシート選択の不全実行が現象の概要とみています。

576 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 04:56:00.08 ID:kSf4Qz7z0.net]
>>558
環境情報が抜けていました。
Win10 バージョン 1703 (OS ビルド 15063.786)

577 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 05:17:34.49 ID:kSf4Qz7z0.net]
>>558
(その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"

578 名前:名無し mailto:sage [2017/12/16(土) 05:26:07.46 ID:j6rMoAMF0.net]
そういうときは、doeventsやwaitも試してみるべし
今パソコン無いから試す暇がない

579 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 05:36:15.74 ID:kSf4Qz7z0.net]
>>563
そういえばDoEventsは試しました。
結果効果はなく、SendKeysを無効化して現象回避もできなくなるという逆効果も確認しました。

Waitはどこに入れると効果的ですかね。
間にStopを入れて一時停止したりはしてみましたけど、、、

580 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 05:45:39.73 ID:kSf4Qz7z0.net]
>>563
今回のはあまり待ち要素はないと見ていますが、以下の3カ所に2秒ほど入れてみました。
 ・シート切替の前後、.ShowPopupの直前
再現してしまいました。



581 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 18:57:10.19 ID:9cn7Nun80.net]
現在vbaをネットで勉強中ですが書籍も使って勉強しようと思っています
プログラミング初心者がvbaを学ぶのにお勧めの書籍を教えていただけませんか?

582 名前:デフォルトの名無しさん [2017/12/16(土) 20:17:51.76 ID:7KC6Lrbda.net]
VBAで書籍は金の無駄だよ
最初はマクロの記録を見るのとネットでぐぐれば大抵のことはできるよ

583 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 20:36:50.77 ID:IU5B3eEvp.net]
データの入力規則にカンマ区切りの項数不定の1-9の数字のみを許容したいのですが、どうすればよいですか?

正規表現だと、こんな感じです。
/^([1-9]+,)*([1-9]+)$/

regexp使ってVBAでチェックする方法ならやり方が分かるのですが、セルのデータ入力規則で設定する方法が分かりません。

584 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 20:57:31.30 ID:yaHEvAoH0.net]
>>568
シートのChangeイベントあたりに
そのコードを仕込んでおくのはいかがでしょうか
ダメな場合はエラーメッセージ出して、セルの値を消しちゃえば
入力規則チックになるかと

585 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 21:10:04.55 ID:yaHEvAoH0.net]
>>566
本格的にやりたいなら、VBAと関係ないように思えるけど
「スッキリわかるJava」シリーズをオススメしたい。
自分の場合、VBA本ではさっぱりだったけど、この本で目覚めた。
オブジェクト指向の解説は、VBAの理解にもかなり役立つ。
プログラミング言語は根幹は同じで、方言みたいなもんなので
他の言語にもすんなり入っていけるようになる。
やれることが多くなるよ。

586 名前:デフォルトの名無しさん [2017/12/16(土) 21:57:56.42 ID:0LU2hdfpp.net]
オブジェクト指向をVBA始めて1週間だが理解してみた

まず
変数は何かの型に入れる
お前はこれしかできねえよ
っていう

そして
その型の中のさらに型の中の命令はなに?
と掘り下げて行く

これがオブジェクト指向

587 名前:デフォルトの名無しさん [2017/12/16(土) 22:19:01.15 ID:vwwP6eCQd.net]
>>571
違うけど気にしないでいいよ
厳密なな定義ないから

588 名前:デフォルトの名無しさん [2017/12/16(土) 22:21:35.33 ID:6cm/hyEb0.net]
あと一歩というところだな、実にオシイと言っておこう
しかし始めて1週間でそこまでオブジェクト指向の真髄に迫るとは大したものだ
末恐ろしい奴が現れたもんだ、これは俺もうかうかして居られんな

589 名前:デフォルトの名無しさん [2017/12/16(土) 22:26:05.73 ID:vwwP6eCQd.net]
なるほど
俺が間違っていたようだ

590 名前:デフォルトの名無しさん [2017/12/16(土) 23:09:21.00 ID:9T+lJsLD0.net]
お、おぅ



591 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 23:16:38.47 ID:jWdcz3p90.net]
Access だと、ずいぶん前から SendKeys は使うな ってのが喧しいが
Excel だと現役なんか? いいんか?

592 名前:デフォルトの名無しさん mailto:sage [2017/12/16(土) 23:32:07.04 ID:oxEVVuR00.net]
>>558
(その5)
画像リンクが外部ファイルにある場合はSendKeysも役にたたないようです。
なんかいい回避策ないですかね?

593 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 01:01:58.50 ID:ZCl426tV0.net]
たんにActiveCellのシートが思ってるものじゃないだけの気がするなぁ
そのコードどこに書いてるんだよ

594 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 01:39:41.36 ID:F05u2uwp0.net]
誰がオブジェクト恥垢やねん!(´・ω・`)b

595 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 04:46:14.88 ID:Hjh32hjm0.net]
>>578
どゆこと?

例えばですね、他Bookにある画像をクリックしてそこにPopupが表示され、フィルタ処理を選びます。
で、フォーカスは対象テーブルのあるブック・シートに遷移して、フィルタリングに成功します。
SDIなので画面上は呼出元ブックとテーブル用ブックが2つ並んでおります。
ここでScriptは完了するわけですが、追加の操作をするために、遷移先シートを明示的に選択。
明らかに自分はその目的のシートを選んでいます。
ここでImmediateから、ActiveCell.Address(external:=True)をたたくと明らかに今触っているセルの番地が、Book名、シート名、セル番地名のフルパスで戻ります。
ここでカレントセルのある範囲を選択反転してCopy操作を行うと、呼出元ブックの同じセル番地がコピーモードの破線矩形にかわるんです。
カーソルで下へスクロールすると、呼出元シートもリモコンで操作しているみたいに一緒にスクロールするんです。
削除操作も、、、、同一ファイルで操作している時は気づかなかったですが、別ファイルから行うと凄いびっくりなビジュアルが展開されます。
明らかに "ActiveCell" という状況が表と裏に分離されたような状態になるんです。
同じブックをWin7+Excel2010で操作した場合は起きません。
自ファイルだとSendKeysで逃げられるんですが、外部ファイルからシート切替しても呼出元が切り替わってしまって、、
テーブル側ブックがキー操作相当でシート切替されないとこの状態が解除されないみたいです。

596 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 05:09:02.50 ID:/bdPdb8E0.net]
>>580
とりあえずActiveSheetとかSelectionとか使わない方法で実装するのはダメなの?
あと同時に実行されるマクロは全て同じブックに入れておくべきだと思うよ。

597 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 06:51:48.24 ID:Hjh32hjm0.net]
>>581
(その6)
Debug用と問題回避のためにActiveCellを記述していますが、実際のコードでは使用していません。
>>560のSelectionはコードの中に記述しているわけではなく、検証用の画像ボタンを登録する手順としてImmediateから実行しているだけです。極力BackEndから操作する派です。

実際の運用Bookでは極力同一ファイルにMacroを集めています。
Macro自体は仕事を完全に全うするのですが、、、そのあとシートの状態がおかしくなるという現象です。
状態を解消するには、呼出先のBookでシート切替を行う方法のみ。

で、発想を変えて、「外部から制御できないか」と考えました。
VBE内にVBSScriptを記述し、「中の外」からシート選択してみようと。
結果NG、再現してしまいました。

じゃあ、本当に外から制御すればどうかな?と思い、上記のVBScriptを同一フォルダに置いて呼び出す作戦に。

598 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 06:52:33.95 ID:Hjh32hjm0.net]
>>581
(その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には不具合対応してもらいたいです。
コメントいただいた方々、ありがとうございました。

599 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 06:55:18.78 ID:Hjh32hjm0.net]
>>583
あれ、一部書き間違えました。実際は、、

 Call Shell("wscript " & ThisWorkbook.Path & "\SelectSheet.vbs", vbHide)

600 名前:デフォルトの名無しさん [2017/12/17(日) 10:32:12.89 ID:e1NNF66l0.net]
つまりここでは
なんの型にはめるのか?
命令は?状態は?

だろ?
でもCellsってプロパティだろ?なんで一発で状態から入るんだ?



601 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 11:20:01.90 ID:ZjZyIyTi0.net]
>>585
Cellsはオブジェクトだ
そしてWorksheetオブジェクトやCellsオブジェクトのプロパティでもある

あと、ようやく時間ができたからWorkbookオブジェクトをVariantに代入しようとしたら当然のごとく「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」になった。
一体何を試してパスが云々なんて話が出てきたんだろう。
Dim V As Variant
V = Workbooks(1)
→代入不可
Set V = Workbooks(1)
→VはVariant/Object/ThisWorkbook型
調べてみてもWorkbook型にデフォルトプロパティは設定してなさそう。

602 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 11:21:03.68 ID:ZjZyIyTi0.net]
>>586
訂正
CellsはRangeオブジェクトだ
そしてWorksheetオブジェクトやRangeオブジェクトのCellsプロパティでもある

603 名前:デフォルトの名無しさん [2017/12/17(日) 11:26:43.28 ID:e1NNF66l0.net]
>>587
cellsはrange?
意味わからない
プロパティでオブジェクトってなに?
もっとうまく説明してくんね?

604 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 11:27:13.71 ID:gZkjaYao0.net]
>>586
自分用語を使うどころかコードも正確にコピペできてないからそのまま実行しても無駄だぞ
エスパー力を全力で働かせて察してあげない限り回答しても罵倒が返ってくる

605 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 11:37:53.28 ID:ZJu/+/V0x.net]
>>585
メゾット君、プロパティだから状態というのは間違えやすい考え方だからこの際捨て去った方が良い
プロパティは呼び出し元プログラムに対してオブジェクトのクラス内部への変数へのアクセスを提供するもので、アクセス先の変数のデータ型はプリミティブな値であることもあれば、何らかのオブジェクトである場合もある
というか、オブジェクト式の途中で出てくるプロパティは全てオブジェクトへの参照を提供するプロパティだ

Cellsの場合はRange型のオブジェクトへのアクセスを提供するプロパティだが、Grobalのメンバプロパティだから上位オブジェクト式を

606 名前:省略して書けるわけ []
[ここ壊れてます]

607 名前:デフォルトの名無しさん [2017/12/17(日) 11:46:44.41 ID:gC8RO3PCp.net]
>>590
カタカタ使うな

608 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 11:53:12.87 ID:ZjZyIyTi0.net]
>>589
そうだよな・・
自分でクラス作ってみれば一発で理解できそうなものだが・・

609 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 11:59:28.64 ID:R4ec2g2Bx.net]
>>592
あの質問者が自分でクラスを作れるようになるのって何年か先の話だろうな

610 名前:デフォルトの名無しさん [2017/12/17(日) 12:11:00.98 ID:gC8RO3PCp.net]
クラス?
オブジェクトに必要な要素を全部埋め込むやつだろ?
もうできるよ?
でもnewクラスの使い方が意味がわからない
同じクラスで(中身も同じ)なら作る意味ないんじゃねえの?



611 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 12:19:09.45 ID:ZjZyIyTi0.net]
確かにこれでは何年も先の話になりそうだ

612 名前:デフォルトの名無しさん [2017/12/17(日) 12:31:47.04 ID:gC8RO3PCp.net]
いま、クラスをみてみた
そしたらworkbookの中にworksheetsがプロパティとしていた
どういうことだ?
俺はVBAの盲点をついたか?

613 名前:デフォルトの名無しさん [2017/12/17(日) 12:40:07.47 ID:gC8RO3PCp.net]
知りすぎたか?

614 名前:デフォルトの名無しさん [2017/12/17(日) 12:51:28.57 ID:gC8RO3PCp.net]
dim i as long

For i = 2 To i.Cells(.Rows.Count, 1).End(xlUp).Row

このi.cellsの意味がわからない
教えてくれ

615 名前:デフォルトの名無しさん [2017/12/17(日) 13:07:40.63 ID:+CY9tzJPd.net]
プロパティは内部変数へのアクセスに限らずいろんなこと出来るし、最初さっぱり理解できなかった。
まさかただのシンタックスシュガーだなんて想像してなかったからな。

616 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 13:23:13.67 ID:R4ec2g2Bx.net]
>>598
このコードは絶対にコンパイル通らないぞ
For i = 2 To i.Cells(.Rows.Count, 1).End(xlUp).Rowの意味なんてこっちが知りたいくらいだ

617 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 13:26:02.12 ID:R4ec2g2Bx.net]
>>596
Worksheetオブジェクトのメンバの、Worksheetsコレクションにアクセスするプロパティじゃん
何が不思議なの?

618 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 13:27:44.67 ID:R4ec2g2Bx.net]
New出来てないの笑える
クラスモジュールを挿入できただけでクラス使えるようになってねぇじゃん

619 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 13:51:38.17 ID:5yg/jtY20.net]
おそらく本職プログラマじゃなく事務の効率化でVBAに手出したんでしょ?
どうせ片手間ならプログラミング適性無さそうだからおとなしくコピペで済ますのが無難だと思う
たぶん永久に理解出来ないよ

620 名前:デフォルトの名無しさん [2017/12/17(日) 14:08:08.04 ID:gC8RO3PCp.net]
>>600
正しいのはなに?


https://i.imgur.com/rE2ZahI.jpg



621 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 14:15:19.48 ID:R4ec2g2Bx.net]
>>604
自分で考えろよ、クラス作れるんだろ?w

622 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 14:17:42.01 ID:KxwCW4kM0.net]
最近オブジェクト指向の本読んでみたんだけど
これまで作ってきた稚拙なスパゲティコードをこの際書き直してみたくなった

623 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 14:25:27.85 ID:R4ec2g2Bx.net]
>>603
この人謙虚じゃないし、まぁ無理だろうな
素直に他人の文章やコードが読めず、自分の言語感覚だけで無理矢理白黒つけようとするだけの奴はそもそもプログラミングに向いてない

624 名前:名無し mailto:sage [2017/12/17(日) 19:27:22.86 ID:ZjZyIyTi0.net]
>>606
今書き直しても、しばらくするとまた見識が増えて書き直したくなるだけやで

625 名前:デフォルトの名無しさん [2017/12/17(日) 19:31:24.74 ID:SRQ89yzu0.net]
>>606
やめとき、もう一つ稚拙なスパゲティコードを作るだけやでw
魔道に堕ちた亡者どもはそれをリファクタリングと呼んでるらしいがなw

626 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 19:52:14.28 ID:/bdPdb8E0.net]
>>607
メゾット君は>>573の自演の通り、「○○が出来るなんて凄いヤツだ」って反応が欲しいだけでしょ。
その反応が欲しいだけだから本腰入れて勉強するつもりもないんだろうし、
彼の想像の中では、自分は「凄いヤツ」であり、それに反応する周囲は「凄くないヤツ」なので見下している。
見下している奴らと

627 名前:ゥ分の意見がぶつかったら自分の方が凄いので自分が正しい。だから自分の考えに固執する。

要するにヒカルの碁とかハイキューとかボールルームとかの主人公みたいな展開を妄想してんだろ。
どんな反応をしても彼の妄想に付き合わされるだけだし、妄想が維持できなくなると死ね死ね言うだけになるから構うだけ無駄。
[]
[ここ壊れてます]

628 名前:デフォルトの名無しさん mailto:sage [2017/12/17(日) 20:35:35.89 ID:oSmkXHksa.net]
>>607
プログラミングだけじゃなくありとあらゆることに向いてないだろうな
わからんのは仕方ないけど、最低限の態度がなってない
ネットだからなにやってもいい、って考えのやつはいずれリアルでもぼろが出るわ

629 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 00:39:13.70 ID:mfb75Iey0.net]
プロシージャにconstでいくつか定義してあってこれまで何も問題なく動いてきた
さっきその定数の一つを=22から=23に変更したら
定数式が必要です、のエラーが出る
どうみても何も問題ないようにみえて分からない
まさかと思いつつ
'Const sht_right As Integer = 23
Const sht_right As Integer = 23
このように問題の起きた行をコメント行として
すぐ下に書き直したらエラーがでなくなった
こういうのってあるもん?

630 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 02:00:09.91 ID:rupxZ3Ov0.net]
>>612
上の奴、本来のコードだと全角スペース入ってなくね



631 名前:デフォルトの名無しさん [2017/12/18(月) 02:32:05.22 ID:m7yapXyd0.net]
>>604
i.cells じゃなくて ws.cells
さらに、with ws が有るので ws が省略できるから
.cells で良い

632 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 03:17:17.83 ID:7TDAIkSx0.net]
>>612
99%は単なるタイプミス
等幅フォントでスペースが明示できるテキストエディタにコピペしてみる

633 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 06:23:46.35 ID:TbHEuMcS0.net]
どこかから、コピペした文字列に、見えない制御文字が入っているとか?

634 名前:名無し mailto:sage [2017/12/18(月) 07:46:18.89 ID:fX+okHt3M.net]
>>612
その事例は見たことないけど、納得のいかないエラーが出たときは、とりあえずエクセル再起動

635 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 07:59:26.09 ID:mfb75Iey0.net]
>>613
>>615
>>616
と俺も思った
んで何度も打ち直してみた
ちなみに上に貼ったのはそのままコピペしたもの
2を3にしただけなんでね、よくわからん
>>617
再起動しなかったかもしれないんでまた起きたらやってみるわ


コメント行にしたもともとの行は削除しちゃったんで実験できなくてすまん

636 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 08:01:30.70 ID:aXpCltYZ0.net]
Constでエラー出した事あったけど、Endを実行してからやったら治ったことあるな。
値が記録されたままだったとかじゃね。

637 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 10:33:59.62 ID:ueSdYdZDa.net]
>>612
なんか、Enumでもそんなことがたまに起こるよ
VBEのバグらしいけど

638 名前:デフォルトの名無しさん [2017/12/18(月) 13:34:10.63 ID:NqlVCppnp.net]
VBAってどうやったら上達しますか?
エクセル関数は達人級です
エクセル関数みたいに慣れだけじゃ無理ですかね

639 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 13:43:31.23 ID:IKrWJ0B8a.net]
>>621
Javaを勉強したらvbaも上達するよ

640 名前:デフォルトの名無しさん [2017/12/18(月) 13:47:42.85 ID:NqlVCppnp.net]
>>622
JAVA押しさんこんにちわ



641 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 14:03:31.64 ID:yddZnfruM.net]
Java推しはともかく他の言語を学ぶのはVBAの上達にも実際かなり役立つ

642 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 14:45:58.67 ID:c1zJrPAZp.net]
(またメゾットくんだよ…)

643 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 16:14:09.20 ID:D45Nh6pha.net]
>>623
ジャワティーの話しはしてないんだ、ごめんな

644 名前:デフォルトの名無しさん [2017/12/18(月) 16:30:46.07 ID:NqlVCppnp.net]
VBAだけやればいい
javaは環境が大変だ
したいこともないし

645 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 16:48:04.05 ID:D45Nh6pha.net]
プログラムの上達に早道はないんだよなあ
というか、遠回りに思えることが早道だったりする
と、自戒の意を込めて
どうしてもエクセルと絡めたいならC♯でもいいけどな

646 名前:デフォルトの名無しさん [2017/12/18(月) 16:49:17.57 ID:7XOqOvzzd.net]
今のうちにPythonを学ぶ
www.publickey1.jp/blog/17/excelpython.html

647 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 17:57:32.74 ID:pW3jV0rpa.net]
ぱいそんってアメリカではもっともメジャーなスクリプト言語なんだっけ

648 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 18:15:03.66 ID:fX+okHt3M.net]
何故にPythonかと思ったらエクセルにPython組み込むって話が出てるんだな。勉強するか‥

649 名前:デフォルトの名無しさん [2017/12/18(月) 19:14:05.94 ID:/veb4c2e0.net]
>>628
自己評価だとそう感じるのかもしれないけど
できる奴は最初からできるし、できない奴はいつまでたってもできない
プログラムってそういうもん

650 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 19:34:37.55 ID:pW3jV0rpa.net]
>>632
そりゃあ人によっちゃ違うが、それは才能があるからで近道しようとしてそうなってる訳じゃないだろ
わかんないことがあったら別の切り口から攻めると言うのもありじゃないの



651 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 19:45:01.61 ID:au4G9Tq20.net]
VBAerさんついに終わるのか
Pythonに駆逐されちゃうね

652 名前:デフォルトの名無しさん [2017/12/18(月) 19:45:05.21 ID:/veb4c2e0.net]
>>633
ないとは言ってないよ
俺が言いたいのは、別の切り口から攻めようが近道しようが
既知の問題の解決策は知識として身につくが
未知の問題に対する解決能力は上げることができないって事

つまり上達とか意識しないで楽なやり方ばかり選ぶ奴がいつだって一番賢い

653 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 19:51:30.63 ID:pW3jV0rpa.net]
>>635
天才の人は苦にしないだけでちゃんと道は通ってるよ

654 名前:デフォルトの名無しさん [2017/12/18(月) 19:54:37.06 ID:/veb4c2e0.net]
>>636
何を言いたいのかよくわからんがそもそも俺が言ってるのは天才のことじゃない
単にプログラムができる奴とできない奴の話なんだが

655 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 19:57:32.60 ID:pW3jV0rpa.net]
>>637
iqないとダメなのはプログラムに限らんし
まあスレチだから退散するわ

656 名前:デフォルトの名無しさん [2017/12/18(月) 20:01:42.20 ID:/veb4c2e0.net]
>>638
いやだからIQとかの話じゃないってば
目の前の問題をありのままに受け入れる事ができる奴と
既に自分の中に構築された知識に当てはめないと解釈できない奴の違いだって

657 名前:デフォルトの名無しさん mailto:sage [2017/12/18(月) 23:11:06.58 ID:aXpCltYZ0.net]
>>634
仮に採用されて皆がPython触るようになったら、今度はPython(笑)って扱いされる未来が見えるわ。
格好つけだけでやってる奴らが抜けて、AIとか作ってる真っ当なのが風評被害を受けそう。

言語は統一するよりも、それを扱うユーザー層毎に分けた方がいい。

658 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 12:28:53.96 ID:/mb664F4a.net]
>>618
俺も似たようなの見たことがある。
でも引きずるような問題じゃ無かったと思う。
Excel再起動かPC再起動で直るんじゃね?

659 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 12:37:10.24 ID:pfZPHd/La.net]
>>635
逆だと思うが。
未知の問題に対しての解決能力は上げることができる。
楽なやり方を選ぶ奴は上げられないだけ。
厳密には未知な問題といっても既知の問題と全く違うわけじゃない。

660 名前:デフォルトの名無しさん [2017/12/19(火) 16:48:29.82 ID:mNLh8c+i0.net]
ここのやつらがあんまジャバジャバいうから引っ張り出して着たわ

とりあえずコードは実行せずにパラ読みしようと思う

https://i.imgur.com/peDAurF.jpg



661 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 17:01:17.86 ID:Bngslooy0.net]
>>643
「わー、ロレックス持ってるなんてすごーい!」
「え?こんなの普

662 名前:ハだよ。持ってないとかwww」

みたいな展開になる事を期待してるんだろうけど腕時計の入れ方が無理やり過ぎて笑いしか出てこないw
本は中古屋で買ったみたいだし、あまりにもちぐはぐ過ぎてむしろ格を下げてるようにしか見えないんだが。
[]
[ここ壊れてます]

663 名前:デフォルトの名無しさん [2017/12/19(火) 18:14:51.58 ID:J+VWEpvK0.net]
>>642
うんだから最初に言ったんだけど自己評価だとそう感じるんだってば

664 名前:デフォルトの名無しさん [2017/12/19(火) 19:02:39.42 ID:mNLh8c+i0.net]
JAVAの本でわかったこと

変数の宣言と同時に値を入れることを初期化という
変数の値が変わらないことを定数という

いま10ページ目だけどこんくらいだわ

665 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 19:57:29.94 ID:9tP52mqX0.net]
>>646
>変数の値が変わらないことを定数という

これはちょっと違うのでは?

666 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 20:25:43.13 ID:fLKwjLgZa.net]
>>645
お前の自己評価がそう感じてるだけだろw
何か自分はプログラム書ける気になってるようだけどw

667 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 21:14:28.27 ID:4AWSTK/ra.net]
変数の初期かもなんかむずむずする理解だな

668 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 21:15:04.92 ID:4AWSTK/ra.net]
あ、でも彼はジャワティーの話をしてるのか
ならわからんでもない

669 名前:デフォルトの名無しさん [2017/12/19(火) 21:26:16.08 ID:mNLh8c+i0.net]
javaのパスが通らなくて実行できない
助けてくれ

670 名前:デフォルトの名無しさん mailto:sage [2017/12/19(火) 23:45:33.30 ID:jfHXMkXp0.net]
Java は環境構築が難しいから、初心者には無理

paiza.IO, codepad などのサイトで、ブラウザから実行しろ



671 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 00:20:41.41 ID:USwfdD4Y0.net]
別にJavaが難しいと感じたことはないな。
すっげえ昔にかじっただけだから今となっては初心者以下だけど。
いや、当時も初心者だったけど。

672 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 00:28:51.85 ID:USwfdD4Y0.net]
コンパイラもJavaで出来てるからJava実行環境でコンパイラ動かして、そのコンパイラへの引数にエディタで編集中のテキストを一時ファイルにしたものを渡してたな。
そのエディタもJavaで誰かが作ったものを機能拡張したやつだったな。

673 名前:デフォルトの名無しさん [2017/12/20(水) 00:40:50.45 ID:xfg3gakwa.net]
コマンドラインが敷居高いならeclipseでやれ
敷居高いつっても環境変数設定してそこにパス通すだけだがな

674 名前:デフォルトの名無しさん [2017/12/20(水) 01:00:50.98 ID:sohN4awK0.net]
javaって効率悪すぎだろ
テキストエディタで編集

名前つけて保存

コマンドプロンプトでコード入力

実行

どんだけ時間かかるんだよ

675 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 08:24:00.28 ID:TZHE5kKsa.net]
いやeclipse使えよ

676 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 09:28:33.38 ID:FRuTBLwYp.net]
これ以上はスレ違いなのでJavaスレでどうぞ

677 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 09:36:49.97 ID:GPFg9WZwx.net]
eclipseも知らないで手動でコンパイルしながらブチキレてるの想像してワロタ
道は遠いね

678 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 12:25:53.38 ID:Vi8ViNgtd.net]
スレチ

679 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 12:41:32.07 ID:/dU/ndoRa.net]
お前ら良かったな
EXCELでPythonが使えるようになるかも知れないんだって?
あれはObject指向の流れを組む関数型を目指しているところの言語っていうからやりがいはあるよね

俺もVB.NetやC#はやったけど
EXCELに載ることが確定したらこれからPython覚えるわ
まぁ構造化言語からObject指向型言語に移行したとき
めちゃくちゃ苦労したけど
今回も苦労するんだろうなぁ

680 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 13:38:58.93 ID:/fbzm/vOa.net]
Pythonはさらっと概要見たぐらいだけど面白そうだね
まあexcelにのらなくても勉強して損にはならんだろうな



681 名前:デフォルトの名無しさん [2017/12/20(水) 15:31:22.90 ID:EAMpcVD20.net]
必要ないもん勉強したって時間のムダだっつーの
真のエ

682 名前:Nセルマクラーだったらマクロ書くのにパイソンしか使えなくなった時に必死でググれ []
[ここ壊れてます]

683 名前:デフォルトの名無しさん [2017/12/20(水) 16:07:26.91 ID:/h7jUJynd.net]
今のままでも関数型で出来るらしいが
https://qiita.com/matumoto_onga/items/7adfd4cf48288c477901

684 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 18:29:06.12 ID:khkAeR460.net]
Pythonはオブジェクト指向も関数型も全部後付けって感じでイケてねえ
F#にしとけって
でもこんなのはプログラマ以外が触るものだからしょうがないのかもな

685 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 19:00:00.85 ID:sxNo8wqUa.net]
>>665
F#ってまだ生きてんのか!

686 名前:デフォルトの名無しさん [2017/12/20(水) 19:51:25.83 ID:7WhairgWd.net]
生きてるし、活発に使われてるよ
ソースはない

687 名前:デフォルトの名無しさん mailto:sage [2017/12/20(水) 20:52:44.38 ID:EAMpcVD20.net]
ソースはないソースはよ

688 名前:デフォルトの名無しさん [2017/12/21(木) 23:06:47.24 ID:1PuX0k7mM.net]
100列ぐらい続く計算エクセルがある
足したり引いたりするだけのエクセル。
酷くね?VBAにできないものか

689 名前:デフォルトの名無しさん mailto:sage [2017/12/22(金) 02:00:09.18 ID:T3zOnX2zx.net]
>>669
計算エクセルっていう表現が意味不明だが要は計算用のワークシートのことか?
大抵の場合、ワークシート関数とテーブル機能を組み合わせて何とかする方がVBA使うより楽だぞ
車輪の再発明をしてもしょうがないからな

690 名前:デフォルトの名無しさん mailto:sage [2017/12/22(金) 04:21:53.41 ID:0EXQoFbJ0.net]
質問です。
Excel側からVBE上の指定のプロシージャ記述欄にジャンプする動作をVBAで記述できる
でしょうか?
やり方がわからずとりあえずSendKeysを組み合わせて動作するようになったのですが
不慮の事故が起きそうで怖いです。
VBEのオブジェクトモデルに沿ったアクセス方法があれば教えていただけないでしょうか。



691 名前:デフォルトの名無しさん [2017/12/22(金) 07:49:35.63 ID:BCzwPGy5d.net]
>>671
VBE上でカーソルの位置をコントロールするってこと?

692 名前:デフォルトの名無しさん mailto:sage [2017/12/22(金) 11:50:10.85 ID:7Q1lZFEo0.net]
>>672
メンテのために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からの操作が
知りたいのですが、うまく情報を見つけられないところです。

693 名前:デフォルトの名無しさん mailto:sage [2017/12/22(金) 12:58:52.19 ID:7Q1lZFEo0.net]
>>671
自己解決しました。
キーワードを英語に切り替えてGGったら、StackOverFlowですぐ見つかりました。
.CodePane.GetSelection
.CodePane.SetSelection
あたりでなんとかなりそうです。お騒がせしました。

694 名前:デフォルトの名無しさん mailto:sage [2017/12/22(金) 17:40:48.08 ID:3J82DkVga.net]
VBAやりはじめて三年ぐらいだけど、For Eachで普通の配列もループできるの今日知ったわ
コレクションだけだと思ってた

695 名前:デフォルトの名無しさん [2017/12/22(金) 18:05:37.66 ID:/KqbyaeQd.net]
>>675
値の取得だけで設定はできないけどねー

696 名前:デフォルトの名無しさん mailto:sage [2017/12/22(金) 18:16:05.21 ID:3J82DkVga.net]
>>676
クラスの扱いが大分変わるのよ
わざわざイテレータ自作してたわ

697 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 00:05:26.91 ID:/nzAEvVba.net]
>>674
できるんだけどセキュリティ的に問題だからお勧めしない。
.netで書いた方が良いぞ。
でもVBEを操作するコードが書ければ、.net上でも殆ど同じコードでいけるから勉強しとくと良いかな。 []
[ここ壊れてます]

699 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 06:34:44.47 ID:F3cHZlpp0.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

700 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 06:43:21.92 ID:F3cHZlpp0.net]
>>679で書き忘れ
標準モジュールの宣言部に
Public Const VK_LBUTTON = &H1
の記述もしてあります。



701 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 07:46:11.28 ID:8SavP0Th0.net]
>>679
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count = 1 Then Target.Value = "ここ"
End Sub

クリックした場所に入れるだけならSheet1モジュールにこれで済むけど、コルーチン処理が必要というなら分からん。
いずれにしてもActiveCellとかActiveSheetとかは避けて設計すべき。

702 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 07:56:20.90 ID:F3cHZlpp0.net]
>>681
自分もググってたどりついた先がそれだったんですよね

でも常に発動してる状態だとやっぱり困るんですよ
一応application.enableevent を使って停止しておくこともできるようなので、
通常は停止しておくことも考えてはいます
設置したボタンを押したときだけ機能するようにしておけばいいのかな、と。
Worksheet_SelectionChange使う以外方法がなければそうするしかないですが
無効にしてる間はイベントが一切反応しなくなるという事なので、
イベント付きの他のブックを併用するようなケース等で問題が起きそうで迷ってます

703 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 08:00:18.36 ID:8SavP0Th0.net]
>>682
なら

If ToggleButton1.Value Then

とか加えておけばいいだけでは?

704 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 08:11:12.55 ID:F3cHZlpp0.net]
>>683
お・・これはいけそうです
こういう使い方があるんですね・・・
作業を先に進められそうです
ありがとうございました

705 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 10:35:36.95 ID:oVsH3Gmz0.net]
フォームコントロールボタンの文字の色を変えたいんだけど
セレクトしない方法はないのですか?

Sub test01()
 n = Worksheets("Sheet1").Shapes("Button 1").Name
 Worksheets("Sheet1").Shapes(n).Select
 Selection.Font.ColorIndex = 3
End Sub

706 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 10:51:51.14 ID:YCHexesv0.net]
フォームコントロールボタンの文字の色を変えたいんだけど
セレクトしない方法はないのですか?

Set n = Worksheets("Sheet1").Shapes("Button 1")
 n.Font.ColorIndex = 3

みたいな?

707 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 13:25:10.14 ID:Zcbsqwvta.net]
シート上のボタンならtoggleにしなくてもモジュールレベルのクリックフラグ変数で管理できねーか?

708 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 13:35:38.33 ID:8SavP0Th0.net]
>>687
出来合いのものを、わざわざ回避する利点は?

709 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 15:32:28.22 ID:tRk+L7lt0.net]
>>688
いや、最初コマンドボタンだったからコマンドの方がいいのかなって思っただけ
別に必要無いなら必要無いでいいし

710 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 18:23:21.18 ID:3q2JAS6ba.net]
>>686
逆に何でセレクトしなきゃならんのかが分からん。
普通セレクトなんてしないだろ。



711 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 18:24:04.16 ID:3q2JAS6ba.net]
すまん。
>>685向けね。

712 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 19:38:10.94 ID:DrTFst260.net]
>>685
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オブジェクトを持っているヤツまで掘り下げてかなければダメ

ということだと思う。

713 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 19:53:54.32 ID:AF0984djx.net]
>>692
直感的な説明だが、オブジェクトがオブジェクトを持つという表現は間違い
オブジェクトが持つのはあくまでメソッドとプロパティからなるメンバで、いわゆる下位オブジェクトにはメンバを介してアクセスしてるだけだからな

714 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 20:15:31.85 ID:oVsH3Gmz0.net]
>>692
マクロの記録でやってたので。1行で可能なのですね。
TextFrame.Characters.Font.Colorでググったら出てきました。
ありがとうございました。

715 名前:デフォルトの名無しさん mailto:sage [2017/12/23(土) 20:55:59.08 ID:afY4COyy0.net]
ちなみにButtonsとかCheckBoxesとかは隠しプロパティ
ヘルプにもでてこないからな

なんで隠してあるのかねぇ

716 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 00:26:44.47 ID:oSJcOqyea.net]
>>694
分かるよ。
そういう人がとても多いから。

でも、殆どの処理はセレクト無しで書ける。
個人的にはセレクト無しで書けない場合でも何とかセレクトせずに書けないかを考える。

717 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 00:45:00.70 ID:BN72T8jr0.net]
まあ、大多数の用途では得られるメリットが少なすぎてSelectを消す意味は薄いけどな

718 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 01:23:50.46 ID:2PxYmIQzx.net]
オブジェクトのプロパティにアクセスする処理でSelectメソッドはなるべく使わない
コードの実行中にデバッグ作業を行ったときなどに予期しないオブジェクトが選択されて、アクセスしたいプロパティにアクセス出来ずエラーになることがよくあるからね
Rangeオブジェクトを指定していたはずがShapeオブジェクトやOLEObjectオブジェクトを選んでいたりとか

719 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 01:43:15.08 ID:O2udkTbW0.net]
Selectは必ず代替手段があるから、範囲選択してユーザーに注意を促すとかでなけりゃSelect使う事に疑問を持った方がいい。

720 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 06:22:03.30 ID:ZKd7S1fn0.net]
起動中の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オブジェクトを取得する方法は無いでしょうか
他に方法があれば、ハンドルから取得する方法にこだわりません
ただし、諸事情により外部からライブラリをダウンロードしてきて使用する、といったことはできないです



721 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 08:15:14.57 ID:BN72T8jr0.net]
>>700
別窓かどうかの判定が抜けてる
LocationNameとかLocationURLあたりを調べないと

722 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 11:59:50.98 ID:uwQxUsVy0.net]
IEが複数あるかもしれないのに見つかったら抜けちゃうコードで何かおかしいと感じないの?

723 名前:デフォルトの名無しさん [2017/12/24(日) 15:06:20.77 ID:6Phr71Y20.net]
Dim u As Long
Range("A1", "I5").Value = u
u = Round(u, 4)

四捨五入したいのに全部ゼロになる!

724 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:18:15.83 ID:CcW1Sn5Aa.net]
>>703
uには何が入るの?

725 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:18:38.84 ID:CcW1Sn5Aa.net]
てか、そりゃゼロになるだろw

726 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:27:49.11 ID:dho/ilxra.net]
何かが逆でワロタ。

727 名前:デフォルトの名無しさん [2017/12/24(日) 15:36:05.76 ID:6Phr71Y20.net]
>>704
A1からI5のセルを桁指定したいんだ。
どうすればいいか教えてくれ

728 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:53:02.16 ID:sjlc/tcta.net]
>>707
A1からI5の範囲に初期化したばかりのu(=0)を入れてる。
入れるのは逆で、入れた後で桁変更して戻す必要もある。
最初からuを使わずに自分自身に桁変更した自分を入れる方が普通かな。

そもそも見た目だけ桁指定する方が一般的だと思うが。

729 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:54:56.74 ID:CcW1Sn5Aa.net]
桁指定したいならexcel vba 書式設定
でググりなさい

730 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:56:16.29 ID:CBEBXlX2a.net]
というか、値が複数(配列)だから一発でいけないだろ。



731 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 15:56:53.27 ID:JTJf6bSC0.net]
それぞれの行の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

732 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 16:09:57.86 ID:U3mSSLWjx.net]
>>711
数式書き込んでるループ内の処理の右辺を
"=$B" & i & "-" & "$C" & i
にするだけ
折角行インデックスをiで指定してループ回してるんだから使わないと

この程度のことだったらVBA使わなくても組み込みのテーブル機能で実現できるけどね

733 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 16:11:04.02 ID:O2udkTbW0.net]
>>711
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

734 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 16:13:21.90 ID:JTJf6bSC0.net]
>>712>>713

ありがとうございました。

735 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 17:56:35.14 ID:ZKd7S1fn0.net]
>>701-702
コードはあくまでも例で、実際はURLや文書内の文字列から判定しています
今回問題なのは、CreateObject("Shell.Application").WindowsをFor Eachで全要素を調べても、要素にそもそも含まれていない点です
IEの子窓として存在しており、タスクマネージャーで調べるとプロセスも存在するのに、IEオブジェクトを取得できません
しかし、WindowsAPIのFindWindowを用いるとハンドルの取得は可能だったので、
Set objIE = MAGIC(hWnd)のような形でハンドルからIEオブジェクトを取得する関数を作れないか質問させていただきました

736 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 19:48:46.67 ID:TDjZS1ex0.net]
Excel2010です
以下のコードを実行すると、"$A$2"が表示されます。
セル範囲に添字0を付けた場合、セル範囲の先頭セルが参照される
(この場合B2)と思い込んでいたのですが、私の誤りでしょうか?

MsgBox(worksheets(1).range("B2:C3")(0).address)

737 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 21:16:40.55 ID:ODr8GH0o0.net]
0 じゃなく 1

738 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 22:01:25.06 ID:TDjZS1ex0.net]
>>717
ありがとうございます
OffSet()だと原点がゼロなので
そういうのと混同していたかも知れません

739 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 22:44:17.96 ID:4FfGU/eI0.net]
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は文字列で〇〇は月を二桁表示)
抽出できた今月ファイルをコピーして名前の〇〇を翌月に変更したもの(翌月ファイル)を同フォルダ内に作成したいです
コピー元ファイル名を継承して一部だけ変更する良い方法が見つからなかったので教えてください

740 名前:デフォルトの名無しさん mailto:sage [2017/12/24(日) 23:29:24.13 ID:XB6s5ekxa.net]
>>714
そのセル全部のRangeに対して"=B2-C2"でいける。



741 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 00:16:31.32 ID:2KDGjSox0.net]
>>719
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

試してないけどこんな感じかなぁ。

742 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 08:06:21.04 ID:fMKsEfdQa.net]
>>719
fileName = Replace(fileName,○○,××)

743 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 08:07:54.57 ID:fMKsEfdQa.net]
ああ、AAAとBBBに数字がない前提じゃないとダメだな

744 名前:717 mailto:sage [2017/12/25(月) 12:59:33.91 ID:5/ecyLcnM.net]
>>721>>722回答ありがとうございます
まだ試せていませんが
AAA○○月BBBじゃなくて
AAABBB○○月にした場合もう少し簡単に記述出来ますかね?
ちなみにABに数字は含まれてないです

745 名前:デフォルトの名無しさん [2017/12/25(月) 16:18:43.87 ID:dIh/hlW50.net]
んんんんあああああああああああああああああああああああああああああああああ

746 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 16:44:33.34 ID:DuOFgh3Va.net]
コピーしてファイル名置換するだけでしょ?
フォルダもすでに取得してるなら
fso.copyfile file.Path,folder.Path & "\" & Replace(file.Name,"○○","××")
だけで行けるんじゃね

747 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 17:30:49.11 ID:1470x9yD0.net]
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があるにも関わらずこのエラー表示
解決法はありますか?

748 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 17:46:45.39 ID:DuOFgh3Va.net]
>>727
ユーザーフォームの行き来はめんどくさいしスパゲティになりがちだからやめた方がいいと思う
というのはさておき、initializeじゃなくてactivateイベントにしてみたらどうかね

749 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 17:48:18.57 ID:1470x9yD0.net]
いやいや何か間違えてる
修正

仕方が無いので2の「戻る」に
UserForm1.Show
Unload Me
と書いてみると、今度は1から2にもう一度行こうとすると、「フォームは既に表示されています。モーダルに表示できません」と出ます
ついでにとにかくhideは避けてすべてunloadにしてもやはり2→1の段階で同じアラート
解決法はありますか?

750 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 17:48:59.15 ID:1470x9yD0.net]
>>728
ありがとうございます
調べてみます
分からなかったらまた書きますのでお願いします・・・



751 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 18:01:10.24 ID:1470x9yD0.net]
>>728
うまくいったようです
3時間ほど解決法が見つからず頭抱えてました
感謝です

752 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 22:53:06.92 ID:S4ukHgvI0.net]
sub test()
'マクロ起動用

753 名前:エクセルがあるフォルダ内のフォルダ名の取得
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の数字を使えなかったりエクセル以外も取得できるのでまだ改良が必要そうです
[]
[ここ壊れてます]

754 名前:デフォルトの名無しさん mailto:sage [2017/12/25(月) 23:30:15.25 ID:63usksBrx.net]
>>732
ファイルの種類に関しては、ループ処理の冒頭でFSO.GetExtensionName(f.Path)の戻り値を調べて処理を分岐させるようにすれば、狙った種類のファイルだけを処理できるようになると思うよ

755 名前:デフォルトの名無しさん [2017/12/25(月) 23:37:14.60 ID:aEhB4dZD0.net]
ググったのですがどうしてもわからないので教えてください

【環境】Windows10、Excel2010
【不具合症状】新規コードの作成ができない

新規bookを作成し、VBEを起動した際、通常はプロジェクトウィンドウに
「Sheet1-3」が表示されるかと思いますが、真っ白なまま何も表示されない状態です。
メニューの「挿入」をクリックしても、標準モジュールがグレイアウトになってしまい、
新規コードの作成が行えない状態です。

ITに相談しても初めての事例とのことでわかりませんでした。
コンパネからのofficeの修復も行いましたが改善されません。
マクロのセキュリティは「全て有効」で設定されています。
xlsm形式で保存もしてみましたがダメでした。
PC再起動も試してみました。

同一PCで、既存作成マクロの実行は行えます。
既存マクロのVBEを起動した際、プロジェクトウィンドウやコードウィンドウは
普通に見えますが、コードウィンドウで1文字でも編集すると、F5実行時に
「ファイルが見つかりません」とのエラーが出ます。ステップ実行でも同じです。
編集は例えコメント行でも同じエラーが出ます。

新規作成は全てにおいて不可です。
自動記録をしようとすると「マクロが記録できませんでした」とエラーが出ます。
マクロの作成ボタンは押せますが、押してもコードウィンドウが起動しません。

新規作成と編集が制限されているようなのですが、どこから変更するのかが
どうしてもわかりませんでした。もしわかる方いらしたら教えていただけないでしょうか?

スレチであれば、該当スレッドに誘導していただけると助かります。
よろしくお願いします。

756 名前:デフォルトの名無しさん mailto:sage [2017/12/26(火) 01:59:52.47 ID:fIC/1lmja.net]
>>734
エクセルのレジストリ削除してみてもダメ?

757 名前:デフォルトの名無しさん mailto:sage [2017/12/26(火) 06:55:25.36 ID:cWcYrW8d0.net]
>>734
そのマシンに新規ユーザーつくって現象が発生する?
テンポラリやら消したら直るかもしれん
あとセキュリティ対策ソフト切って試すとか

758 名前:デフォルトの名無しさん mailto:sage [2017/12/26(火) 06:58:32.09 ID:gkP6o6Ks0.net]
>>719
「01月」というファイル名のコピーが、「02月」として、同じフォルダに入れるのか

フォルダ内に、「01月」「02月」があるとして、
この状態で、もう一度、同じ事をするなよ!w

設計として、同じフォルダに入れるのはおかしい。
異なるフォルダに入れるべき

わかりやすいように投稿する時は、名前欄に、717 と入れてくれ

759 名前:デフォルトの名無しさん mailto:sage [2017/12/26(火) 07:54:39.17 ID:6qOsufVw0.net]
>>735
>>736

732です、レスありがとうございます。

最悪、officeの再インストールも覚悟しています。
レジストリかも?とはITには言われましたが・・・・

新規ユーザーはまだ試していません。
セキュリティ対策ソフトはITの管轄なので、切れるかどうか不明ですが
聞いてみます。

こちらの書き込みは自宅からなので、次のレスが遅くなるかもしれません。
よろしくお願いします。

760 名前:デフォルトの名無しさん mailto:sage [2017/12/26(火) 08:20:51.65 ID:upqov7ALa.net]
>>737
運用の話までは管轄外じゃね
あとは自分で考えりゃいいよ



761 名前:デフォルトの名無しさん [2017/12/27(水) 09:27:07.83 ID:58xyBvha0.net]
>>721とか>>732とかのコードで意味わかんないところがいくつかある
(コードが間違ってるって意味じゃなくて、こっちの知識が足りなくて理解が追い付かないって意味です)
まず>>721
なんでコレクションを宣言してるのか?
しかもなぜ宣言したのに使わないのか?
変数eは何のために使ってるのか?
ファイルのパスをsplitで分割してるけど、
ファイル名だったらinstrrevで\を探したほうが話が早いんじゃないか?
等々

>>732
ループの中でdim使うのは大丈夫なの?
複数回宣言したらエラーになりそう
後、一番知りたいのが
If strFolder <> "." And strFolder <> ".." Then
これ、どういう意味なのか解説をお願いしたい
(書いてる人たちにケチつけてるんじゃなくて、本当に分らない事を教えて欲しいだけです)
どなたか教えてください、よろしくお願いします

762 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 09:45:06.41 ID:fOQst04i0.net]
>>740
コマンドプロンプトで cd .. って打ってみたら判る 
c:>test>test1> cd ..
親ディレクトリに移動する。つまり親フォルダの事

「.」 は「.」 カレントフォルダの事

763 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 10:22:00.13 ID:fOQst04i0.net]
寝ぼけて書いてたからめちゃくちゃだな^^;

c:\test\test1> というフォルダがあったとしてそこで
c:\test\test1>cd .. と打てば
c:\test> と親ディレクトリ(フォルダ)に移動する

764 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 10:45:52.46 ID:90Vjgj1Fa.net]
>>740
ループ内でDimしてもエラーにはならないよ
その都度メモリが割り当てられるだけじゃないかな
フォルダ名の"."と".."は相対パスじゃなかったかな
一個上と二個上の親フォルダだったと思う
間違ってるかもしれないから調べてね

765 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 10:46:46.56 ID:90Vjgj1Fa.net]
あ、間違ってたw
.がカレントフォルダで..がひとつ上の親フォルダね
すんませんな

766 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 10:48:05.37 ID:90Vjgj1Fa.net]
あとsplitの問題に関しては読みやすさとか書きやすさじゃね
俺もよくやる
楽だからね

767 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 12:51:59.50 ID:u0gTyM9V0.net]
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 と入れてくれ

768 名前:744 mailto:sage [2017/12/27(水) 12:58:13.04 ID:u0gTyM9V0.net]
間違っていたので、修正した

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月い

769 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 13:38:32.87 ID:lJNZ7xHQ0.net]
VBA勉強し始めて間もない時に組んだマクロに
replaceという名前のプロシージャを作りました
そのことはすっかり忘れてたのですが、最近になってそのマクロを手直しする必要があって
その中でReplace関数を使おうとしたらエラーが出る
おかしいなと思い調べてみたらSub replace() を発見
プロシージャの名前を変えたら大丈夫かと思いきやなぜかどこかに何かが残っているようでエラーがでる
一旦そのモジュールを解放したらReplace関数は使えるようにはなりました
しかし、なぜかReplaceと打ってもreplaceとなる
replaceと打ってもそのままreplace
replaceをReplace関数と認識してくれてはいるものの、どこかに何かが残っている
他のブックでは起きないのでまぁそれほど支障はないものの、もし分かる方いらっしゃったら
どうすればいいか教えてください

770 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 13:47:19.08 ID:fCTi8N3va.net]
Replaceで変数宣言してみ



771 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 15:20:29.55 ID:DW1nj5RcM.net]
>>748
大文字小文字は、現在開いてるコード全体で統一されてしまうからな。
変数でもプロシャージャでもいいから、定義し直すと内部で覚えてる大文字小文字が上書きされるぽ
この仕様のせいで、他人の書いたブック開いたまま修正保存するといつのまにか変わってたりする。
するとWinMergeとかでDIFFしたときにイラッ
独り言でした

772 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 18:43:06.62 ID:8Kp24ZKYM.net]
プロシージャ外に書いたオブジェクトの寿命はいつまでなのでしょうか?
グローバル変数にオブジェクトを保存してそれをfunctionで返すシングルトンオブジェクトを作ったのですが、
プログラムが一度終了して再度起動した際もオブジェクトが残っており、ゴミデータでエラーが起きています。
一度ファイルを全て閉じるまでは残るものなのでしょうか?

773 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 18:55:21.26 ID:K6GLaCg8a.net]
>>751
グローバル変数ならエラーで止まるかブックが生きてる限りは生きてるんじゃね

774 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 19:03:21.38 ID:4eyrVwN9H.net]
>>751
あとEndで止めると死ぬ

775 名前:デフォルトの名無しさん [2017/12/27(水) 20:23:28.17 ID:ry3vSREld.net]
>>753
End なあ、せめて Class_Terminate()して欲しかった

776 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 20:40:54.92 ID:RyDVOJzS0.net]
>>734 です。

officeの再インストール試してみましたが
不具合解消せずでした・・・・無念

幸い既存マクロは動くので、新規作成と実行は
他のPCでやることにしました。

不具合はExcelだけで、Accessでは特に問題ありませんでした。
一応ご報告まで。

777 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 20:55:52.26 ID:K6GLaCg8a.net]
>>754
てか、マクロ終わったら初期化すりゃよくね?
できない仕様なの?

778 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 21:08:27.21 ID:CubzVxEy0.net]
>>756
マクロ終わったら誰が初期化するん?

779 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 23:24:01.01 ID:TIhBPqs40.net]
>>755
マクロの記録から操作を記録すると
標準モジュール作成される?

780 名前:デフォルトの名無しさん mailto:sage [2017/12/27(水) 23:29:35.39 ID:0b7v1yOK0.net]
>>753

Endだとなにがまずいのでしょうか



781 名前:デフォルトの名無しさん mailto:sage [2017/12/28(木) 02:02:28.11 ID:uSnaEunu0.net]
>>759
Globalで保持していると想定していた変数がいつのまにかクリアされていて想定外の動作をおこし痛い目にあったことがあります。
調べてみたら、エラー発生時またはEnd通過時にGlobal変数の寿命が尽きるようで、、
それ以来、Global変数もEnd Statementも避けています。
記憶が必要な場合は、Cell値やValidation値またはDocumentProperty等を使うようになりました。

782 名前:デフォルトの名無しさん mailto:sage [2017/12/28(木) 02:45:31.50 ID:m7DZbaKUH.net]
VBA初心者です
2つのセルがイコールになるように別のセルの値を変化させるというVBAソルバを作成したいのですが、エラーばかりで全く進みません・・・
現在は7行目から10行目まで構文エラーが出ています。
どなたかご教

783 名前:願います・・・

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
[]
[ここ壊れてます]

784 名前:デフォルトの名無しさん mailto:sage [2017/12/28(木) 05:04:43.84 ID:BF7frMSQ0.net]
>>749
>>750
ありがとうございました。

785 名前:デフォルトの名無しさん mailto:sage [2017/12/28(木) 08:06:18.47 ID:VokPBxMja.net]
>>757
マクロ終わったらオブジェクト破棄するんじゃダメなのかと言うことだが
まあダメな使用なんだろうけど

786 名前:デフォルトの名無しさん [2017/12/28(木) 08:14:47.46 ID:ezpQ52SId.net]
イミディエイトウィンドウにあるオブジェクトのことだよね

787 名前:デフォルトの名無しさん mailto:sage [2017/12/28(木) 17:26:42.52 ID:GeC01ME+0.net]
>>751,760
そもそもプログラムが終了ってどういう事をさしてる?
ホントにプログラムが終了すれば、すべての変数の内容は失われるよ
たんに実行するコードが無くなっただけではプログラムは終了していない

Endはプログラムを終了させるけど、エラー出ただけでは終了するとは限らない
デバッグで再実行や変数見たりできるのはプログラムは中断したけど終了してないから

788 名前:753 mailto:sage [2017/12/28(木) 23:10:38.77 ID:lWNTZScR0.net]
>>758

753です。

マクロの記録そのものができないのです。
記録しようとすると「マクロの記録ができませんでした」と
エラーが出てしまいます。

新規作成と編集が全て制限されているようです。
セキュリティは「すべて有効」で設定しており、
そこでの問題は無いと思うのですが・・・・

789 名前:デフォルトの名無しさん mailto:sage [2017/12/29(金) 04:00:07.55 ID:G/qmS2zk0.net]
>>761
"_" は次の行をつなげるためにつけたのだろうけど
Application.DisplayAlearts = True の前の行にも "_" が付いているから
何か貼り付け忘れか、間違って削除してしまったものがあるのでは

790 名前:デフォルトの名無しさん mailto:sage [2017/12/29(金) 04:08:47.98 ID:G/qmS2zk0.net]
セキュリティーレベル一番高いとダメなんじゃね



791 名前:デフォルトの名無しさん mailto:sage [2017/12/29(金) 07:22:34.45 ID:b/Z/hzqU0.net]
>>734
あー、昔そんな事象に当たったことあるよ
原因は同じかどうかは分からんけど
俺の場合とんでもなく深い階層のフォルダに置いてたら
VBEのシートモジュールが青く表示されてコードが作成できなくなった

そのファイル、とりあえず浅い階層のフォルダや
どこかのサーバに置いているなら
クライアント側にコピーして内容確認出来る?

792 名前:デフォルトの名無しさん mailto:sage [2017/12/29(金) 08:53:00.31 ID:JNsjSKSN0.net]
732、753です
皆様レスありがとうございます。

作成の不具合は、全くの新規Bookでも起こります。
既存マクロの場合は、コードの表示と実行は行えますが
編集が制限されています。

問題が発生してから、他のPCで新規作成したマクロを
該当PCで実行しようとしましたが、それはコードの表示すら
できませんでした。ファイルサーバー経由とかではなく
デスクトップ上に置いて実行しても同じです。

Accessでは特に問題ないので、VBAそのものではなく、
Excel単体の何かだとは思うのですが、皆目見当がつきませぬ。

793 名前:デフォルトの名無しさん mailto:sage [2017/12/29(金) 10:57:41.44 ID:MXSoKJ1y0.net]
>>767
>>761です
一部コピペして使ったので何か消してしまったのかもしれません・・・
確認してみます、ありがとうございます。

794 名前:デフォルトの名無しさん mailto:sage [2017/12/30(土) 12:22:18.46 ID:cGzM6pFo0.net]
CreateObject("System.Collections.ArrayList")ってやったら
.NETのArrayListがVBAで使えてしまったんですが
これ隠し機能とかじゃなくて正式に使っていいんですよね?

795 名前:デフォルトの名無しさん mailto:sage [2017/12/30(土) 13:25:09.57 ID:dKM8JRI70.net]
前にも話題に上がったけど
.NETのほんの一部はVBAからも使える
リファレンスにも書いてあったような気がする

他で代替できるのでArrayListをわざわざ使うメリットはないということで
その

796 名前:ときは終わったと思う []
[ここ壊れてます]

797 名前:デフォルトの名無しさん mailto:sage [2017/12/30(土) 15:32:35.43 ID:cGzM6pFo0.net]
>>773
参考にします。ありがとうございました

798 名前:デフォルトの名無しさん mailto:sage [2017/12/30(土) 15:33:00.15 ID:xXJ5T9Ia0.net]
>>772
.Net Frameworkの機能でコンストラクタに引数を渡す必要のないものは使えるらしい
>>773
ArrayListは各種メソッドが揃ってるからコレクションより使いやすいんじゃね?キーを使わないなら
ただ遅いのがたまに傷

799 名前:デフォルトの名無しさん [2017/12/31(日) 01:12:29.94 ID:z2hgHR3O8]
フォルダ(C:\print)内の複数のPDFファイル(ファイル名不規則)を、各々1頁目のみ連続印刷したいと思ってます。
VBAやコマンドライン初心者ですが、ネットで調べたところPDF xchange viewerのコマンドラインで1頁目のみ連続印刷する方法はわかりました。
しかし、下記のように各ファイルについてファイル名もパスも記載しないとダメなようでした。
PDFXCview.exe /print:pages=1 C:\print\123.pdf C:\print\abc.pdf

VBAの方では下記のように*.pdfでファイル名必要なく連続印刷できますが頁指定の仕方が分かりません。
/tをとれば印刷ダイアログ開いて頁指定できますが、いちいち全てのファイルについて指定しないといけないので余り意味がありません。
何か良い方法がないでしょうか。
Sub pdf印刷()
Dim strPath As String
Dim strFilename As String
Dim myShell As Object
Set myShell = CreateObject("WScript.Shell")
strPath = "C:\print"
strFilename = Dir(strPath & "\*.pdf")
Do While strFilename <> ""
myShell.Run ("AcroRd32 /t " & strPath & "\" & strFilename)
strFilename = Dir
Loop
Set myShell = Nothing
End Sub

800 名前:デフォルトの名無しさん [2017/12/31(日) 08:34:16.68 ID:5sx4VZ0k0.net]
>>774
Windows APIだって使えるんだぞ?



801 名前:デフォルトの名無しさん [2017/12/31(日) 08:58:37.79 ID:TXRnAgcd0.net]
VBAの保存方法について
バックアップどうしてますか?
VBAのマクロだと戻る釦聞かないし、バグって復旧するとマクロの個所全部消えちゃうので2つくらいのバックアップを別ファイルでとってあるんですけど皆さんはどうしてますか?
まだ素人なので思ったのと違う処理になって戻せなくなることがしょっちゅうあるので
バックアップは大事

802 名前:775 [2017/12/31(日) 09:02:17.31 ID:TXRnAgcd0.net]
>>778
戻る釦ってまるい矢印の奴ね

803 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 09:09:26.61 ID:PwPBZUwb0.net]
>>778
バージョン管理システム入れてないなら同じになるでしょ。
俺も同じくでファイル名_Ver nnn.xlsmと言うかたちで3世代別フォルダに保存してるけど
(時たま忘れたりする^^;

804 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 09:49:30.47 ID:aMifsa1T0.net]
マクロ有りエクセルファイル自体にデータを入れて運用するのと、
データは別エクセルファイルにしてマクロ有りエクセルファイルでデータ入りエクセルファイルを操作するのと、
どっちがメンテナンスしやすい作り方だろうか?
いつも悩んでしまう

805 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 09:52:29.70 ID:35C6Q16O0.net]
アドインマクロにしましょう

806 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 11:06:17.25 ID:fsRyV04Q0.net]
マクロのバージョン管理ってどうやってます?
インポートファイルを分けすぎると不便なのでshareFanction見たいなインポートファイルに使いそうな関数全部入れてますが、初心者なもので開発中に関数の引数や戻り値を変えたくなるような場面が多々あり
今までのshareFanctionと互換性が保てなくなりますが、引数と戻り値を修正した関数以外でバグを潰したような関数は最新を使用したいです。
今はコピペで対応してますが

807 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 11:27:58.03 ID:rNrttlhS0.net]
個人なのか仕事なのか書かないと有効なレスがつかないのではないかな

808 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 11:34:47.18 ID:fsRyV04Q0.net]
>>784
個人です
個人で開発、個人で使用

809 名前:ナす []
[ここ壊れてます]

810 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 11:36:51.05 ID:rNrttlhS0.net]
>>785
ならGithubとSourceTreeで快適にできるんじゃないの?
俺も全然高度な使いこなしできてないけど楽ちんだ



811 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 11:55:17.97 ID:fsRyV04Q0.net]
>>786
ありがとうございます

ざっとみた感じソースファイルのバージョン管理はできそうですが、
例えばサーバーあるいはローカルマシン上にそのshareFanctionを使用している分散しておいてある場合、
それぞれのマクロを調べて更新したいファイルを選択、修正版マクロを適用する、
みたいな使い方ってできるんですかね?

812 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 11:57:21.02 ID:fsRyV04Q0.net]
>>787

>>例えばサーバーあるいはローカルマシン上にそのshareFanctionを使用している分散しておいてある場合、

修正
shareFanctionを使用しているファイルが

813 名前:デフォルトの名無しさん [2017/12/31(日) 12:53:47.48 ID:TXRnAgcd0.net]
ヴァージョンって仕事じゃないからいつから何時まででUP履歴にしたらいいかわからなん
機能変更したら必ずかもしれないけど、個人用だとやりながら変更しているからバージョン数が半端ないことになる。

814 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 13:10:06.47 ID:sYPUhsnja.net]
バージョン管理は大変だよな
インストーラーみたいなのつくってどうにかしようとしてるがうまく行くかわからん

815 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 13:25:39.05 ID:pVPyHW7p0.net]
>>789
> バージョン数が半端ないことになる。
問題ないでしょ

816 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 13:31:04.61 ID:fsRyV04Q0.net]
>>790
専用のソフトがなければ1sheetをマクロ関数管理用にして各関数内にver x.y.z(x変更で互換性無し、y変更で互換性あり、z変更は互換性ありバグ修正みたいにして)
モジュールをインポートしたファイルをオープン時に、イベント検知で所定の管理ファイルを検索、新しいバージョンがあれば自動で今までのモジュールを解放、y,zバージョンが最新のファイルをインポート
みたいにすれば実現可能そうですが結構手間がかかりそうで…

817 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 13:56:42.14 ID:hllNi94Va.net]
マクロで書けよ。
バージョン管理。

セキュリティが低下するけどな。

818 名前:デフォルトの名無しさん [2017/12/31(日) 18:06:59.07 ID:nOUozIFo0.net]
そもそも論として、たかがマクロでバージョン管理が必要になるような力作()作るなよw
キミたちは一体エクセルマクロで何を築こうとしておるのかねw

819 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 18:13:51.04 ID:2b4EaTgg0.net]
仕事でVBA扱ってると色々な理由から小さいマクロでもバージョン管理が必要になってくる。

820 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 19:27:51.32 ID:rNrttlhS0.net]
>>794
内容がぐちゃぐちゃになったら困るものにはバージョン管理が必要さ
力作()でなくても再構築はかったるいからな



821 名前:デフォルトの名無しさん [2017/12/31(日) 19:58:25.49 ID:nOUozIFo0.net]
>>796
力作()じゃないのにぐちゃぐちゃになるってどんだけ当てずっぽうにマクロ書いてんだよw

822 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 20:00:31.71 ID:pVPyHW7p0.net]
社内に展開するとかでサポートが必要ならバージョン管理ぐらいは必須だろ
>>794は無知すぎ

823 名前:デフォルトの名無しさん [2017/12/31(日) 20:24:53.68 ID:nOUozIFo0.net]
>>798
確かにおまえらの考える事は見当もつかんけどなw
別にいいや無能思考に明るくならなくてもw

824 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 20:28:42.31 ID:1PdKj8Yj0.net]
またメゾット君か。

825 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 20:42:44.41 ID:rRjJbr8wx.net]
メゾット君って雰囲気ですぐ分かるよね

826 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 20:54:32.08 ID:KnonKKai0.net]
OLDフォルダにファイル名の後に日付つけたファイルをコピーしてる

827 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 21:20:00.26 ID:A+5By6dM0.net]
ていうかバイナリファイルをバージョン管理システムに登録したところで
単なる時系列バックアップにしかならんうえに
シートを更新しただけでバージョンが変わるから意味ないのでは

828 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 22:37:10.58 ID:rNrttlhS0.net]
力作2.0

829 名前:デフォルトの名無しさん [2017/12/31(日) 22:50:02.43 ID:InzisC8s0.net]
悩みはみんな一緒なんだね。俺はバージョンアップに悩んでアドイン化したが
これはこれで悩ましいところがあるんだな。シートを初期化(つまりClearとかClearContents)する
のにもよーく考えないと結構危ない。アドインはどのブックでも実行出来てしまうからPCに疎いヤツが使うのも考えると
別の方法を考えた方が良いんだろうかとか考えてる。

830 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 22:55:00.56 ID:rNrttlhS0.net]
>>805
アドインてxlamのこと?
だったらそのシートは一切使っちゃダメだよ
プログラムモジュールだけの存在にするべき



831 名前:デフォルトの名無しさん [2017/12/31(日) 23:12:43.15 ID:InzisC8s0.net]
>>806
そりゃ分かってるての。ブックを指定する時は「ActiveWorkBook」とするしかない(決めつけはよくないが)
からよーく考えてコードを書かないと危ない場合もあるって話。使う連中の9割はマクロどころかシート関数も
知らないような連中なんだから。

832 名前:デフォルトの名無しさん mailto:sage [2017/12/31(日) 23:41:30.90 ID:rNrttlhS0.net]
>>807

・処理をスタートするFunction や Subはアドイン側にはない。当該Book側にある
・そのFunction や Subがアドイン側の機能を使う

だとするとアドイン側に「ActiveworkBook」なんて書く必要はなくて、処理対象のSheetやRangeを
引数で受け取るだけになると思うんだがね

833 名前:デフォルトの名無しさん [2017/12/31(日) 23:52:05.59 ID:InzisC8s0.net]
>>808
作業するBookはxlsxなんだよ。マクロはxlms側に書いてある。

なんでこうしたかというと、仕事柄、ブックは地方自治体に提出する場合があるから。

何の事かわからないだろうからもうちょっと書くと、測量データの野帳なんだよ。

834 名前:806 [2017/12/31(日) 23:53:24.81 ID:InzisC8s0.net]
xlmsじゃねえや、xlamだな。

835 名前:デフォルトの名無しさん [2018/01/01(月) 04:27:25.57 ID:WDGj6QXoH.net]
>>809
マクロ有効ブックから
マクロ無効ブックを開いて処理して保存して閉じる
という方法も有ると思う

836 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 09:37:05.14 ID:hnfikatx0.net]
自動処理したいなら>>811だろうし、操作者が開いて何かしたいならメニューに追加しとけばいいだけだと思う
>>809は無知なのかちょっと頭固いんだろうな

837 名前:デフォルトの名無しさん [2018/01/01(月) 13:40:19.53 ID:iV2QIiO7H.net]
>>812
作業ブック側にコード書けないんだよ。知ったかすんなよボケ

838 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 13:55:03.62 ID:7v1CUCWaM.net]
>>813
作業ブックにコードなんか要らんだろ w
知らないなら黙ってろ
てか、アドインでメニュー追加なんて基本中の基本だと思うが
toshimana.hatenablog.com/entry/2014/01/26/204938

839 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 14:25:45.74 ID:7yffOGmB0.net]
知らないことを素直に知らないと言いなさい

840 名前: mailto:sage [2018/01/01(月) 14:27:07.60 ID:tZ/lpIQo0.net]
今年はいい年になるかなw



841 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 14:29:26.10 ID:UomJiKNZ0.net]
>>814
Workbook_AddinUninstall てのは知らなかったな。
Workbook_Open するのと効果は違うんだろうか?

842 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 14:54:13.21 ID:ixsE+qrMx.net]
またメゾット君が暴れてるな
あの馬鹿が出入りするようになってから荒れすぎ

843 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 15:45:18.49 ID:bzNinO0Ma.net]
>>817
よく考えろよ

844 名前:デフォルトの名無しさん mailto:sage [2018/01/01(月) 16:11:19.12 ID:PLRWaMeF0.net]
>>819
おっと、 Workbook_AddinInstallを Workbook_AddinUninstallと書き間違えた

845 名前:デフォルトの名無しさん mailto:sage [2018/01/02(火) 09:36:26.90 ID:nA397GZea.net]
>>820
だとしてもだ
イベントの言葉の意味そのままだよ
よく考えろよ

846 名前:デフォルトの名無しさん mailto:sage [2018/01/02(火) 12:29:02.41 ID:MKa2S+Tjd.net]
>>821
「対象のアドインを参照設定しているブックを開いた」というイベントを想定してた
そうじゃないのね

847 名前:デフォルトの名無しさん mailto:sage [2018/01/03(水) 10:57:08.56 ID:rhTFyGx/0.net]
>>806
そんなことはない。
設定値を保存するためのiniファイルの代わりにするとか、テンプレートの代わりにするとか、使い道は沢山ある。

848 名前:デフォルトの名無しさん mailto:sage [2018/01/03(水) 11:46:24.84 ID:ZpYRfYyG0.net]
アドインにするにしてもなんにしても運用がしっかりされてないと意味がない
ファイル名やシート名程度が保証されてないならマクロ化なんて諦めろ

849 名前:デフォルトの名無しさん mailto:sage [2018/01/03(水) 11:59:35.70 ID:Uz65NhYa0.net]
>>823
設定値を保存するのはやめたほうが良いと思うな。
バージョンアップしたときに設定値がリセットされてしまうとか、エクセルバグの巻き添えでブック破損の危険性がある。
できるだけアドインは読み取り専用で運用するべきだと思う。
過去に内部シートに保存するように作って問題が起きたので、バージョンアップ時にxmlにコンバートさせた事があるわ

850 名前:デフォルトの名無しさん mailto:sage [2018/01/03(水) 12:49:50.09 ID:lLEkaf6s0.net]
お前のバグを根拠にされてもなぁ



851 名前:デフォルトの名無しさん mailto:sage [2018/01/03(水) 14:45:49.49 ID:hfgsKA7ma.net]
まあ、設定は外出しにするのが普通に安全策じゃね?
xlamのシートは明らかに利用してほしくないっていう思いが伝わる作りな訳だから

852 名前:デフォルトの名無しさん mailto:sage [2018/01/03(水) 15:32:51.77 ID:00k1dN96d.net]
利用者が不用意にセルデータをクリアしてそのままセーブしても自覚すらしないかも

853 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 05:46:13.89 ID:UuI+tM4Q0.net]
質問よろしくお願いします。

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行程です。

854 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 06:37:20.49 ID:MFccPkO20.net]
1000行程度ならSUMIFSとかでできるんじゃないの

855 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 06:55:39.59 ID:IcyEu6L/M.net]
>>829
要件によるけどそういうビューを作ればいいんじゃね?
create view V as (
select A列,B列,C列,sum(D列) as D列
from 表
group by A列,B列,C列
)

856 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 06:57:20.78 ID:IcyEu6L/M.net]
すまん、寝ぼけててSQLスレと勘違いしてた...
>>831はなしで

857 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 07:39:39.14 ID:IGCyfMcU0.net]
>>829
見るからにデータベース向けの案件
集計するキーとなる列が左端一列、その右に合計対象の数値列という2列形式なら
データタブにある統合でできるんだが

858 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 08:01:11.56 ID:5mprgbRzp.net]
>>830
すみません説明不足でした。
キー項目が1000種類以上あり、毎回CSVから読み込んでから処理をする為、事前にWorkSheet関数を作っておくのが難しい状況です。

何か手はありますか?

859 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 10:15:47.38 ID:fF+rBx/60.net]
データベース系のデータは素直にデータベースソフトで管理しようよ・・・。
アクセスでやればマウス

860 名前:操作だけで終わる様な問題だよ。 []
[ここ壊れてます]



861 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 10:22:48.62 ID:d1LyNdol0.net]
>>834
ADOでcsvファイルをデータベースとして接続して >>831 に挙げられた
SELECT文を実行する、という手段がとれる

862 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 10:31:44.20 ID:no6Ylxj0a.net]
sqlならselectとorder byだけですむ案件だな
愚直にプログラム組むと厄介だけどね

863 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 10:38:07.48 ID:7zx5w2nrd.net]
ピボットでいいんじゃね

864 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 11:56:10.93 ID:iFN99ve4d.net]
LINQって使えないんだっけ?

865 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:22:48.32 ID:Gj6t78kg0.net]
>>829
嘔吐フィルターかけてソートしてから
一致を

866 名前:上からみて加算と消去
フィルター解除忘れずに(多分ソート直後にすぐ)
[]
[ここ壊れてます]

867 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:42:37.28 ID:hO93+Igl0.net]
>>829

上級者じゃない俺なんかこういうのみると
全部2次元配列にぶちこんでif多用して無理矢理やっちゃうんだけど
そういうのはだめなの?

868 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:47:48.60 ID:cJgHrV+ta.net]
>>841
だめじゃないし、初心者なら無理やりVBAで組むのも勉強になるよ
重複の無いリスト作るのがやや面倒というか、煩雑になりがちなところだな
エクセルの機能使えばいいっちゃいいけど、好みじゃないな

869 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 13:55:27.88 ID:hO93+Igl0.net]
>>842
おれこういうの無理矢理やっちゃうの大好きで完成すると充実感半端ない
俺が組むマクロってそんなのばかりだ
基本初心者レベルの知識しか使わないでやっちゃうんで、
こういう質問をする人は、無理矢理やると遅くなるとか別の理由があって聞いてるのかな?
とか思っちゃう

870 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 15:19:59.75 ID:kPmYITG+0.net]
ファーム1の中に、オプションボタンが18個あり、オブジェクト名を『OP_1』〜『OP_18』としてボタン1を押してフォーム2に切り替える時に選択されてるオプションボタンのキャプションを取得して変数TUR1に入れたいんですけどどうしたらいいですか?



871 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 16:20:08.23 ID:pGh8JphK0.net]
>>844
For i = 1 To 18
With Me.Controls("OP_" & CStr(i))
If .Value = True Then
TUR1 = .Caption
Exit For
End If
End With
Next

872 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 17:41:48.62 ID:uhyB+DSmd.net]
初心者なんだけど以下のような表から特定のセルに入力された場合だけ、特定のセルをカウントする方法ってありますか?
Aは全て
Bは選ばれたものだけ、みたいな

Aの全てをカウントするのはわけないんだけど、Bの選ばれたものだけをカウントする方法がわからない
IF使うにしても何を指定すればいいのでしょう?

わかりにくかてすいません
o.8ch.net/11r7r.png

873 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 17:54:54.38 ID:IwnGnNnba.net]
>>843
普通にやり方がわからないんじゃないの
>>846
cがキーになるなら重複しないcの一覧をつくって二次元配列でも構造体でもいいけどbがtrueならカウントするっていう風にすればいいと思う
件数多いならDBの領分だと思うけどね、この手の集計は

874 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:02:17.19 ID:HiTEnEcXd.net]
>>845
ありがとうございます!

875 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:13:43.61 ID:uhyB+DSmd.net]
>>847
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定で

876 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:23:20.07 ID:uhyB+DSmd.net]
すいません、間違えて書き込んでしまいました

>>847
Bがtrueなら、というのはどうやって指定すればいいですか?
範囲指定でがっつりやると、指定した範囲に一つでもtrueがあるとカウントしてしまって結局全部をカウントしてしまうんです

877 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:27:59.94 ID:iMxAIJokM.net]
>>829
何も難しく考えなくても、E列に=A&B&Cを入れて、E列を行ラベルにしてピボットテーブルで集計するだけで出来るよ。
ABC列をもどしたいならINDEX,MATCHで引っ張って来ないといけないけども、日々エクセル使ってる人なら手慣れたものだと思う。と言うか慣れておくと色々便利。
詳しい解説いるならする

878 名前:デフォルトの名無しさん mailto:sage [2018/01/04(木) 18:58:58.92 ID:IwnGnNnba.net]
>>850
一行ずつループしてるんだよね?
フラグ用に変数用意してるなら一ループごとに初期化し直さないとだめよ
ってか、今どんなコードで動かしてるか書いてくれるとやり易いんだけど

879 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 02:37:52.28 ID:Uixpo ]
[ここ壊れてます]

880 名前:pG00.net mailto: フィルタとCOUNTIFで良い気がするが
どうしてもVBAでやりたいのか?
[]
[ここ壊れてます]



881 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 17:45:28.92 ID:Kfn/8I4m0.net]
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との組み合わせでクリックできないので何か手段があれば教えて頂きたいです。

882 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 21:06:25.46 ID:UyFZaUswa.net]
>>829
そういう処理だったらソートしても問題無さそうだからソートしてループで良いんじゃね?

>>854
4桁の数字以外共通だとどうしてForとGetElementsByTagnameとの組み合わせでクリック出来ないのかが分からん。

883 名前:851 mailto:sage [2018/01/05(金) 21:25:01.57 ID:Kfn/8I4m0.net]
>>855
あ、確かに。書き間違えました。下記のコードだと10個のリンクのうち、一番上にあるやつをクリックすると思うのですが、
C5セルに入力した特定の4桁の数字の下にあるリンクをクリックしたいのです。
For Each obj In objIE.Document.getElementsByTagName("a")
If InStr(obj.innertext, "取消") > 0 Then
obj.Click
Exit For
End If
Next

884 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 22:16:41.06 ID:vO88ak3C0.net]
DOMに親要素とか隣の要素を見ていくのあったよね
あれで必要なだけ移動させればいいんじゃね

885 名前:デフォルトの名無しさん mailto:sage [2018/01/05(金) 22:20:08.87 ID:vO88ak3C0.net]
>>829
>>836の方法で頑張ってコードにしたのを書き込みたいんだけど
403になっちゃうのよね
禁断のコードが含まれているのかしら

886 名前:デフォルトの名無しさん [2018/01/07(日) 08:20:46.08 .net]
>>846
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文を書く必要がある。

887 名前:デフォルトの名無しさん mailto:sage [2018/01/08(月) 01:12:41.23 ID:bgHHDE53D]
>>856
すごい お馬鹿な返信で申し訳ないけど
イメージとしてまず、

<a href = URL1</a>
<br />**** ← 4桁の特定の数字が入る
<a href = URL2>予約中</a>
<a href = URL3>[取消]</a><br /><a href = URL4>[訂正]</a>

の部分がページ内で繰り返して複数あるなら、この部分だけを取り出す処理を繰り返して splitなりで個数を数えて 処理するとか。(取り出す位置は、InStrで取って、終わり位置を 次の開始位置にして)

その上で、この部分にC5と同じ値があるならクリックするとか。
C5の値を変数aにして、InStr(取り出した部分, a) > 0で良いような。


すいません。曖昧な返信で。

888 名前:sage [2018/01/11(木) 23:28:08.34 ID:kwmxLljDv]
教えていただきたいです。

あるセルの数字に関して
o以下と12以上はA
6以上12未満はB
それ以外はなしという式を作るとしたら

=if(or(セル<0,セル>=12),"A",if(6<セル=<12,"B"," "))
という式ではちゃんと返ってきません。

正しい式をご教授願います。

889 名前:デフォルトの名無しさん mailto:sage [2018/01/11(木) 12:40:04.91 ID:eKl5cJvJd.net]
コンボ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

890 名前:デフォルトの名無しさん mailto:sage [2018/01/11(木) 19:23:41.06 ID:WJjCr32Q0.net]
エクセルの2003ですが、
並べて比較を使用した際にペアになっているブックと、
そのブックで表示されているシートを取得するには
どのように記述すればいいでしょうか。



891 名前:デフォルトの名無しさん [2018/01/11(木) 21:16:23.66 ID:JbTpKTF6M.net]
>>863
何を言っているのでしょうか?

892 名前:デフォルトの名無しさん [2018/01/11(木) 21:25:37.65 ID:a2sLbYI50.net]
世界教師マイトLーヤ「大暴落は日本からスタート」
rio2016.5ch.net/test/read.cgi/2chse/1512813686/l50
【マイトLーヤ】 米国債を売れ 【1200兆円】
https://medaka.5ch.net/test/read.cgi/eco/1515587891/l50

893 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 01:30:55.27 ID:GWvM9lig0.net]
>>863
Excel2003はサポート切れてますので
Excel2007にのりかえましょう

894 名前:デフォルトの名無しさん [2018/01/12(金) 01:41:04.62 .net]
>>866
Excel2007なら>>863できるん?(´・ω・`)

895 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 15:56:41.55 ID:kdQVxAch0.net]
0回目って何?

896 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 19:59:42.26 ID:8L8z7qJh0.net]
vbModelessで開いたUserForm上のTextBoxにSetFocusするようInitializeに記述しても効きません
これって無理なんですかね?
vbModelessを切るとフォーカスがちゃんとTextBoxに移るんですけどね

897 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 23:20:03.95 ID:Ln5WwMFr0.net]
初期状態でフォーカスを当てたいなら
UserForm.Show vbModeless
UserForm.TextBox.SetFocus
とフォームを呼んでいるプロシージャ側に書く

フォームのイベントならActivateでどうでしょう
毎回フォームがアクティブになるたびフォーカスしちゃうけど

Initializeがなぜはしらないのかは知らない

898 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 23:44:10.99 ID:Ln5WwMFr0.net]
実験してみたらInitializeは呼ばれてるけど
SetFocusだけがだめみたい
他のことは普通にできる
なんでしょうね

899 名前:デフォルトの名無しさん mailto:sage [2018/01/12(金) 23:46:18.93 ID:WKndAwKhM.net]
いやExsel 2007もサポート切れてますが

900 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 03:26:50.74 ID:0Hr8k8ED0.net]
>>871
自分でもいろいろやってみたんですけどやっぱりダメみたいですね
ありがとうございました



901 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 09:26:06.50 ID:60QkmGs40.net]
試してないけど、プロパティのTabIndexも駄目だったの?

902 名前:デフォルトの名無しさん [2018/01/13(土) 10:05:22.76 ID:8yN0Kzpj0.net]
ThisWorkbook.Application.Hwndでブックのハンドルを取得して、
SetLayeredWindowAttributesで透過処理をする時、
LWA_ALPHAでは問題ないのに、
LWA_COLORKEYに変えると、なぜかブック全体ではなく、
シート上に最初に配置したコマンドボタンの方に誤爆します。

しかも、自分のPCでは問題ないのに、他人のPCだと誤爆するという意味不明さ。
ハンドルがずれる的なバグでもあるのでしょうか?

903 名前:デフォルトの名無しさん [2018/01/13(土) 10:12:39.30 .net]
ウィンドウ表示時にフォーカス当てたいんなら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

904 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 10:19:25.53 ID:WLDq+ue70.net]
一つ目の表
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程です。
出来る方、よろしくお願いします。

905 名前:デフォルトの名無しさん [2018/01/13(土) 10:29:13.82 .net]
>>875
LWA_COLORKEYは指定した色を透明にするんだから、
その他人のPCでExcelのウィンドウの色が違うんじゃね?

知らんけど

906 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 10:31:29.99 ID:uYJANG/vd.net]
既存プログラムで引数が多いやつを減らしたいんだけどどうすればいい?
ただグローバル変数使うと他のアプリケーションに影響出るから使えない。
今から構造化やクラスにするのは名前変更が大変そうだし、同じ型でも同じ動作でもないからまとめにくい。

907 名前:デフォルトの名無しさん [2018/01/13(土) 10:39:42.82 ID:8yN0Kzpj0.net]
>>878
それが、コマンドボタンとシートの色を同じにしても、
コマンドボタンの方だけ透過されるんです。

しかも最初に配置したコマンドボタンだけ。
2個目以降は変わらず。

透過の前後で、ハンドルの値をデバッグプリントしても変化ないですし。

908 名前:デフォルトの名無しさん [2018/01/13(土) 10:49:24.82 .net]
>>877
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,"一致データ無し")

909 名前:デフォルトの名無しさん [2018/01/13(土) 11:20:55.87 ID:8yN0Kzpj0.net]
ちなみに、こんなのです。

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

変えているのは最後の引数だけなんですが。

910 名前:デフォルトの名無しさん [2018/01/13(土) 11:27:43.02 .net]
>>879
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



911 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 13:04:46.60 ID:WLDq+ue70.net]
>>881
列の挿入や削除の処理があるので、数式だと参照ズレなどが起こってしまうので出来たらVBAで処理したいと考えています。

912 名前:858 mailto:sage [2018/01/13(土) 13:29:13.07 ID:eGapce6A0.net]
>>866
Excel2010を用意しました。

>>864
エクセルで「Book1」「Book2」「Book3」を開いた状態で、
「Book1」「Book2」を並べて比較している時に、
ペアになっている「Book1」「Book2」を特定する方法、
もしくは「Book1」がActiveWorkbookの時に「Book2」を特定する方法が知りたいのです。

913 名前:デフォルトの名無しさん [2018/01/13(土) 13:42:21.62 .net]
>>885
計算式でできればVBAでもそのままできるやん
>>859参照

914 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 13:47:55.56 ID:fyAvIt7m0.net]
並べて比較って
人間が何かを見比べて確認しているわけだから
その作業は人間がやる必要ないとおもうので
全部VBAでバックグランドで処理すればいいのではないかと単純に思ってしまう
最後に比較した結果だけ表示してあげる

915 名前:デフォルトの名無しさん [2018/01/13(土) 15:21:57.51 ID:eGapce6A0.net]
>>886
比較自体は計算式でできますが、
比較する対象を特定する事は計算式でできない気がします。

>>887
挿入等によって比較したい箇所がBook1と2で異なる可能性がある為、
事前に比較の起点となる箇所を選択する必要があります。

916 名前:デフォルトの名無しさん [2018/01/13(土) 16:53:07.70 .net]
>>888
> 比較する対象を特定する事は計算式でできない
意味分からん

=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

列の追加削除があるということだったら列番号も変数化すればいい

917 名前:デフォルトの名無しさん [2018/01/13(土) 17:00:25.96 ID:zzyV/8sb0.net]
初心者で申し訳ありません
セルに入力した選手コードを選手名に置換するような動きをさせたいのですがどうするとよいでしょうか
別のシートに選手名簿は用意してありA列に選手コードB列に選手名があります

918 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 17:42:32.57 ID:8qhapkmN0.net]
>>890
VBA要らん
VLOOKUPでググれ

919 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 17:48:09.64 ID:8qhapkmN0.net]
すまん「置換」を見落とした
VBAは要るな
WorksheetFunction.VLookup でやるなり、ループで検索するなりやればいい

920 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 17:50:29.11 ID:gLbKwyK9x.net]
>>890
普通はセルに入力された選手コードをわざわざVBA置換するなんてことはしないで、VLOOKUP等のワークシート関数を書くけどね
置換操作をVBAで書かなきゃいけない理由はあるの?



921 名前:デフォルトの名無しさん [2018/01/13(土) 17:58:56.84 .net]
>>890
>セルに入力した選手コードを選手名に置換するような動きをさせたい

セルに選手コードを入力して、Enterを押した途端に選手名に置き換わるような動きをさせたいんだな?そうなんだな?

922 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 18:00:41.47 ID:gLbKwyK9x.net]
>>892
検索置換のダイアログでシート内の選手コードを一括変換する、みたいな手作業の業務手順をそのままマクロ化しようとしているのかもしれないし、そういう場合はそもそもシートの設計や業務手順に問題がある場合が多い。
最初にVLOOKUP使えと指摘したあんたの感覚は基本的には正しいと思うぞ。

923 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 18:06:27.84 ID:fyAvIt7m0.net]
>>890
単発ならワークシート関数でやった方が簡単
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

シートのインデックスとかは書き換えてね
意味不明ならマクロ記録かさらなる修行をオススメする

924 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 18:07:34.63 ID:gLbKwyK9x.net]
>>894
VBAに慣れてる人ならセル値の置換と聞いただけでワークシート更新イベントを使いたいのかなって思いがちだよな
俺も最初はそう思ったわ
でも質問者の質問内容を推測抜きで素直に読むとそうとは限らないんだよな

925 名前:デフォルトの名無しさん [2018/01/13(土) 18:19:24.76 ID:zzyV/8sb0.net]
>>893
トーナメントの結果を入力するようになっているのですが既に報告用ワークシートはあるのですが入力件数が多くなりすぎて最終的にはバーコードによる入力を試みようとしています
また、その報告用ワークシートは書式が決まっており並べ替えエラーチェックのマクロが既にあるので行を入れたりして関数をいれる対応ができないという状態です
>>894
入力後にマクロ実行用のボタンを押して置換するような想定でした
エンターを押した瞬間変わるものでも大丈夫です

926 名前:デフォルトの名無しさん [2018/01/13(土) 18:35:21.45 ID:zzyV/8sb0.net]
>>892
>>896
ありがとうございます
家に帰り次第試してみます
>>895
今まではワークシート内から対戦選手の名前を探してきてコピーアンドペーストで対応していたのですが参加者が年々増えてきて(今年の見込みは約千人位)追い付かなくなってきたために速度向上を目的としています

927 名前:858 mailto:sage [2018/01/13(土) 18:44:45.15 ID:eGapce6A0.net]
>>889
VBAに記述のあるWorksheets("Sheet1") の箇所を、
並べて比較でペアにしているシートに特定する方法が思いつかないのです。

928 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 19:03:27.44 ID:rZTV+Qsta.net]
>>900
ファイル名とかシート名がランダムでないなら
固定値じゃないの?
どんなファイル名か分からない、シート名か分からないってなら都度入力するしかないな。
データ形式で特定することもできるけど、
無駄な作業にしか思えない。

929 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 19:18:42.64 ID:gLbKwyK9x.net]
>>898
こんな感じならどうかな
以下は、実行すると報告用シート内に含まれる選手コード全てを一気に置換する
複数の選手コードを含む場合も一発で置換できるはず

名簿にはコードの欄が空白の行がなく、名簿シートの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

930 名前:858 mailto:sage [2018/01/13(土) 19:32:04.47 ID:eGapce6A0.net]
>>901
ファイルのフォーマットが複数あるので、
事前にファイル名とシート名を規定できないのです。
なので、せめてペアにしたファイル同士が特定できれば、
ファイルとシートを選択する手間が省けると思ったのですが・・・

3つ以上開けなくなるけど、workbooksからマクロブックを除外した先頭2つを比較する方法で考えてみます。



931 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 19:36:48.93 ID:6HVsHBKb0.net]
>>903
それは運用を変えよう。機械的に処理するなら人間側が合わせる必要がある。
手動で命名規則に沿うか、命名自体を自動的にして人間が意識しないようにするか。

932 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 23:03:28.12 ID:aJN0Dby50.net]
エクセル2010でCSVファイルを開いた場合、
UTF8やshiftjisを自動で判定して表示してくれますが、
この時に判定された文字コードを取得する方法はありますか。

用途は、外部データの取り込みでCSVを開きなおすための文字コードの特定です。

933 名前:デフォルトの名無しさん [2018/01/13(土) 23:14:29.83 ID:odSwvUdp0.net]
>>905
application.nkf

934 名前:デフォルトの名無しさん mailto:sage [2018/01/13(土) 23:28:32.80 ID:aJN0Dby50.net]
>>906
ありがとうございます。
試してみます。

935 名前:デフォルトの名無しさん mailto:sage [2018/01/14(日) 06:58:25.18 ID:UVUQYwWb0.net]
>>907
いいってことよ(´・ω・`)b

936 名前:デフォルトの名無しさん [2018/01/15(月) 01:08:16.65 ID:Zqan8uZj0.net]
>>902
実行時エラー13
型が一致しませんとなっていて
For~の行でエラーを出していて止まるみたいです
あと報告シートが選手の強さ別に複数に分かれているのですが今選手コードの入力したシート(つまりいま開いているマクロ実行用のボタンを押したシート)を処理したいという場合どうするとよいのか教えていただけると助かります

937 名前:897 mailto:sage [2018/01/15(月) 01:48:08.96 ID:ubg4QImpx.net]
>>909
エラーの出たコードを転載して見せてもらえませんか?こちらの環境ではうまく動いているんですが、私がコードを転載したときにミスをしたかもしれないので

それから、コードはボタンマクロ(ボタン名_Clickのような名前のプロシージャ)として各シートのシートモジュールに書いているんでしょうか?

938 名前:デフォルトの名無しさん [2018/01/15(月) 11:28:57.27 ID:thpu0oBS0.net]
>>910
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にしてボタンの名前と場所をかえるつもりでしたがあまりよくない方法なのでしょうか
必要であれば既にあるコードを出しますので教えてください

939 名前:デフォルトの名無しさん [2018/01/15(月) 11:58:16.00 ID:Vljo7f2q0.net]
>>908
application.nkf オブジェクトが見つかりませんでした。

下記のapplicationオブジェクト内にも、nkfプロパティが見つかりません。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/application-object-excel

オブジェクトの参照方法が違うのでしょうか。

940 名前:897 mailto:sage [2018/01/15(月) 23:02:33.00 ID:JvjYqsKWx.net]
>>911
申し訳ない、For



941 名前:フ行でEnd("xlDown")となってるの、自分の転記ミスでした
エラーの原因もこれでしょう
二重引用符なしでEnd(xlDown)と書き直して動かしてみてください
[]
[ここ壊れてます]

942 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 12:17:16.43 ID:SelV7zwId.net]
質問です。

ソルバーで普通は目的セルをrangeなどで指定しますが、シートのセルにアクセスせず、vba内の変数を直接ソルバーにかけてvba内だけで完結したいのですが、方法あるでしょうか?

943 名前:デフォルトの名無しさん [2018/01/17(水) 02:18:24.01 ID:x8yvrTsd0.net]
>>913
うまくいきました
ありがとうごさいます

944 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 12:24:27.92 ID:sSjH/Vu40.net]
セルのA列にある文字列をコンボboxにaddですべて入れた後に、一文字入力する度に候補が絞られてくって出来ます?
コード教えてもらえないですか?

945 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 12:31:05.83 ID:TVDu7Qf0r.net]
一文字入力する度にコンボボックスの候補を絞ればいいんとちゃうか?
知らんけど

946 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 13:28:17.12 ID:uuergXrf0.net]
社内に部品表があって、重複している名前を省いて部品種類一覧の表を作ろうと思ってます。
・ネジ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件超の部品の種類があり、こちらを処理するとフリーズします。
デバックのウィンドウはユニオンのところを指定してきてるんですが、ユニオンにはまとめられる量の限界などがあるのでしょうか?

947 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 13:33:34.73 ID:wJgnfOTG0.net]
>>918
Accessでやれ。

948 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 13:41:46.63 ID:CFAgCrzx0.net]
>>918
ソートして重複を削除じゃダメなのか?

949 名前:デフォルトの名無しさん [2018/01/20(土) 15:03:19.74 ID:Fb/tMd6M0.net]
>>918
Excel VBAでやってもいいけど、RANGEオブジェクトに溜め込むやり方よりは、素直に別シートに値をコピー、さらにそれを検索して別の値が出てきたら別シートにコピーでいいんじゃないのか?

そもそもExcelのフィルタ関連の機能でもできるからVBAを使う理由がわからない。

950 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 15:06:48.01 ID:iefRLv2cp.net]
>>918
dictionaryとかでだめかな?



951 名前:デフォルトの名無しさん [2018/01/20(土) 17:40:00.19 ID:91x3kJT10.net]
DBMSがコンソールなんかに返した結果を
Excelセルに上手く貼り付ける方法ってある?

952 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 19:41:33.47 ID:wJgnfOTG0.net]
>>923
詳細忘れたけど代入する事で、そのまま貼り付けられるメソッドがあったはず。

953 名前:デフォルトの名無しさん [2018/01/20(土) 20:44:55.78 ID:Y9eKqT4m0.net]
多くは語らんけどある意味エスパーと言っておこうw

954 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 13:18:30.88 ID:+2jqUeqC0.net]
>>918
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

955 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 15:03:53.81 ID:pRI5Eg/X0.net]
>>862
だれかこれわかる人いません?

956 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 16:45:39.61 ID:WhYlNzfJM.net]
>>918
下手にマクロ組むよりExcelの標準機能の重複削除を使え。

VBAとは違って並列処理できるから速度が段違い

957 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 18:35:28.14 ID:7nwc0luUa.net]
重複なしリストはいろいろやり方あるけど、標準機能使うかadoでやるかがスマートだろうね
dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね

958 名前:デフォルトの名無しさん [2018/01/21(日) 18:40:31.69 ID:nVuQLEta0.net]
ここ初心者スレかと思ってスレタイ見なおしてしまったわw
オレ以外初心者しかおらんやんw

959 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 18:41:57.84 ID:EcNkRoqM0.net]
メゾット君また寂しくなって来ちゃったのか

960 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 18:57:02.81 ID:7nwc0luUa.net]
.netframeworkのlistって重複削除機能なかったっけ?



961 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 20:07:47.89 ID:+2jqUeqC0.net]
>>932
リストにあるかないかはわかるみたい
これなら配列に突っ込んで総当たりしていくのと変わらなそう
読みやすくはなるけど

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

出力処理省略

962 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 20:16:12.20 ID:rQmHQ7OM0.net]
>>929
> dictionaryもありだけど、fsoのやつはなんか取り回しがいまいちじゃね
意味不明
Dictionaryとfsoになんの関係があるんだ?

963 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 21:00:25.33 ID:xouI7cQH0.net]
>>918
とりま、Union関数は遅いから絶対に使うな、それだけ

セル数がちょっと増えると簡単にフリーズする
普通に配列とかに入れてった方がいい

964 名前:デフォルトの名無しさん [2018/01/21(日) 21:12:55.02 ID:nVuQLEta0.net]
>>935
とりま、なんでいきなりそれを言いだしたのかよく分からんが
遅いのはお前のプログラムが下手糞なだけ

脈絡のない下手糞自慢ごくろうさん

965 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 21:38:18.50 ID:Ycn/1JW20.net]
require 'set'
File.readlines("ファイル名").to_set.map { |item| puts item }

Ruby の集合を使うと、以下のような行区切りのファイルを、








以下のような結果にできる。
ただし、集合にはデフォルトで、順番は無いので、
順番が必要なら、お好みの基準でソートする





966 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 21:51:29.18 ID:EcNkRoqM0.net]
毎度思うんだが、Rubyって他言語のスレにまで布教しに来なきゃならないほど不人気なのか?

967 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 22:19:18.53 ID:Ycn/1JW20.net]
Ruby だと、テキスト処理が、めちゃめちゃ簡単に作れる

他の言語のように、悪戦苦闘しない

968 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 22:23:07.58 ID:+2jqUeqC0.net]
どうせなら引っ越し準備も兼ねてPythonにしようゼ

969 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 23:23:35.81 ID:ppfN03med.net]
単純に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

970 名前:デフォルトの名無しさん mailto:sage [2018/01/21(日) 23:45:19.36 ID:Ycn/1JW20.net]
2万個のデータは、テキストデータだけなら、1MB ぐらいだろ

>>937
のRuby でのテキスト処理なら、1秒ぐらいじゃないか?



971 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 00:04:49.43 ID:R+7srG110.net]
>>942
空気読んでね


972 名前:アこはテキスト処理の質問スレじゃなくて
Excel VBAの質問スレだから
[]
[ここ壊れてます]

973 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 01:20:01.78 ID:pYe1Cwj70.net]
そんなに時間が掛かるのなら、一旦データをエクスポートして、
データをテキスト処理してから、インポートして戻せば?

たかが、2万個のデータで、1時間は現実的ではない

そんなに時間が掛かっても、どうしても、VBA でやりたいのか?

974 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 01:43:29.00 ID:zmIcszTc0.net]
あくまでUnionを使った場合であって高速に処理する方法はいくらでもあるからなぁ。
それに仕事でVBA使う環境だと他社との協調も考えなきゃいけないからRubyインストールする方がよっぽど非現実的だし。

まぁ、たぶんおちょくってるつもりなんだろうけど、そもそもVBA以外の環境がないって前提のスレだから、
Rubyマンの煽りが煽りになっていないっていう・・・。

975 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 04:08:31.22 ID:Xp9Ai2fT0.net]
重複の削除はワークシートでやった方がてっとり早いと思う

976 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 04:38:17.99 ID:AE7SVx7N0.net]
>>945
> そもそもVBA以外の環境がないって前提のスレだから
そんな前提で質問に来る人もいるだろうけど、
「最適解」を求めている人が、とりあえずVBAだとどうなるか、と思って質問する場合もあるでしょ

だから、質問者が「全体にVBA以外はダメ」って制限をかけていない限りは、
上でも、ACCESSを進めている人もいたけど、実用面から考えた回答も質問者の利益になると思うんだけど
(質問者がそう思っていても、何も知らないからそう思ってるってパターンすらあり得るかな)

977 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 05:56:27.49 ID:zmIcszTc0.net]
>>947
Excel VBA質問スレでの「実用面」は、一般的な企業向けWindows PC(Office製品入り)で出来る事に制限されると思うけど。
それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。

だいたい他の言語に興味があるなら、その言語のスレで質問すりゃいいわけだし、
どんな自己弁護をしたところで特定言語のスレで他言語の話をする理由にはならないよ。

せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
Rubyスレに誘導して、そちらで話を展開すべきだね。

978 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 08:37:35.39 ID:AE7SVx7N0.net]
>>948
> それに質問者が明言した事以外は「出来ない」と考えておくのが常識だと思うね。
リアルでも、相手に聞きもせずに勝手にそんな縛りをかけて要件定義する人はいないと思うよ

> せめて質問者に対してVBA以外の開発環境は無いか訊ね、Rubyが使えるという自発的な回答が得られた時に初めて、
> Rubyスレに誘導して、そちらで話を展開すべきだね。
環境を聞くのは勿論ありだが、「○○だとより簡単にできるよ」ってこちらから言う事に何の問題があるのか?
今ある環境内で必ず実現する必要があるなら別だが、そうでない場合もよくあることでしょ

ま、いずれにせよ、何も聞かないうちに勝手に「○○に違いない」って決めつけるのは、
要件定義では一番しちゃいけないことだよ

979 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 10:06:54.55 ID:zmIcszTc0.net]
>>949
仕事している風を装いたいんだろうけど、明らかに経験が無いの丸出しなんだよな・・・。

そもそもVBAスレでRubyの話を出してくる事自体が問題なんだよ。
君が問題になっているのは要件定義の話ではなく開発環境の話だ。

明確な線引きをするなら、このスレではxlsmに記録し、特別な準備なしに実行できるものでなければ、何であれ許容範囲外だ。

980 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 10:12:50.46 ID:JFwvghX1M.net]
またそうやって明文化されてもいない自分ルールを展開していくー



981 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 10:23:32.81 ID:zmIcszTc0.net]
明文化されてはいないけど、過去から今までのスレでの反応を見る限りは、
だいたいxlsmファイル単体でマクロの実行が補完できるかどうかが拒絶反応の出る出ないを分けてるよ。

ただ個別にマクロが記録された二つ以上のファイルを連携させる場合の話もあるから「xlsmに記録し、準備なしに実行可能な」と定義しただけ。
押しつけるつもりはないけど、この定義で問題が無ければテンプレに加えてキチ避けしてほしいくらい。

982 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 11:30:49.09 ID:r0T2WJT6a.net]
>>934
ごめんscriptingRuntimeのやつ、の間違いだ

983 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 11:33:07.33 ID:y0jssaARd.net]
VBAをメインとして他言語も補助的に使う。
それなりにあると思う

984 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 15:12:56.07 ID:EwN8a0pa0.net]
同じ現象が起きるようにできるだけ簡単なコードを用意しました

まっさらな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は例示にすぎずいろんな文字列が入ります
よろしくお願いします

985 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 15:25:33.05 ID:EwN8a0pa0.net]
>>955ですけど、KeyCode=40、つまり矢印キー下にセッティングして
TextBox1から2に移ると頭にカーソルきますね
ということは、入力した矢印キー右がTextBox2に移ったあとも生きててその影響が出てるってことですかね
まぁ原因分かっても解決方法が分からないのですが

986 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 16:37:43.27 ID:DgxtyBXU0.net]
試していないけれど
With TextBox2 の前に
KeyCode = 0 を入れたらどう

987 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 17:07:09.72 ID:+/nnDvsjM.net]
>>954
VBAでは書きにくい or 実行速度がめちゃ遅い
かつ
その言語なら簡単に書ける or 実行速度が速い

ならありうると思う
なのでAccessとかADOならまだわかるけどRubyはないな

988 名前:デフォルトの名無しさん mailto:sage [2018/01/22(月) 22:49:33.42 ID:EwN8a0pa0.net]
>>957
しゅごい・・・できました
ありがとうございました

989 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 10:46:16.37 ID:QE61Ho6h0.net]
。と。の間に入ってる文字を全部同じ文字に置換したい場合ってどうすればいいでしょうか?

。。       →。ccc。
。akok。    →。ccc。
。3293i9ia。  →。ccc。

みたいな感じです

990 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 11:16:56.30 ID:QE61Ho6h0.net]
すいません数式の中の。と。の間の文字を置換でした



991 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 12:30:55.33 ID:4OtF4psx0.net]
数式の中のってのがよくわかんないから実際の数式を書いてくれ

992 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 13:09:34.71 ID:QE61Ho6h0.net]
こういう事がやりたいって感じです
わかりづらくてすいません

=123456789(この9桁の数字はランダム) → =123ccc789
=123456789(この9桁の数字はランダム) → =12ccc3456789

993 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 13:24:33.86 ID:96uZKYcfd.net]
>>963
。の話はどこへいったんだ?

994 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 13:52:49.81 ID:QE61Ho6h0.net]
いやこっちの方がわかりやすいかなとw

995 名前:デフォルトの名無しさん [2018/01/24(水) 14:37:17.59 ID:626EYBnb0.net]
2週間くらい前から、

フォームコントロールのボタンを配置すると

エクセルファイルの起動が

いつもの起動時間の5倍くらいかかる様になり困っています。

ちなみに、新規のファイルでも同じ現象になり、

他のパソコンでも同じ現象になっています。

どなたか、解決方法を知らないでしょうか?

今使っている環境は

Windows 10、バージョン 1709
Excel2016 バージョン 1712

です。

996 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 14:47:11.88 ID:LHEOU22dM.net]
>>965
草生やしてんじゃねえよ真面目に質問しろ

997 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 16:00:42.34 ID:eVK1iV6m0.net]


998 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 17:24:26.92 ID:QE61Ho6h0.net]
なんでwなんて打ったのか・・・反省してます

999 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 17:48:11.23 ID:cTEKAhE2M.net]
>>969
VBA 正規表現 置換
でググれ

1000 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 19:49:39.94 ID:4OtF4psx0.net]
>>963
みんなこれでわかるの?
上と下に規則性があるように見えないんだが
上は値を置き換えてて、下は挿入してるよね



1001 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 20:02:49.35 ID:XHxrtrwiM.net]
わかりません

1002 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 21:10:53.71 ID:6b5evSsja.net]
>>918
そのテキストファイルがCSVファイルみたいにカンマ区切りで
ヘッダとして項目名が付いてて項目名に重複が無ければ
そのファイルにSQLぶん投げて結果セット取ってこれるんだけどなぁ

1003 名前:デフォルトの名無しさん [2018/01/24(水) 21:14:29.60 .net]
地道にループぶん回してFomulaLocalとInStrとMidしてちょ

1004 名前:デフォルトの名無しさん mailto:sage [2018/01/24(水) 21:29:25.29 ID:l13g0WQj0.net]
いや、ループするにしても
VbScriptingDictionary使うかCollection使って
値をキーとして登録して
同じキーがあれば無視、無ければ登録追加で
最後にその取っておいた内容を
展開するようにすればそこそこのレスポンスで
行けるんじゃないかな。

SQLで行けるならそれが最速だとは思うけど。

1005 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 19:41:38.87 ID:x0ph6Erf0.net]
ちゃんとしたDBMSならともかく、エクセル表にSQL投げて実行速度が速いとか考えられんけど

1006 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 21:14:11.87 ID:xVw6nJl50.net]
ADOだとそれなりに早いイメージなんだけど
実際はどうなのかね
誰か検証していてもよさそうだが

1007 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 22:04:13.28 ID:BYFi0PM80.net]
一項目だけの比較なんかだとVBAでやるのと変わらないけど、色々と条件が増えていくとSQLの方が速度が落ちにくい。
あと他の誰かが見ることも考慮すると、SQLで見えるようにしておいた方が分かりやすい。

ただExcelでSQLというのは絶望的に使いづらい。

1008 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 22:28:41.91 ID:3kW0jqmr0.net]
UPDATEはできるけどDELETEができないんだっけ?

1009 名前:デフォルトの名無しさん mailto:sage [2018/01/25(木) 22:46:48.37 ID:2HN+h3+60.net]
できなくてもやらなきゃいけない時があるんだよ男にはな

1010 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 10:16:15.47 ID:i1V2CYFLa.net]
エクセルのテーブル機能ってどうなんよ
あんまり使わんから馴染みないんだけどsql使いやすくなったりせんの?



1011 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 14:00:22.47 ID:ewTTza6/0.net]
>>980
猫もだよ
穴に逃げた虫を懸命に取ろうとしている

1012 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 19:52:38.86 ID:uoysLyn50.net]
こういうのを見ると
早くPython導入して欲しいって思うよな
アンケート取られてたからちょっと入門見たけど結構面白いわアレ
こういった集約的なことに関してもずっと楽に作れそう
VBやC#でも後の方で覚えることになるラムダ式や
イテレーターとかごく基本的な当たり前のこととして
いきなり最初から出てくるし

1013 名前:デフォルトの名無しさん [2018/01/26(金) 20:26:28.69 ID:Vo+OzJVu0.net]
VBAですら暴走しまくりのお前らにpythonなんか与えたら社会を困らす力作マクロ()がますます増えちゃうじゃんかw

1014 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 20:36:36.35 ID:VXa7znFt0.net]
コードをまともに読み書き出来ないメゾット君が心配するような事でもないけどな

1015 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 22:00:17.36 ID:mlDN6tJ0d.net]
VBAを廃止なんてできるわけないからPythonと入り乱れたプログラムになるんだろーか?

1016 名前:デフォルトの名無しさん [2018/01/26(金) 22:15:41.07 ID:pXxYwYu40.net]
職場の環境じゃVBAくらいしか選択肢がない

1017 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 22:23:52.83 ID:Ji/nweCn0.net]
>>987
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1097447.html

1018 名前:デフォルトの名無しさん mailto:sage [2018/01/26(金) 22:40:51.06 ID:VXa7znFt0.net]
影響するのは最新バージョンだけだろうし、Excel版Pythonの初期バージョンだと使い物にならなかったり参考文献が少なかったりの問題で、
本格的に使われるようになるにしても五年以上かかりそう。そしてそこからさらに数年経たないと、そのバージョン使う会社が出てこなさそう。

っていうか今までもVBAをVB.Netへ移行させようとして失敗してたらしいし、AIブームに乗じた一時的なもんで実現しないんじゃないの。

1019 名前:デフォルトの名無しさん [2018/01/27(土) 00:23:34.40 .net]
Pythonって起動にめっちゃ時間がかかるから(5秒くらい)
普段使いのちょっとしたツール作るには使い物にならないという印象

1020 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 00:36:59.48 ID:Xe+uGT7T0.net]
多分Python載ったとしてもしばらくはVBAと共存だろうとは思う。
勉強嫌いな爺さん達にはPythonが来るのは驚異以外の何物でもないかも知れないけど
導入されたら少なからず徐々に普及し始める。

なぁに、EXCELの中のコンパクトに纏まった世界の話だし
勉強するにはうってつけだと思う。
少なくとも今後のVBAよりは次に繋がるよ。



1021 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 01:00:30.81 ID:/Onm91iZa.net]
今まで言語を変えるような具体的な話は出てなかったからなぁ
まさかObject指向言語じゃなくていきなり関数型言語が来るとはなぁ

1022 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 01:49:19.54 ID:mMQhkopa0.net]
PythonはAIブームの収束と共に消えていきそうな雰囲気だから将来性っていうと疑問が・・・。

1023 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 08:00:53.71 ID:lEBNH3fnr.net]
ツッコミどころ多すぎだけどとりあえずw
オマエがギモンを感じるなw

1024 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 08:16:06.57 ID:ZgMGVzLO0.net]
>>990
> Pythonって起動にめっちゃ時間がかかるから(5秒くらい)
さすがにPC買い換えようよ...

1025 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 11:01:00.79 ID:Nudrd5lRF.net]
Excel Python 質問スレ
mevius.2ch.net/test/read.cgi/tech/1517018055/

1026 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 14:29:11.91 ID:arqbrGPuM.net]
VBAがくっそ使えない言語だから普通はpython大歓迎でしょ…

1027 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 15:20:10.85 ID:cbFXqoc10.net]
VBA嫌いじゃないけど、Phythonの方が明らかにエレガントなコーディングできそうだから歓迎しかないわ
VBAは参照設定したら使える程度のものになるんじゃないか?

1028 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 15:44:26.54 ID:+7hAxrT3a.net]
どんな言語だってできる奴はできる。
VBAが駄目だとか言う奴に限って碌なコード書けない奴ばかりなんだよなあ。

1029 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 16:05:43.43 ID:arqbrGPuM.net]
こんな書いててストレスマッハの言語はないからな
まあ全員パイソンいくでしょw

1030 名前:デフォルトの名無しさん [2018/01/27(土) 16:11:26.72 ID:3QIsbpwxM.net]
VBA→javascript→Pythonの順に覚えたけど何がそんなにストレスなのかよく分からん



1031 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 17:39:06.57 ID:Xe+uGT7T0.net]
それより次スレは?

1032 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 19:59:27.66 ID:QIG/4o8/0.net]
>>998パイソンやとスレで相談したいときに
質問スレではインデント崩れて悲惨なことになってるな

1033 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 20:30:03.5 ]
[ここ壊れてます]

1034 名前:6 ID:Xe+uGT7T0.net mailto: とりあえず次スレ立てておいた
Excel VBA 質問スレ Part52
http://mevius.2ch.net/test/read.cgi/tech/1517052305/

>>1003
Pythonはスコープがインデントで決められているからね
インデントの重みが他の言語のそれとは全く違う

代わりにEnd IfやEnd Subみたいなものがない
[]
[ここ壊れてます]

1035 名前:デフォルトの名無しさん mailto:sage [2018/01/27(土) 22:07:33.55 ID:845Tmzax0.net]
>>1004

1000ゲット

1036 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 80日 10時間 41分 3秒

1037 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<339KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef