[[20190606062329]] 『csvファイルの指定したセル値をxlsファイルの指定』(躯) ページの最後に飛ぶ

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

 

『csvファイルの指定したセル値をxlsファイルの指定したセル値に転写したい。』(躯)

いつもお世話になっております。

ネットワーク上にある指定した2つのファイル(csvとxls)を開き、
csvファイル内の指定したセル値をxlsファイルの指定したセル値に転写するやり方をお教えください。

また、その指定するセル値が複数ある場合、そのセル値内で基準値から一番離れている値を転写をしたい。

CSVの指定セル   転写先のxlsの指定セル

     H467 → H19
     H573〜576 → H20
     H474〜477 → H21
     H515 → H22
     H610〜613 → H23

説明不足で申し訳ございませんが、宜しくお願い致します。

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


 どの部分が知りたいのか解らんけど、
 2つのファイルを開いて、下の作業をマクロ記録でもすれば良いんじゃないですか。

     H467 → H19
     H573〜576 → H20
     H474〜477 → H21
     H515 → H22
     H610〜613 → H23
(BJ) 2019/06/06(木) 13:14


BJ様 ご返信ありがとうございます。

H573~576 などの複数データがある場合、
同行I列(I573~576)を参照し、最も0から離れている値を見つけた後に
その離れている値のH列のセルを矢印の先の別ファイルのセルにもってきたいのです。

当方の説明不足で申し訳ございません。

以上、よろしくお願い致します。
(躯) 2019/06/09(日) 09:35


(追記)

I列には、離れている値の差分が書かれています。
(躯) 2019/06/09(日) 09:36


>H573〜576 → H20

これは、わからないけど

>ネットワーク上にある指定した2つのファイル(csvとxls)を開き、

これと

>H467 → H19

これは、できるということでしょうか。
その部分だけでも提示していただけませんか。

(マナ) 2019/06/09(日) 11:02


マナ 様
ご返信ありがとうございます。

>H573〜576 → H20
これは、わからないけど

 (行)   ...   E列(基準値)       F列(上限値)      G列(下限値)     H列(実測値)     I列(差分)  
   :                    :                        :                        :                         :                      :

 467              100                      1                      -1                   99.900              -0.1

   :                    :                        :                        :                         :                      :

 573              500                     10                    -10                  505.500             5.5
 574              500                     10                    -10                  499.000             -1
 575              500                     10                    -10                  501.000              1
 576              500                     10                    -10                 -510.005           -10.5

   :                    :                         :                        :                        :                      :

上記のような形になっており、1つの計測ごとに空白行が入っております。

その中の計測した実測値の中の外れている値を判断(この場合ですと、H576)し、
H576を値をxlsファイルのセルH20に反映したいということです。
同じように、467のような1つ場合は、H467の値をそのままH19にもっていきたいということです。
(他の515や610~613も上記説明と同じように)

>ネットワーク上にある指定した2つのファイル(csvとxls)を開き、

これと

>H467 → H19

これは、できるということでしょうか。
その部分だけでも提示していただけませんか。

当方の知識不足により、できていませんのでお知恵を頂きたい所存です。

長文・駄文となりましたが、よろしくお願い致します。
(躯) 2019/06/09(日) 12:01


では、BJさんのコメント通りで、
まずは「マクロの記録」からではないでしょうか。

(マナ) 2019/06/09(日) 12:46


マナ 様

下記のようになりました。

Sub test()

    Workbooks.Open Filename:= _
        "\\サーバー\ファイル名.csv"
    With ActiveWindow
        .Top = 5.5
        .Left = 423.25

    End With

    ActiveWindow.SmallScroll Down:=450
    Range("H467").Select

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H19:J19").Select

    ActiveSheet.Paste

    Windows("ファイル名.csv").Activate
    ActiveWindow.SmallScroll Down:=93
    Range("H573").Select

    Application.CutCopyMode = False

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H20:J20").Select

    ActiveSheet.Paste

    Windows("ファイル名.csv").Activate
    ActiveWindow.SmallScroll Down:=-78
    Range("H477").Select

    Application.CutCopyMode = False

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H21:J21").Select

    ActiveSheet.Paste

    Windows("ファイル名.csv").Activate
    ActiveWindow.SmallScroll Down:=21
    Range("H515").Select

    Application.CutCopyMode = False

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H22:J22").Select

    ActiveSheet.Paste

    Windows("ファイル名.csv").Activate

    ActiveWindow.SmallScroll Down:=120

    Range("H611").Select
    Application.CutCopyMode = False

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H23:J23").Select

    ActiveSheet.Paste

    Application.CutCopyMode = False

    ActiveWorkbook.SaveAs Filename:= _
        "\\サーバー名\ファイル名.xls", FileFormat:= _
        xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
        , CreateBackup:=False

End Sub

(躯) 2019/06/09(日) 14:38


では、どんな操作を記録したか、
順番に、箇条書きで書き出してください。

(マナ) 2019/06/09(日) 15:03


マナ 様

下記のようになります。

==========
開始

csvファイルを開く

H467をコピー

xlsファイルのH19に貼り付け

H573をコピー

xlsファイルのH20に貼り付け

H477をコピー

xlsファイルのH21に貼り付け

H515をコピー

xlsファイルのH22に貼り付け

H611をコピー

xlsファイルのH23に貼り付け

名前を付けてサーバーに保存

終了

==========

以上、よろしくお願いいたします。

(躯) 2019/06/09(日) 15:13


では、↓に相当する操作では、どのように記録されましたか。

>csvファイルを開く

(マナ) 2019/06/09(日) 15:26


マナ 様

直接サーバーにあるcsvファイルを開きました。
(躯) 2019/06/09(日) 15:49


はい。
その操作で、どんなマクロが記録されたかを教えてください。

(マナ) 2019/06/09(日) 16:04


マナ 様

以下となります。

Workbooks.Open Filename:= _

        "\\サーバー\ファイル名.csv"

(躯) 2019/06/09(日) 16:05


では、その部分だけを実行してみて、期待通り開くか確認してください。

(マナ) 2019/06/09(日) 16:29


マナ 様

期待通りに開きました。
(躯) 2019/06/09(日) 16:32


では、同様に

>H467をコピー
>↓
>xlsファイルのH19に貼り付け

ここの部分は、どんなマクロになるかわかりますか。

(マナ) 2019/06/09(日) 16:39


マナ 様

以下となります。

 Range("H467").Select

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H19").Select

    ActiveSheet.Paste

(躯) 2019/06/09(日) 16:43


期待通りコピペされましたか。

(マナ) 2019/06/09(日) 16:45


マナ 様

期待通りにコピペされました。
(躯) 2019/06/09(日) 16:52


では、ここについてもわかりますね。
期待通り保存できるか確認してください。

>名前を付けてサーバーに保存

(マナ) 2019/06/09(日) 16:59


マナ 様

期待通りに保存できました。
(躯) 2019/06/09(日) 17:01


では、以下のマクロを考えてみてください。

csvファイルを開く

H467をコピー

xlsファイルのH19に貼り付け

H515をコピー

xlsファイルのH22に貼り付け

名前を付けてサーバーに保存

(マナ) 2019/06/09(日) 17:06


マナ 様

以下となります。

    Workbooks.Open Filename:= _
        "\\サーバー\ファイル名.csv"

    Windows("ファイル名.csv").Activate
    Range("H467").Select

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H19").Select

    ActiveSheet.Paste

    Windows("ファイル名.csv").Activate
    Range("H515").Select

    Selection.Copy

    Windows("ファイル名.xls").Activate
    Range("H22").Select

    ActiveSheet.Paste

    ActiveWorkbook.SaveAs Filename:= _
        "\\サーバー名\ファイル名.xls", FileFormat:= _
        xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
        , CreateBackup:=False

End Sub

(躯) 2019/06/09(日) 17:24


では、次です。

> H573〜576 → H20

I列は説明がありました。
J列以降は使用していますか?

(マナ) 2019/06/09(日) 17:44


マナ 様

L列以降なら使用していません。
(躯) 2019/06/09(日) 19:29


では、L列以降を利用して
下記のように数式入力してみてください。
O673がコピーしたいデータになりませんか。
これをマクロにすればよいです。
確認してみてください。

1)L573に、=I573^2
2)L576までコピー
3)M573に、=MAX(L573:L576)
4)N573に、=MATCH(M573,L573:L576,0)
5)O673に、=INDEX(H573:H576,N573)

(マナ) 2019/06/09(日) 19:35


マナ 様

ご説明ありがとうございます。

関数を使用せずにでは、実現不可能でしょうか…?

(躯) 2019/06/09(日) 20:53


>関数を使用せずにでは、実現不可能でしょうか…?

不可能ではありません。
今の 躯さん にとって、関数を使う(作業セルを使う)のが、
一番わかりやすいマクロになると考えました。

逆にお尋ねしますが、関数を使うと何か問題でしょうか?

(マナ) 2019/06/09(日) 21:03


マナ 様

csvファイルが更新されることがあるからです。

(躯) 2019/06/09(日) 22:14


どういう意味かわかりません???

(マナ) 2019/06/09(日) 23:07


マナ 様

説明下手で申し訳ございません。

ここで使用しているcsvファイルは新しく作られる場合があり、
セル関数を使用すると新しく作られたcsvファイルに
その都度、書き込まないといけない必要がある為に避けたい。

という表現で伝わりますでしょうか。
(躯) 2019/06/10(月) 06:48


>その都度、書き込まないといけない必要がある為に避けたい。

その操作をマクロで実行するとしてもですか?

csvファイルを開く

セルに数式入力

計算結果をコピー

xlsファイルに貼り付け

こんなマクロを提案したつもりでした。
まずは、手作業で、数式に問題ないか確認してからですが。

(マナ) 2019/06/10(月) 19:09


マナ 様

こちらの思い違いでした、其方のご提案で問題ございません。

ご教授の程、宜しくお願い致します。
(躯) 2019/06/10(月) 19:16


では、↑の数式で期待通りの結果が得られそうですか。

(マナ) 2019/06/10(月) 19:28


マナ 様

お返事が遅くなり、申し訳ございません。

L行が使用できないので1行ずらしM行から実施した上で、
上の数式を入力した結果、期待通りの結果が得られました。

以下、1行ずらし実施した数式です。 1)M573に、=I573^2
2)M576までコピー
3)N573に、=MAX(M573:M576)
4)O573に、=MATCH(N573,N573:M576,0)
5)P673に、=INDEX(H573:H576,O573)
(躯) 2019/06/11(火) 08:23

マナ 様

追加でご相談なのですが、

csvファイルを開く

セルに数式入力

計算結果をコピー

 xlsファイルに貼り付け 
↓ 
【追加】csvファイルのセルにいれた数式を削除

については可能でしょうか?
(躯) 2019/06/11(火) 17:35


>上の数式を入力した結果、期待通りの結果が得られました。

では、式の意味は理解できていますか。
そんな関数を使用しても、マクロは同じなので
自分が理解できる式にするべきです。

>【追加】csvファイルのセルにいれた数式を削除

可能ですが、
CSVは、保存しないで閉じるとよいのでは?

(マナ) 2019/06/11(火) 18:53


マナ 様

>では、式の意味は理解できていますか。

MAX式 … 最大値を取得
MATCH式 … 最大値が何番目にあるのかを取得
INDEX式 … MATCH式で求めた場所を取得

で合ってますでしょうか。

>可能ですが、
CSVは、保存しないで閉じるとよいのでは?

保存しないで閉じることを失念しておりました。

(躯) 2019/06/11(火) 19:19


数式の意味は理解できているようなので
マクロについて考えます。
以下の作業を実行してください。
  
1)M573〜P573セルに手作業で数式を入力
2)正しい結果がでていることを確認
3)ここからマクロの記録開始
4)M573セルを選択
5)F2キーを押す
6)そのままEnterを押す
7)N573セルを選択
8)F2キーを押す
9)そのままEnterを押す
10)O573セルを選択
11)F2キーを押す
12)そのままEnterを押す
13)P573セルを選択
14)F2キーを押す
15)そのままEnterを押す
16)マクロの記録終了

これが数式を入力するマクロです。
記録された結果を提示してください。

(マナ) 2019/06/11(火) 20:07


マナ 様

以下になりました。

Sub Macro1()

    Range("M573").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("P574").Select

End Sub

(躯) 2019/06/11(火) 20:12


次は、記録されたマクロを編集します。

〇〇.Select
ActiveCell.△△△

こんな感じの繰り返しですが
これは、1行にまとめることができます。

〇〇.△△△
といった感じです。

今回の場合は,こうなります。

 Range("M573").FormulaR1C1 = "=RC[-4]^2"
 Range("N573").FormulaR1C1 = "=MAX(RC[-1]:R[3]C[-1])"
 Range("O573").FormulaR1C1 = "=MATCH(RC[-1],RC[-2]:R[3]C[-2],0)"
 Range("P573").FormulaR1C1 = "=INDEX(RC[-8]:R[3]C[-8],RC[-1])"

つまり

セル..FormulaR1C1 = "=数式"

という構文です。

数式の部分は慣れが必要なので、
今回のように、マクロの記録をそのまま利用するとよいです。

で、M列ですが、実際は、M576まで入力したいので
手作業ならコピーしてもよいのですが
マクロだと、同じ式なら1度に入力できます。
こんな感じです。
確認してもいてください。

 Range("M573:M576").FormulaR1C1 = "=RC[-4]^2"

(マナ) 2019/06/11(火) 21:21


マナ 様

コメントを頂戴する前に自分で模索しましたら上手くいきました!

長らくご丁寧に大変ありがとうございました!!
(躯) 2019/06/11(火) 23:23


コメント返信:

[ 一覧(最新更新順) ]


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