Excel VBA 質問スレ Part66
■ このスレッドは過去ログ倉庫に格納されています
ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part65 https://mevius.5ch.net/test/read.cgi/tech/1584430040/ ※デフォルト設定 >>521 入れ子時の対策として言っただけで、普通は入れ子になりづらいとか急に言われても困る あと意識せずに自然に再帰になるとかマ? 関数型以外じゃ意識しないと普通できないだろw やるとしても配列の畳み込みメソッドぐらいなんでは? >>543 例えば初めて再起を使った時に再起なるものなんか知らなかった。 単純に自分を呼び出せば良くね?と思って書いたら再起だった。 再起なるものを知った後でも、基本的に自分を呼び出せば良いじゃんと思う場面が殆ど。 例えば、パスを与えたらそのフォルダの下のファイルやフォルダ名を全部列挙するという関数を考える。 列挙してる中でフォルダ名取得したら、そのフォルダ名で自分を呼び出せば良いわけだ。 そうすればその呼び出しで更に配下の列挙が得られるんだから。 もっとも、このファイル列挙では最初はDir関数グローバルな動きをすると知らなかったので上手く行かなかったけど。 >>542 職場の業務というか海外含めて複数の支部で使われてるから出てくるデータを瞬時に処理できるコードをここで3つ教わってしまったからね もうVBA続けるしかないわ textデータにプローシージャコピーしてクラウドに保存してあるレベルの 色々調べたのですが・・・。 コピーし貼り付けのマクロで 条件付き書式だけを除いて張り付ける、というマクロを探しています。 今の状態ですと条件付き書式の情報まで上書きされて困っています。 ご教授宜しくお願い致します。 >>548 まず他スレの質問締め切るなり断り入れるなりして来いよ 貼り付けた後に .FormatConditions.Delete で条件付き書式だけ削除じゃダメなの? >>551 有難うございます! しかしそれでは出来ないのです。すいません。 pasteSpecial繰り返して必要なものだけ貼り付けるしかないんじゃない? >>436 ロマサガ3とはなかなか分かってる先輩だなw VBAの配列にもCount使わせて欲しい・・・・ 面倒でたまらないわぁ ちなみにSplitで空配列になったときってUBoundは必ず-1返すのかな まぁSplitする前の文字列が空かどうかで判別すればいいんだけど SetTimerのコールバック関数内でSetTimerしなおすやつは、再起といっていいかも あれ、再帰じゃないし >>557 そういうのはラッパークラス定義しちゃえばいい 要素を持たない配列はuboundで-1になるけど、 配列を返す関数をそのままuboundの引数にするとメモリが解放されないらしい 一度変数に代入してから、その変数を引数にするしかない >>554 有難うございます!そういうやり方もありますね。勉強になりました。 あれからIF関数と条件付き書式を組み合わせて問題克服できました。 相談に乗っていただけた方みなさん有難うございます。 お騒がせしますた。 ボタンを押してランダムに1ー100の数字をコンピュータに選ばせて、その結果をセルに表示させたいと思いマクロを組みました。 それはできたのですが、ボタンを押すごとに出る数字の履歴を残したいときはどうしたらいいでしょうか?例えば初めはA1、次はA2、次はA3…のようにしたいです。 1回目、2回目とボタンを押すごとにA列を下方向に順に記録させたいのです。 説明が悪いかも、すみません >>564 馬鹿過ぎて話しにならない こんなのがわからないような馬鹿には色々無理 >>564 A列の最終行を探して次の行に数を入れる まずは「1ー100」をマトモに書けるようになるのが先決だな >>544 再帰はスマートに書けることも多いけど再帰の数だけメモリを消費する ファイル列挙みたいな大量になりかねないデータを扱う場合はおすすめできない 時間的にもメリットがないどころか下手すると遅くなり得る 列挙程度のどうでもいいような処理に使うべきじゃないよ >>570 は!なるほど!! ありがとうございます!! 皆様もありがとうございます!精進します! >>573 〉ファイル列挙みたいな大量になりかねないデータを扱う場合はおすすめできない じゃあこの場合どう処理するの? コマンドプロンプトで十分だと思うけど。 VBAでやると、ファイル名に特殊文字が使われていた時に止まって地味にウザい。 >>573 何でこんな頓珍漢な指摘が出てくるんだろうね。 そんな話じゃないだろうに。 自然に再帰になるという例であって、問題あるなら辞めれば良いだけのこと。 それに、そのメモリ消費だが下手くそな組み方だったらその通りだが、そんな組み方しないでしょ。 >>576 何の為にファイル列挙してると思ってんの? それで終わりの筈が無いだろうw >>577 だからなに? コマンドプロンプトで出力したものは再利用できないとでも? >>576 > VBAでやると、ファイル名に特殊文字が使われていた時に止まって地味にウザい。 それお前のコードがバグってるだけだろw >>578 出来るに決まってんだろw でも、それを良しとするか? マトモに書ける奴は良しとはしないだろ。 仕方なしにはするけど。 >>580 いや、これはあり得る。 多分回避も出来るけど、そこ迄考えるのは面倒いので。 問題が起こったら何とかするか、その名前は無理と言うかも。 何しろVBA以外でもトラブルの元なので。 >>582 具体的なこと書かないであり得るとか言われてもなぁw >>581 知らねえよ。 お勧めできないならこれで良いだろって代替案出しただけで。 >>583 「特殊文字」は具体的じゃないのかよ。 何の文字かまでいちいち書いてあげないと納得しないか? ファイル名に使えるのにVBAで扱えない文字なんて心当たりがないので、ぜひ具体的な文字を教えてくれ >>584 > 「特殊文字」は具体的じゃないのかよ。 どこが具体的なんだよw > 何の文字かまでいちいち書いてあげないと納得しないか? 文字と何をして止まるのかを書かないとね まあ書けないと思うけど >>586 記録したソースを弄った方が早い どうしても本が欲しいというなら、出来るだけ完成したソースがたくさん載ってる本がいい VBAでは無いけれど 今回のオンライン申請では氏名の間に空白スペースがあったり 住所のハイフンなんかでエラーだったよ 山 田 花 子 山田 花子 山田 は な 子 11-20-13 十一一二十ー十三 一丁目 II ノ丘 ハイツ III 一- 弐- 三 だから何? それそういう仕様なんだろ(まあバグかもしれんが) >>587 ああ、確かに特殊文字じゃ書けないわな。 |あいうえお 一番左にカーソルがある状態。 あ|いうえお 1回右を押す あい|うえお 2回右を押す あい|うえお 3回右を押す ←2回目と3回目が変わらない。こういう状態になる文字だよ。 あいう|えお 4回右を押す あいうえ|お 5回右を押す これで満足か? >>585 特殊以外だと、日本語環境で中国語とか。 >>589 それ例ではスペースとかハイフン無いのに入力してエラーのパターンでは >>591 もしかしてカーソルが「止まる」とか言ってたのか? 想像以上に低レベルだったなw そういえばADOを使ったcsv取り込み機能でうちの業務システムから出力したcsvファイルを取り込んだらエラーが出たことあったな。 ファイル名変えたら取り込めたけど。 >>594 >>592 オイオイ、♬みたいな奴だろ。 文字列変数で受けると?になっちまうんだ。 ファイル名に?が入ったまま何かの処理をすればエラ―吐いて止まるというのは考えられる。 というか、何で俺が解説しなきゃならねえんだよ。 頼むぜw >>589 そいつはレベルが低いな。 スペースなんて正式な住所や氏名にはあり得ねえとして、入力したもんから片っ端から抜いちまう処理を入れるもんだ。 ハイフンはちょっとあり得る。 普通はマイナス使うと思うんだが罫線記号使ったり似たのがいっぱいあるからな。 これだな >Excel VBA 質問スレ Part43 >274 名前:デフォルトの名無しさん[] 投稿日:2016/12/02(金) 22:33:29.62 ID:rRSQCExt [1/2] >ちょっと質問 > >・おもむろにファイルエクスプローラを開く >・なんでもいいからファイルのプロパティを開く >・そこの作成日時をドラッグする >・セルのA1にペーストする > >例えば 2013?年?12?月?1?日、??17:02:28 >これを(すでに文字化けしてると思うが) >2013/12/1 17:02:28 >に整形したいんだけど >どうすればいいんだ? >半角に見えるけどサクラでみるとU+200Fとなっている >中には数値の間にも混入しているのもある >最初からFSOで取得するのは無しで >すでに手動で取り込んだ数百件ものデータなんだ >よろしくお願いします >>598 そりゃ、住基ネットのデータベースが インターネットからは参照不能で 全国の一般の素人が入力する事を想定した設計に無理があったんでしょ。 前スレでここで教えて貰ったのが完成した 課のみんなのPCに入れて使いたいらしい パス指定するタイプだから ・読取専用にする ・プロジェクトプロパティをロック ・C直下に置いてショートカットをデスクトップに置いてやる ・シート名は変えるなと徹底 こんだけ教えとけばまぁ大丈夫だよね? セルの行と列の変数名って業務でよく使うんだけど Dim r As Long '行 Dim c As Long '列 これで癖付けてっていいですか?いいですよね? >>602 何が完成したのやら レス番を貼るか概要を書いて貰わないとわからん >>603 そのコード読むのが自分だけか複数人かでメンテしだいじゃ無いの >>596 確認した 変数で受ける以前の問題だな DirとかいまだにUnicode対応されてないのか だったら8.3形式で返せばいいのにな >>606 ググるとFileSystemObject使えって書いてあるな >>607 でも、変数で受けちまうと何使っても?になっちまうよ。 それにFileSystemObjectのファイル列挙は糞遅かった筈。 特別な理由が無いならエラーで抜けちまって、特殊なファイル名には非対応とメッセージ出した方が良い気がする。 >>601 少し住所を扱う処理を動かせば直ぐに気付くレベルの話だよ。 特にスペースなんて人名や住所以外でもよくある話。 全角だろうが半角だろうが""に変換しちまうのはよくやるだろう。 まあ、全角半角は数字とかアルファベットでも問題になるからその前にStrConv使って統一するとかが普通の処理だろう。 ハイフンだって思いつくものはマイナスに変換する程度のことはする。 むしろテキストボックスのEN_UPDATEでスペースやハイフンを消せば楽 郵便番号欄は数字以外受け付けないようにスタイル指定するだけでもいい フォルダを指定し、そのフォルダ内の全てのブックの、各ブックのシート"sire"の2行目から最終行をコピーして シートcompの最下行の一つ下に張り付けていき、I列に各ブック名を記入していくマクロを教えてください。 Sub comp() 'フォルダを選択 Dim path As String Dim r As Long Dim buf As String Dim i As Long Dim filename As String Dim mysheet As Worksheet Dim srcbook As Workbook Dim srcsheet As Worksheet With Application.FileDialog(msoFileDialogFolderPicker) If .Show = 0 Then MsgBox "キャンセルされました。" Exit Sub End If path = .SelectedItems(1) End With Application.ScreenUpdating = False 続き Range("A1").Value = "担当者" Range("B1").Value = "行程1" Range("C1").Value = "件名1" Range("D1").Value = "行程2" Range("E1").Value = "件名2" Range("F1").Value = "行程3" Range("G1").Value = "件名3" Range("H1").Value = "期間" Range("I1").Value = "グループ名" Set mysheet = ThisWorkbook.Worksheets("comp") Debug.Print myseet buf = Dir(path & "\*.xls") 'フォルダ内の全ファイル名 Debug.Print buf Do While buf <> "" Set srcbook = Workbooks.Open(path & "\" & buf) Set srcsheet = srcbook.Worksheets("sire") 続き filename = 'srcsheetの拡張子なしのファイル名を取得 'シートの内容を2行目以降コピー srcsheet.Range(Cells(2, 8), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 8)).Copy 'myseetの最下行の一つ下に値として貼り付け mysheet.Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).PasteSpecial xlPasteValues 'I列にそれぞれのファイル名を入力 For r = Cells(Rows.Count, 9).End(xlUp).Row + 1 To Cells(Rows.Count, 1).End(xlUp).Row Range("I" & r).Value = filename Next r srcbook.Close False buf = Dir() Loop Cells.EntireColumn.AutoFit Application.ScreenUpdating = True End Sub ワークシートの指定について Activesheetだと動いて、worksheets(index)やworksheets("シート名")にするとプログラムが動かないことが多いのですが、何故でしょうか 下のようなプログラムを作りました。(Sheet2のA列の数字でSheet1にフィルターをかけて、pdf出力を繰り返す) Sub Macro3() For Each c In Worksheets("Sheet2").Range("A1:A68") i = c.Value a=1 Worksheets(1).Range("$B$4:$N$6492").AutoFilter Field:=1, Criteria1:=i Worksheets(1).PageSetup.RightHeader = " " & i r = Range("$B$5:$B$6492").Find(i).Row Worksheets(1).ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Users\Documents" & i & "." & Cells(r, 11).Value Next c End Sub これを実行しても、フィルターがかからず、pdf出力メソッドの部分でエラーが起きます。 しかし、Worksheets(1) を Activesheetに直して、Sheet1をアクティブにした状態で動かすと正常に動きます。 イミディエイトウィンドウでWorksheets(1)が正しく指定されているかも確認しましたが、されていました。 一体何が原因なのでしょうか。 >>614 入力ミスがないとして、この2箇所でシートの指定が抜けてるのが原因では Range("$B$5:$B$6492").Find(i).Row Cells(r, 11).Value 何度もWorksheets(1)を書くんじゃなくて、Forの外でActivateするかWithでSheet1を指定した方が間違いがなくていいと思う アドインに記述されてるプロシージャを、シート上の図形をボタンにしてそこから走らせたいのですが、 引数を渡そうとすると、このブックでマクロが使用できないかすべてのマクロが無効なっている可能性があります、と出て実行できません すべてのマクロを有効にしてもダメでした 引数なしの場合は、マクロが無効であっても、なんの問題もなく実行されます 登録は、'プロシージャ名 "引数"'とやっているのですが、マクロからそのままやると実行されますが、ボタンに登録すると実行されません なにが問題なんでしょうか? sub 引数なし() 引数あり "引数" end sub なるほど・・・ 結構な数のボタンになるので面倒ですが、ひとまずそれでやってみます プルダウンなりなんなりで選ぶなりなんなりさせればいいじゃないなり イベント付きボタンのクラス作ればいいんじゃないのかな srcsheet.Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 8)).Copy のところが違うみたいです。どう書けばいいですか? シート名が抜けるの俺もむかーしよくやったわぁ アクティブにすると直るんだよなぁw 何度やったか記憶にないぐらいやって痛い思いした withで囲んでもドットを忘れてそれに気づかずいつまでもソースとにらめっこしたりな >>622 srcsheet.Range(srcsheet.Cells(2, 1), srcsheet.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 8)).Copy 確証ないけど… Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Sh.Range("A:Z").Interior.Color = xlNone If Intersect(Sh.Range("A:Z"), Target) Is Nothing Then Exit Sub Else '赤く色が変わる列 Intersect(Selection.EntireRow, Sh.Range("G:Z")).Interior.Color = RGB(0, 255, 0) End If End Sub とにかく複数選択したセル行の特定の列を全部色付け 選択をやめると色が戻る(デフォルト)をやりたくて ThisWorkBookにこれを追記 で、なんとか希望の動きになったんですが これに1行目から7行目は除外(選択しても色が付かない) という条件の追加は可能ですか? 自分の知識じゃ無理ゲーですみません >>626 一番最初に、ifステートメント入れれば良い。 if target.row >=8 thenとか。 >>627 おおお、ありがとう理想の挙動に近づきました! これだと12行目を選択した後にやめて 1行目を選択しても12行目の色が残っちゃうんだけどそれは回避不能ですか? If Intersect(Sh.Range("A:Z"), Target) Isのところを If Intersect(Sh.Range("A8:Z5000"), Target) Is とかに変えても少し挙動が近づいた気もしますが、 構造体のメンバ変数を頭からindexで指定するようなことってできませんか? for文で構造体のメンバ変数と配列とを順次比較したいんですが。 変数名やプロシージャ名を日本語で書くか否か迷ってます 日本語命名で困ったことが起こった人はいますか ちょっとトンチンカンかもしれないですが WindowsのエクセルのVBAって LinuxのOpen OfficeのCalcでも使えたりするんでしょうか? >>631 あるぞ 英語環境しかないPCだと使えなくなる 人に送ったら面倒になった >>631 うちが英語とスペイン語環境しかなくて送られてきたVBAが動かなくて困った事が何度もある 日本人だからって日本語環境でやってるわけではない >>634 ExcelVBAはWinとMacでも違いがある Win/Mac/Linuxで使えるOOoやLOのCalcで使えるVBAは制限やできない事があるけど一応使える >>631 日本人にとってもコードが読みにくくてかなわん。 >>631 会社で使うなら社内の自分より詳しい人に相談してみ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる