[[20190616090611]] 『ファイルの指定方法を変更したい。』(躯) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ファイルの指定方法を変更したい。』(躯)

閲覧ありがとうございます、いつもお世話になっております。

下記の変更についてご教授いただければ幸いです。
宜しくお願い致します。

・最新のテキストファイルを参照するマクロを追加したい。

・test_A_("A630").xlsとtest_B_("A630").xlsを
1つのマクロ文で作成したい。
(AとBでの違いは、セルの参照先のみ)

・作成されたtest_A_("A630").xlsを
開くとauto_openで引き継いでいるマクロが流れるのでそれを停止させたい。


 ( マクロの動き イメージ )
1.C:\ファイル先\Macro.txtを開き、その中の値を参照
2.C:\ファイル先\直下内から1.の値のフォルダを検索
3.該当値フォルダ内のtest.csvから値を参照し、下記2つのファイルを生成させる

test_A_("A630").xls
test_B_("A630").xls

4.マクロが終了次第、CSVファイル、EXCELアプリは自動で終了する


以下、現在のマクロ文

Sub auto_open()

 Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

        Workbooks.Open Filename:= _
            "\ファイル先\test.csv"

            Range("H467").Select

                Selection.Copy

        Windows("test_A_.xls").Activate
            Range("H19").Select

            ActiveSheet.Paste

        Windows("test.csv").Activate
            Range("M573").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M574").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M575").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M576").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("N573").Select
            ActiveCell.FormulaR1C1 = "=MAX(RC[-1]:R[3]C[-1])"
            Range("O573").Select
            ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],RC[-2]:R[3]C[-2],0)"
            Range("P573").Select
            ActiveCell.FormulaR1C1 = "=INDEX(RC[-8]:R[3]C[-8],RC[-1])"
            Range("P573").Select

                Application.CutCopyMode = False
                Selection.Copy

        Windows("test_A_.xls").Activate
            Range("H20").Select

                ActiveSheet.Paste

        Windows("test.csv").Activate
            Range("M474").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M475").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M476").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M477").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("N474").Select
            ActiveCell.FormulaR1C1 = "=MAX(RC[-1]:R[3]C[-1])"
            Range("O474").Select
            ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],RC[-2]:R[3]C[-2],0)"
            Range("P474").Select
            ActiveCell.FormulaR1C1 = "=INDEX(RC[-8]:R[3]C[-8],RC[-1])"
            Range("P474").Select

                Application.CutCopyMode = False
                Selection.Copy

        Windows("test_A_.xls").Activate
            Range("H21").Select

                ActiveSheet.Paste

        Windows("test.csv").Activate
            Range("H515").Select

                Application.CutCopyMode = False
                Selection.Copy

        Windows("test_A_.xls").Activate
            Range("M578").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M579").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M580").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M581").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("N578").Select
            ActiveCell.FormulaR1C1 = "=MAX(RC[-1]:R[3]C[-1])"
            Range("O578").Select
            ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],RC[-2]:R[3]C[-2],0)"
            Range("P578").Select
            ActiveCell.FormulaR1C1 = "=INDEX(RC[-8]:R[3]C[-8],RC[-1])"
            Range("P578").Select

                Application.CutCopyMode = False
                Selection.Copy

        Windows("test_A_.xls").Activate
            Range("H22").Select

                ActiveSheet.Paste

        Windows("test.csv").Activate
            Range("M522").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M523").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M524").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M525").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("N522").Select
            ActiveCell.FormulaR1C1 = "=MAX(RC[-1]:R[3]C[-1])"
            Range("O522").Select
            ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],RC[-2]:R[3]C[-2],0)"
            Range("P522").Select
            ActiveCell.FormulaR1C1 = "=INDEX(RC[-8]:R[3]C[-8],RC[-1])"
            Range("P522").Select

                Application.CutCopyMode = False
                Selection.Copy

        Windows("test_A_.xls").Activate
            Range("H23").Select

                ActiveSheet.Paste

                Application.CutCopyMode = False
                Application.DisplayAlerts = False

        ActiveWorkbook.SaveAs "\ファイル先\" _
            & CreateObject("Scripting.FileSystemObject").Getbasename(ThisWorkbook.Name) _
            & Workbooks("test_A_").Worksheets("test").Range("A630").Value

                Application.Quit

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


これは何かの議論の続きなんですか?
最初から意味がとれません。
 
>・test_A_("A630").xlsとtest_B_("A630").xlsを
>1つのマクロ文で作成したい。
test_A_("A630").xls ってどういう意味なんですか?

それと、
Range("M573").Select
ActiveCell.FormulaR1C1 = "=RC[-4]^2"
といった書き方のオンパレードですけど(これは死語かもしれないな)、
Range("M573").FormulaR1C1 = "=RC[-4]^2"
と書くとよいですよ。もっと見やすく、速度も上がります。
他人に見せるなら、マクロ記録そのままでなく、手を入れるべきじゃないですか?

(γ) 2019/06/16(日) 12:33


こちらです。中途半端でおわった感じですが。
[[20190606062329]] 『csvファイルの指定したセル値をxlsファイルの指定』(躯)

たぶん、わたしのペースが遅くて、じれったいと感じているでしょうから、
他の回答者にお願いしようと思います。

(マナ) 2019/06/16(日) 14:28


どうも恐縮です。

質問者さんへ。
詳しく読んでいませんが、
きちんと一行につめて書くと助言されていて、
>上手くいきました、
とあるのに、また、マクロ記録そのままの二行に戻ってますねえ。
いっぺん綺麗に書き直して投稿してもらえませんか。全体が分かりにくい。
途中規則がくずれているところもあるし。

そうしたうえで本当のスタートになるのでしょう。
(γ) 2019/06/16(日) 15:00


横からですけど、もし整理するならいちいちブックやシートを切り替えるのもやめたほうが良いかと思います。

例えば、

        Windows("test.csv").Activate
            Range("M573").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M574").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M575").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("M576").Select
            ActiveCell.FormulaR1C1 = "=RC[-4]^2"
            Range("N573").Select
            ActiveCell.FormulaR1C1 = "=MAX(RC[-1]:R[3]C[-1])"
            Range("O573").Select
            ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],RC[-2]:R[3]C[-2],0)"
            Range("P573").Select
            ActiveCell.FormulaR1C1 = "=INDEX(RC[-8]:R[3]C[-8],RC[-1])"
            Range("P573").Select

↑の部分

    With Workbooks("test.csv").Worksheets(1)
        .Range("M573:M576").Formula = "=I573^2"
        .Range("N573").Formula = "=MAX(M573:M576)"
        .Range("O573").Formula = "=MATCH(N573,M573:M576,0)"
        .Range("P573").Formula = "=INDEX(H573:H576,O573)"
    End With

このように記述すれば、どのブックやシートがアクティブでもちゃんと目標のブック(シート)に数式を設定できます。(R1C1形式をA1参照形式に直したのは私の趣味なので気にしないでください)

(もこな2) 2019/06/17(月) 07:58


拝見するところ、
・test_A_.xlsにプログラムコードが書かれていて(自動起動処理)、
 同時にそこにデータも持っている。
・CSVファイルを読み込んで、処理をする。
・test_A_.xlsを別名で保存。
ということですか?
 
・別のパターンの処理(test_B_.xls)を追加したい。
・別名で保存するので、起動処理もついたままなので、困っている。
・読み込むCSVファイルの場所を、別のテキストファイルに持たせたい。
ということのようだが、
「コードとデータの分離」を考えるべきでは?
コードを持つだけのブックにすることをお薦めする。
2つの処理を統合したコードにすることも可能だろう。
併せて、
対象のCSVのファイル情報をシート上に持たせたほうが楽ではないかと思う。
そして、自動起動処理にする必要もないと思うし、
どうしてもということなら、コードがきちんと完成したあとでよいと思う。
 
こちらのスレッドを放置したまま、別のスレッドを新たに建てられたようだが、
理解できない行動です。
(γ) 2019/06/20(木) 07:24

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.