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)
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です。 マクロの記録そのものができないのです。 記録しようとすると「マクロの記録ができませんでした」と エラーが出てしまいます。 新規作成と編集が全て制限されているようです。 セキュリティは「すべて有効」で設定しており、 そこでの問題は無いと思うのですが・・・・