Excel VBA 質問スレ P ..
[2ch|▼Menu]
615:デフォルトの名無しさん
10/06/15 18:09:29
今このVBAをそのまま流用して改造してるんですが、
URLリンク(www.asahi-net.or.jp)

選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したいのですが、うまくいきません。

いじったのは以下のところだけですが、ファイルがある場所のみしか抽出されないのと、フルパスをうまく吐いてくれません。
(ファイルのあったディレクトリィだけ出る)

どこがまずいでしょうか。

' 現在フォルダをシート上に表示
g_cntPATH = g_cntPATH + 1 ' 参照フォルダ数を加算

FilePaths = "URLリンク(wwww.test.com)" & FilePaths & "/" & objPATH.Name & "/"
' ■先ずサブフォルダを探索するループ処理
For Each objPATH2 In objPATH.SubFolders
' フォルダ単位のサブ処理(再帰呼び出し)
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL)
Next objPATH2
' ■本フォルダの各ファイルをシート上に表示するループ処理
COL = COL + 1 ' カラムを加算
For Each objFILE In objPATH.Files
g_cntFILE = g_cntFILE + 1 ' 参照ファイル数
GYO = GYO + 1 ' 行を加算
With objFILE
' ファイル名+(最終更新日時+ファイルサイズ)
Cells(GYO, COL).Font.ColorIndex = 1
Cells(GYO, COL).Value = FilePaths & .Name
If 25000 <= .Size Then
Cells(GYO, COL).Font.ColorIndex = 3
End If

616:デフォルトの名無しさん
10/06/16 10:05:49
壊滅的に説明が下手なので、コード読む気にすらならない

617:デフォルトの名無しさん
10/06/16 11:18:58
説明は普通に読めるぞ
ほるだのなかに
インデックス.html
ページ1.HTML
とかを見つけたら、
URLリンク(www.)ほにゃらら/インデックス.HTML
って合成したいんだろう

コードは見てない

618:デフォルトの名無しさん
10/06/16 12:22:10
>>615
本当にそこしかいじってないんなら、変数FilePathsが宣言も初期化もされていないから
フルパスが出るわけない

619:デフォルトの名無しさん
10/06/16 14:50:43
> 選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したい
「抽出」の意味が不明。(コード見ればわかるかもしれんが)

> ファイルがある場所のみしか抽出されない
「ファイルがある場所」以外は、一体どこの何を抽出したいのか?
「選んだ階層以下すべてのファイル」が対象ではないのか。

620:デフォルトの名無しさん
10/06/16 14:57:39
>>618
宣言はしてあります。
ただ、全部コピペすると書き込めなかったので・・・。

>>619
そうです。その通りです。
選んだフォルダの階層以下すべてのファイルのフルパスを、
エクセル上に書き出したいんです。
今のままだと、ファイルのあるフォルダしか書き出されない上に、
そのファイルのあるフォルダよりもっと上の階層がなぜか消えてしまってるんです。

621:デフォルトの名無しさん
10/06/16 16:04:38
>>620
byval と byref を間違えてるに一票


622:デフォルトの名無しさん
10/06/16 16:06:27
>>615
リンク踏んだけど、そもそもそのページが読む気失せる作りだわ

623:デフォルトの名無しさん
10/06/16 17:23:07
>>615
暇だったのでやてみた

FilePaths をグローバルに宣言して

全体処理のほうにこれを書いて
FilePaths = "URLリンク(wwww.test.com)"

再帰のほうのこれを修正
FilePaths = "URLリンク(wwww.test.com)" & FilePaths & "/" & objPATH.Name & "/"

FilePaths = FilePaths & objPATH.Name & "/"

で、カラム位置は別として、希望の文字列が得られてると思うが?
だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ

624:デフォルトの名無しさん
10/06/16 17:26:37
>>622
ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。
よくあんなの公開できるもんだと感心する。

625:デフォルトの名無しさん
10/06/16 17:29:22
参照を受け取るときにC++でいうconstみたいな指定子ってある?

626:デフォルトの名無しさん
10/06/16 17:35:14
>>623
>>623
おっと、バグッテた

再帰のプロシージャの中で
dim tmp しといて

FilePaths = FilePaths & objPATH.Name & "/"
 ↓
tmp = FilePaths
FilePaths = FilePaths & objPATH.Name & "/"

出口で
FilePaths=tmp

これでいけるわ

627:デフォルトの名無しさん
10/06/16 17:36:08
>>624
悪口しかいえないやつより100万倍まし

628:デフォルトの名無しさん
10/06/16 17:45:15
>>625
c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん
どういう動作なのか説明してくれたら、VBではこうだと言えるカモ


629:デフォルトの名無しさん
10/06/16 17:53:47
>>628
例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す
けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです
ようするに読み取りだけできて書き込みはできない引数のことです

630:デフォルトの名無しさん
10/06/16 17:58:39
>>626
あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので
ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね
自分でやってね



631:デフォルトの名無しさん
10/06/16 17:59:00
>>629
VBAにはそういう機能はない

632:デフォルトの名無しさん
10/06/16 18:02:08
>>631
しょぼん・・・どうもでした

633:デフォルトの名無しさん
10/06/17 15:48:05
>>626
ありがとうございました!
グローバル変数の存在を思いっきり忘れてました・・・。

634:デフォルトの名無しさん
10/06/18 00:58:58
初心者で申し訳ありません

今A1からD10まで数字が埋まった表があります
このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします
このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、
としたいのですが、どのように書けばよろしいのでしょうか?
表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・


635:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/18 01:45:50
>>634
B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy

637:デフォルトの名無しさん
10/06/18 02:55:16
もっと単純に、
Columns("B:B").Select とか
Columns(2).Select とかで良いんじゃ?

んで
Selection.Copy でコピーして
Columns("F:F").Select でF列選択
ActiveSheet.Paste ではりつけ

つかまずはマクロの記録

638:デフォルトの名無しさん
10/06/18 15:23:29
>>636
こんなやり方初めて知った。
でも、空白セルがあるとそこで途切れてしまうから、結局>>635のほうがいいのかな。
65536って入力するより、rows.countのほうがいいだろうけど。


639:デフォルトの名無しさん
10/06/18 16:22:57
B列全体をコピーしてもいいのかどうか。空白セルをコピーすると何かまずいことがあるのか。
途中に空白が入ってデータが飛び飛びになることはあるのか。

このあたりが条件として欲しいところだな。
それによって手間や方法が変わってくる。

640:634
10/06/18 20:50:20
みなさんさまざまなアイディア、ありがとうございました

以下のように組むことで、一応目的達成することができました
ActiveCell.CurrentRegion.Select
Selection.Offset(0, 0).Columns(2).Copy
ActiveCell.Offset(0, 5).Select
ActiveSheet.Paste

641:デフォルトの名無しさん
10/06/18 21:11:18
>>640
それでいいんなら1行にまとまるよ

ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)

642:デフォルトの名無しさん
10/06/18 21:12:41
>>634
セレクトしてる意味がない

これで充分
Columns(2).Copy
Columns(2).Offset(0, 5).PasteSpecial


643:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/20 00:37:34
>>643
とりあえず、Shell.Application絡みのドキュメントはここ。
URLリンク(msdn.microsoft.com)(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:デフォルトの名無しさん
10/06/20 13:06:43
>>643
それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?

つかエクセル関係ないからスレ違い
テンプレなくなってるんだな

646:デフォルトの名無しさん
10/06/21 16:48:15
zipがshellで処理されないOSって何?

647:デフォルトの名無しさん
10/06/21 16:57:59
2000とか98,98SEとか

648:デフォルトの名無しさん
10/06/21 18:29:27
>> 647
Windows 3.1+Excel 5.0の考慮も必要だね!

649:デフォルトの名無しさん
10/06/21 20:57:02
Windows8とか

650:デフォルトの名無しさん
10/06/21 21:38:02
>>643
× Set folder = m_shell.Namespace("c:\test.zip")
○ Set folder = m_shell.Namespace(FileName)

651:643
10/06/21 23:37:34
>644

ありがとうございます。
残念ながら英語版しかないようですね。

>645
zipfldr.dllが解除されている場合とかでしょうか?

>650
テストしたのをそのままあげてしまいました。
そこですが、fso.GetAbsolutePathName で取得したものを
渡さないと時々取得できないことがあるようです。
原因はさっぱりわかりません。



652:デフォルトの名無しさん
10/06/22 14:36:04
>そこですが、fso.GetAbsolutePathName で取得したものを
>渡さないと時々取得できないことがあるようです。
>原因はさっぱりわかりません。
なぜだろうね

653:デフォルトの名無しさん
10/06/22 14:46:04
AbsolutePathNameじゃないからだろ

654:デフォルトの名無しさん
10/06/22 17:02:02
>>652
どっかいけ、アホ

655:デフォルトの名無しさん
10/06/22 22:46:43
Stringで渡すとだめで、VariantならOKのようです。


656:デフォルトの名無しさん
10/06/22 23:17:45
Set folder = m_shell.Namespace((FileName))

657:デフォルトの名無しさん
10/06/22 23:35:53
それは意味ない

658:デフォルトの名無しさん
10/06/23 19:22:11
意味あったけど

659:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/25 18:42:58
APIで座標を調べるのがあったな。

661:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/26 23:30:08
>>659
A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww

@A1セルの大きさを変更 or 全セルの大きさを整える
AA1セルの縦横サイズを取得
B座標位置(左上位置になる)を指定する

663:662
10/06/26 23:33:24
すまん。グラフの位置決めのことで、チャート内ではない。
まじすまそ

664:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/27 02:03:45
>>664
動いてますよ?

もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと

666:664
10/06/27 02:07:06
>>664だけでは説明不足だったので付け加えます
ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です

上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います

667:デフォルトの名無しさん
10/06/27 02:24:08
>>665
おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました

ありがとうございました!

668:デフォルトの名無しさん
10/06/27 09:36:01
所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?

669:デフォルトの名無しさん
10/06/27 10:12:08
あ、コメントアウトされてたのね。

老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
end subのすぐ前でOK。

670:デフォルトの名無しさん
10/06/27 14:23:54
>>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
なんで? 不要だろ

671:デフォルトの名無しさん
10/06/27 14:25:52
ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな



672:664
10/06/27 15:51:40
Set re = Nothingを入れる事でメモリ解放するって事ですかね?

個人的にはそんな事より"A1:A5"の範囲ならまだしも
セル範囲が増えた場合オーバーフローしないか心配です
何か良い方法ないですかねぇ
配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが

673:デフォルトの名無しさん
10/06/27 15:55:12
>>669
完全に不要。
あと、解放、な。

674:デフォルトの名無しさん
10/06/27 15:56:56
>>672
何がどうオーバーフローするんだ?

675:デフォルトの名無しさん
10/06/27 16:06:12
Nothing入れないと自動変数の領域がキャッシュされてるため
いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある

676:デフォルトの名無しさん
10/06/27 16:12:26
.NETからExcelを操作した時のアウトプロセス解放関連の話と
勘違いしている予感。

677:デフォルトの名無しさん
10/06/27 16:23:59
COMのGCって参照カウンタでしょ。
それに反しなければわざわざリリースなんて要らん。

678:672
10/06/27 16:26:01
>>674
ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です

Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね

679:デフォルトの名無しさん
10/06/27 16:41:37
>>675
キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ

680:デフォルトの名無しさん
10/06/27 17:51:36
「行儀が悪い」

これならどうだ

681:デフォルトの名無しさん
10/06/27 18:46:33
煽りとかでは無くて純粋に教えてほしいんだけど、
setした物はnothingにして終わらせる、って教わったんだ。

当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、
これは嘘なのかな?

マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。
nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。

682:デフォルトの名無しさん
10/06/27 19:41:25
>メモリを占有し続けるから

これは嘘ではない

683:デフォルトの名無しさん
10/06/27 19:49:31
nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない
nothingを代入しても、そのメモリがいつ開放されるかは定かではない
nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される

原則はこういうこと
昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった
今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ

684:デフォルトの名無しさん
10/06/27 19:57:09
テンプレに書いてくれ
無駄なもの
最後にnothing
最後にerase
とか
他にもあるんだろうけど


685:デフォルトの名無しさん
10/06/27 20:09:26
>>682-683
ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。

>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。

本当にありがとう。


686:デフォルトの名無しさん
10/06/27 20:53:29
SQLServerのJOBにActiveXスクリプト書くときは
Nothingしないと警告でるよ

687:デフォルトの名無しさん
10/06/27 21:21:13
そういや、fjのmalloc/free論争はどう決着したんだっけなあ

688:デフォルトの名無しさん
10/06/27 21:38:02
>>685
俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある

689:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/06/28 00:31:57
だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい
いるってやつは自分が作るときに使えばいい
わざわざ他人のコーディングを否定すんなよクズども
いい加減この無限ループやめろっての



ここまでテンプレ

691:デフォルトの名無しさん
10/06/28 01:10:01
質問スレだから
質問されたら答えるだけ
間違いを教えていいわけない
結論はどっちでもいいと答えるのかもしれないけど

692:デフォルトの名無しさん
10/06/28 09:06:38
全角英数字を半角英数字にする関数ってありますか?
Case文で全文字毎に置換するしかないですかね?

693:デフォルトの名無しさん
10/06/28 09:34:12
>>692
つ素寅昆布

694:デフォルトの名無しさん
10/06/28 09:34:31
はいいえ

695:デフォルトの名無しさん
10/06/28 11:02:28
>>693
まんこの中見る器具!

696:デフォルトの名無しさん
10/06/28 11:40:42
>>692
記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない

697:デフォルトの名無しさん
10/06/28 15:54:16
相互参照になった場合は?

698:デフォルトの名無しさん
10/06/28 17:29:18
>>696
つ性器豹源



最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4946日前に更新/189 KB
担当:undef