1 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 01:07:19 ] 過去スレ 01 pc11.2ch.net/test/read.cgi/tech/1054356121/ 02 pc11.2ch.net/test/read.cgi/tech/1168308855/ 03 pc11.2ch.net/test/read.cgi/tech/1180192018/ 04 pc11.2ch.net/test/read.cgi/tech/1189814602/ 05 pc11.2ch.net/test/read.cgi/tech/1197448064/ 06 pc11.2ch.net/test/read.cgi/tech/1205231499/ 07 pc11.2ch.net/test/read.cgi/tech/1212587819/ 08 pc11.2ch.net/test/read.cgi/tech/1219673793/ 09 pc11.2ch.net/test/read.cgi/tech/1228372971/ 10 pc12.2ch.net/test/read.cgi/tech/1235332603/ 11 pc12.2ch.net/test/read.cgi/tech/1241885130/ 12 pc12.2ch.net/test/read.cgi/tech/1247566074/ 13 pc12.2ch.net/test/read.cgi/tech/1254281104/ 14 pc12.2ch.net/test/read.cgi/tech/1262748898/ ←New! 関連スレ Excel総合相談所 91 pc11.2ch.net/test/read.cgi/bsoft/1270542226/ Word総合相談所 pc11.2ch.net/test/read.cgi/bsoft/1263719084/ 【質問不可】Excel総合相談所スレの雑談・議論スレ2 pc11.2ch.net/test/read.cgi/bsoft/1151651536/
623 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:23:07 ] >>615 暇だったのでやてみた FilePaths をグローバルに宣言して 全体処理のほうにこれを書いて FilePaths = "wwww.test.com/ " 再帰のほうのこれを修正 FilePaths = "wwww.test.com " & FilePaths & "/" & objPATH.Name & "/" ↓ FilePaths = FilePaths & objPATH.Name & "/" で、カラム位置は別として、希望の文字列が得られてると思うが? だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ
624 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:26:37 ] >>622 ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。 よくあんなの公開できるもんだと感心する。
625 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:29:22 ] 参照を受け取るときにC++でいうconstみたいな指定子ってある?
626 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:35:14 ] >>623 >>623 おっと、バグッテた 再帰のプロシージャの中で dim tmp しといて FilePaths = FilePaths & objPATH.Name & "/" ↓ tmp = FilePaths FilePaths = FilePaths & objPATH.Name & "/" 出口で FilePaths=tmp これでいけるわ
627 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:36:08 ] >>624 悪口しかいえないやつより100万倍まし
628 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:45:15 ] >>625 c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん どういう動作なのか説明してくれたら、VBではこうだと言えるカモ
629 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:53:47 ] >>628 例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです ようするに読み取りだけできて書き込みはできない引数のことです
630 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:58:39 ] >>626 あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね 自分でやってね
631 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 17:59:00 ] >>629 VBAにはそういう機能はない
632 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 18:02:08 ] >>631 しょぼん・・・どうもでした
633 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 15:48:05 ] >>626 ありがとうございました! グローバル変数の存在を思いっきり忘れてました・・・。
634 名前:デフォルトの名無しさん [2010/06/18(金) 00:58:58 ] 初心者で申し訳ありません 今A1からD10まで数字が埋まった表があります このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、 としたいのですが、どのように書けばよろしいのでしょうか? 表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・
635 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 01:31:16 ] >>634 「表上の左から2列目、一番上から一番下までの範囲を選択」 だと 途中に空白セルがないなら Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Select とかする 個人的には好きではないけど 途中に空白セルがあった場合なんかは Range(Cells(1, 2), Cells(65536, 2).End(xlUp)).Select の方がいいかも
636 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 01:45:50 ] >>634 B1からデータの入っているセル範囲を自動的に求めてコピー Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy
637 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 02:55:16 ] もっと単純に、 Columns("B:B").Select とか Columns(2).Select とかで良いんじゃ? んで Selection.Copy でコピーして Columns("F:F").Select でF列選択 ActiveSheet.Paste ではりつけ つかまずはマクロの記録
638 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 15:23:29 ] >>636 こんなやり方初めて知った。 でも、空白セルがあるとそこで途切れてしまうから、結局>>635 のほうがいいのかな。 65536って入力するより、rows.countのほうがいいだろうけど。
639 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 16:22:57 ] B列全体をコピーしてもいいのかどうか。空白セルをコピーすると何かまずいことがあるのか。 途中に空白が入ってデータが飛び飛びになることはあるのか。 このあたりが条件として欲しいところだな。 それによって手間や方法が変わってくる。
640 名前:634 [2010/06/18(金) 20:50:20 ] みなさんさまざまなアイディア、ありがとうございました 以下のように組むことで、一応目的達成することができました ActiveCell.CurrentRegion.Select Selection.Offset(0, 0).Columns(2).Copy ActiveCell.Offset(0, 5).Select ActiveSheet.Paste
641 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:11:18 ] >>640 それでいいんなら1行にまとまるよ ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)
642 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:12:41 ] >>634 セレクトしてる意味がない これで充分 Columns(2).Copy Columns(2).Offset(0, 5).PasteSpecial
643 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 23:28:29 ] zip 内のファイル一覧を取得したいのですが、 サンプルが見つからなくて何とか以下のようなものはできました。 どこか問題はないでしょうか?とくに item.GetFolder が正規のメソッドとして 存在するのかが気になっています。 また、Folder3、FolderItem2のリファレンスはありますでしょうか? Option Explicit Dim m_fso Dim m_shell Sub main() Set m_fso = CreateObject("Scripting.FileSystemObject") Set m_shell = CreateObject("Shell.Application") ZipList "c:\test.zip" End Sub Function ZipList(FileName As String) Dim folder Set folder = m_shell.Namespace("c:\test.zip") ZipListSub folder End Function Function ZipListSub(folder As Variant, Optional path As String = "") Dim item For Each item In folder.Items If item.IsFolder Then ZipListSub item.GetFolder, item.path & "/" Else Debug.Print path & item End If Next End Function
644 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 00:37:34 ] >>643 とりあえず、Shell.Application絡みのドキュメントはここ。 msdn.microsoft.com/en-us/library/bb773938 (v=VS.85).aspx FolderItem2はShellFolderItemとしてエイリアスされている。 Folder3のヘルプは見つからないな。 更に詳細が知りたければ、参照設定で「Microsoft Shell Controls And Automation」を足すと、 大本のタイプライブラリの内容が確認できる。Folder3は一応ここに出てくる。 WindowsSDK等に付属している「OLE/COM Object Viewer」で 「Type Libraries」-「Microsoft Shell Controls And Automation (Ver 1.0)」を表示させれば、 FolderItem2のエイリアスとかまで確認できるな。
645 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 13:06:43 ] >>643 それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか? つかエクセル関係ないからスレ違い テンプレなくなってるんだな
646 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:48:15 ] zipがshellで処理されないOSって何?
647 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:57:59 ] 2000とか98,98SEとか
648 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 18:29:27 ] >> 647 Windows 3.1+Excel 5.0の考慮も必要だね!
649 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 20:57:02 ] Windows8とか
650 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 21:38:02 ] >>643 × Set folder = m_shell.Namespace("c:\test.zip") ○ Set folder = m_shell.Namespace(FileName)
651 名前:643 mailto:sage [2010/06/21(月) 23:37:34 ] >644 ありがとうございます。 残念ながら英語版しかないようですね。 >645 zipfldr.dllが解除されている場合とかでしょうか? >650 テストしたのをそのままあげてしまいました。 そこですが、fso.GetAbsolutePathName で取得したものを 渡さないと時々取得できないことがあるようです。 原因はさっぱりわかりません。
652 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 14:36:04 ] >そこですが、fso.GetAbsolutePathName で取得したものを >渡さないと時々取得できないことがあるようです。 >原因はさっぱりわかりません。 なぜだろうね
653 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 14:46:04 ] AbsolutePathNameじゃないからだろ
654 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 17:02:02 ] >>652 どっかいけ、アホ
655 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 22:46:43 ] Stringで渡すとだめで、VariantならOKのようです。
656 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 23:17:45 ] Set folder = m_shell.Namespace((FileName))
657 名前:デフォルトの名無しさん mailto:sage [2010/06/22(火) 23:35:53 ] それは意味ない
658 名前:デフォルトの名無しさん mailto:sage [2010/06/23(水) 19:22:11 ] 意味あったけど
659 名前:デフォルトの名無しさん [2010/06/24(木) 19:49:57 ] 初心者なんですが、皆さんの力を貸してください。 下記で困ってます。orz 【実現したいこと】 ワークシートにグラフを追加し グラフのX軸の目盛位置(wkChart.Axes(xlCategory).Left)ピッタリに四角シェイプを配置したい。 配置先は、グラフ内ではなくワークシート上。 【多分必要だと思うこと】 グラフ内の座標から、ワークシートの座標に変換する必要がある? 【試したこと】 グラフ内の座標==ワークシート上の座標でシェイプを追加したにもかかわらず 見た目上ズレている。 【コード】 'チャート内に四角シェイプを追加して選択 wkChart.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select 'ワークシート上に四角シェイプを追加して選択 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
660 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 18:42:58 ] APIで座標を調べるのがあったな。
661 名前:デフォルトの名無しさん mailto:sage [2010/06/25(金) 22:56:29 ] >>659 グラフ内の座標ってChart自体の (0, 0) から始まるわけじゃなかったような気がするけど、ひょっとしてそのこと? wkChart.Shapes.AddShape(msoShapeRectangle, 30-wkChart.ChartArea.Left, 100-wkChart.ChartAreaTop, 20, 30).Select ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
662 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 23:30:08 ] >>659 A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。 但し、全セルが同じ大きさであることが重要。 詳細は忘れたから調べてwww @A1セルの大きさを変更 or 全セルの大きさを整える AA1セルの縦横サイズを取得 B座標位置(左上位置になる)を指定する
663 名前:662 mailto:sage [2010/06/26(土) 23:33:24 ] すまん。グラフの位置決めのことで、チャート内ではない。 まじすまそ
664 名前:デフォルトの名無しさん [2010/06/27(日) 01:30:22 ] 正規表現で置換するだけの処理なんですが上手くいきません ご教授願います Sub sample01() Dim re As Object, n As Object Dim Match As Object, Matches As Object Dim Val As Variant '配列 Dim i As Integer 'カウンタ Val = Worksheets("Sheet1").Range("A1:A5").Value Set re = CreateObject("VBScript.RegExp") For i = 1 To 5 Step 1 MsgBox "対象セルの文字列は" & "【" & Val(i, 1) & "】" re.Pattern = "\d{1}" '検索する正規表現パターン re.Global = True '検索範囲はグローバル re.IgnoreCase = True '大文字・小文字を区別する Set Matches = re.Execute(Val(i, 1)) '■HITしたらああああに置換↓ここが上手く動いてくれない■ Val(i, 1) = re.Replace(Val(i, 1), "ああああ" & i) 'Set re = Nothing Next i MsgBox i - 1 & "件マッチ!" End Sub
665 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 02:03:45 ] >>664 動いてますよ? もしかして、ワークシートに書き込みたいのなら Range("A1:A5") = Val を最後に足しとけばOKかと
666 名前:664 [2010/06/27(日) 02:07:06 ] >>664 だけでは説明不足だったので付け加えます ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが 実際は複雑な正規表現処理を入れる予定です 上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、 合わせてご教授頂ければと思います
667 名前:デフォルトの名無しさん [2010/06/27(日) 02:24:08 ] >>665 おっしゃる通りでした Range("A1:A5").Value = Val でワークシートに置換した値が入りました ありがとうございました!
668 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 09:36:01 ] 所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?
669 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 10:12:08 ] あ、コメントアウトされてたのね。 老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。 end subのすぐ前でOK。
670 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:23:54 ] >>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。 なんで? 不要だろ
671 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 14:25:52 ] ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな
672 名前:664 [2010/06/27(日) 15:51:40 ] Set re = Nothingを入れる事でメモリ解放するって事ですかね? 個人的にはそんな事より"A1:A5"の範囲ならまだしも セル範囲が増えた場合オーバーフローしないか心配です 何か良い方法ないですかねぇ 配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが
673 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 15:55:12 ] >>669 完全に不要。 あと、解放、な。
674 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 15:56:56 ] >>672 何がどうオーバーフローするんだ?
675 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:06:12 ] Nothing入れないと自動変数の領域がキャッシュされてるため いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある
676 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:12:26 ] .NETからExcelを操作した時のアウトプロセス解放関連の話と 勘違いしている予感。
677 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:23:59 ] COMのGCって参照カウンタでしょ。 それに反しなければわざわざリリースなんて要らん。
678 名前:672 [2010/06/27(日) 16:26:01 ] >>674 ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や 各配列内のデータ(取得したセルの値)、文字数が多い場合等です Variant型を超える事はないと思ってはいますが、 少し今のやり方だと心配なんですよね
679 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 16:41:37 ] >>675 キャッシュ(笑) VB.net(笑) 適当なこと言ってんなハゲ
680 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 17:51:36 ] 「行儀が悪い」 これならどうだ
681 名前:デフォルトの名無しさん [2010/06/27(日) 18:46:33 ] 煽りとかでは無くて純粋に教えてほしいんだけど、 setした物はnothingにして終わらせる、って教わったんだ。 当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、 これは嘘なのかな? マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。 nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。
682 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:41:25 ] >メモリを占有し続けるから これは嘘ではない
683 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:49:31 ] nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない nothingを代入しても、そのメモリがいつ開放されるかは定かではない nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される 原則はこういうこと 昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった 今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ
684 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 19:57:09 ] テンプレに書いてくれ 無駄なもの 最後にnothing 最後にerase とか 他にもあるんだろうけど
685 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 20:09:26 ] >>682-683 ありがとう。 俺、後輩にいつもnothingで終わらせろって言ってた・・・。 先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。 nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。 >nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。 本当にありがとう。
686 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 20:53:29 ] SQLServerのJOBにActiveXスクリプト書くときは Nothingしないと警告でるよ
687 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 21:21:13 ] そういや、fjのmalloc/free論争はどう決着したんだっけなあ
688 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 21:38:02 ] >>685 俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ? VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、 循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは 明示的に解放してやらないとメモリリークする とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある
689 名前:デフォルトの名無しさん mailto:sage [2010/06/27(日) 23:43:38 ] 俺も無駄なNothing代入はいらない派だが >>688 メモリリークといっても、エクセルの使用メモリが増えていくだけで エクセルを終了させれば開放される >Nothingで終わらせておけば問題は発生しないし思考停止できる ちなみに変数をNothingにしてもメモリリークは防げないこともある Sub test() Set x = CreateObject("Scripting.Dictionary") Set y = CreateObject("Scripting.Dictionary") Call x.Add("y", y) Call y.Add("x", x) Set x = Nothing Set y = Nothing End Sub このプロシジャ呼ぶとちょっとずつメモリ使用量が増加していくぞ
690 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 00:31:57 ] だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい いるってやつは自分が作るときに使えばいい わざわざ他人のコーディングを否定すんなよクズども いい加減この無限ループやめろっての ここまでテンプレ
691 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 01:10:01 ] 質問スレだから 質問されたら答えるだけ 間違いを教えていいわけない 結論はどっちでもいいと答えるのかもしれないけど
692 名前:デフォルトの名無しさん [2010/06/28(月) 09:06:38 ] 全角英数字を半角英数字にする関数ってありますか? Case文で全文字毎に置換するしかないですかね?
693 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 09:34:12 ] >>692 つ素寅昆布
694 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 09:34:31 ] はいいえ
695 名前:デフォルトの名無しさん [2010/06/28(月) 11:02:28 ] >>693 まんこの中見る器具!
696 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 11:40:42 ] >>692 記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv 英数以外は変換したくないんなら1文字ずつやるしかない
697 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 15:54:16 ] 相互参照になった場合は?
698 名前:デフォルトの名無しさん mailto:sage [2010/06/28(月) 17:29:18 ] >>696 つ性器豹源