[[20161121204923]] 『VBAで隣の隣を参照して数式を入力できるようにしax(りりちゃん☆彡) ページの最後に飛ぶ

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

 

『VBAで隣の隣を参照して数式を入力できるようにしたいです。』(りりちゃん☆彡)

こんばんは。
いつもお世話になっております。

私が本を見て読込できるように作ったのですが、
ある位置の部分を自動で数式が入るようにしたいのですが上手くいかなくて
困って居るのですがお分かりになる方教えてくださいませんでしょうか。

よろしくお願い致します。

☆やりたいこと

・CSVになっているファイルをとりこみし、エクセル保存したい。
エクセル保存をする際に、
F9〜F89の列と、H9〜H89、一つおきにAH列まで
同じように、
100列目に、=AVERAGE(F9:F89)
101列目に、=STDEVP(F9:F89)
102列目に、=MAX(F9:F89)
103列目に、=MIN(F9:F89)

と言う風に自動で関数が入るようにしたい。
のですが、隣の隣のセルに書く書き方が分からなっくて
困ってしまっています。

どなたかお分かりンある方教えていただけませんでしょうか。

なお、このVBAは私が本を読んでそのまま打ち込みしたものですので
私がコードを考えて書いたわけではないです。
VBAは超超初心者ですので、宜しくお願い致します。

Sub CSVファイル変換()

    Dim 読込ファイル As String
    Dim 保存ファイル As String

    読込ファイル = Application.GetOpenFilename("CSVファイル,*.CSV")
    保存ファイル = Replace(読込ファイル, ".csv", ".xlsx")

    Workbooks.Open 読込ファイル
        Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous
'       Range("A1").CurrentRegion.Rows(1).Interior.ThemeColor = xlThemeColorAccent4
'       Range("A1").CurrentRegion.Columns.AutoFit
        ActiveWorkbook.SaveAs 保存ファイル, xlOpenXMLWorkbook

'
'データー取り込み時の、CSVからエクセル変換時、自動で平均値を関数に置き換えるようにしたい。

    Range("E100").Value = "Ave"                         'Ave
    Range("E101").Value = "SedDev"                         'StdDev
    Range("E102").Value = "Range"                         'Range
    Range("E103").Value = "Ave"                         'Max
    Range("E104").Value = "Min"                         'Min

    Range("F100").Formula = "=AVERAGE(F9:F89)"      'E102欄に、平均値
    Range("F101").Formula = "=STDEVP(F9:F89)"       'E102欄に、STDEVP
    Range("F102").Formula = "=F93-F94"              'RANGEには、MIN-MAXを引いた、RANGEの数?
    Range("F103").Formula = "=MAX(F9:F89)"          'MAX数値
    Range("F104").Formula = "=MIN(F9:F89)"          'MIN数値

'
'ここから色を指定。
'

    Range("E100").Interior.ColorIndex = 20    '
    Range("E101").Interior.ColorIndex = 20    '
    Range("E102").Interior.ColorIndex = 20    '
    Range("E103").Interior.ColorIndex = 20    '
    Range("E104").Interior.ColorIndex = 20    '   

End Sub

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


 End Sub の直前に、こんなの挿入したらどうですか?

            ↓

 Dim NN As Long

 Range("F100:F104").Copy

 For NN = 8 To Range("AH1").Column Step 2
     Range("F100:F104").Offset(, NN - 6).PasteSpecial xlPasteFormulas
 Next

(半平太) 2016/11/21(月) 21:56


G列も含めてオートフィルすると、飛び飛びに行けますよね。
問題はどこまでオートフィルするかですが、
また、あとで考えてなんか書きます。

とりあえず、マクロの記録。。。
Sub Macro2()
'
' Macro2 Macro
'

'

    Range("F100:G104").Select
    Selection.AutoFill Destination:=Range("F100:L104"), Type:=xlFillDefault
    Range("F100:L104").Select
End Sub
(まっつわん) 2016/11/22(火) 11:13

 まっつわんさんのアドバイスがスマートですが、複数領域に対して一括コピペができます。
 今回の場合、F〜AH の1列おきということですから、15列、F列にセットしたとすると
 それを 14列にコピペするわけで、コードが煩雑になりますが以下のように記述することもできます。
 (まぁ、面倒なので、βなら 半平太さん回答のようにループ処理すると思いますけど)

 Sub Sample1()
    Range("F100").Formula = "=AVERAGE(F9:F89)"      'E102欄に、平均値
    Range("F101").Formula = "=STDEVP(F9:F89)"       'E102欄に、STDEVP
    Range("F102").Formula = "=F93-F94"              'RANGEには、MIN-MAXを引いた、RANGEの数?
    Range("F103").Formula = "=MAX(F9:F89)"          'MAX数値
    Range("F104").Formula = "=MIN(F9:F89)"          'MIN数値

    Range("F100:F104").Copy Range("H100,J100,L100,N100,P100,R100,T100,V100,X100,Z100,AB100,AD100,AF100,AH100")

 End Sub

 もう1つの書き方としては、ある領域に、その領域の先頭セルに対する式をいれると、
 領域全体に、コピペされたように調整された式が入ります。これも覚えておくといいかもしれません。

 Sub Sample2()
    Range("F100,H100,J100,L100,N100,P100,R100,T100,V100,X100,Z100,AB100,AD100,AF100,AH100").Formula = "=AVERAGE(F9:F89)"      'E102欄に、平均値
    Range("F101,H101,J101,L101,N101,P101,R101,T101,V101,X101,Z101,AB101,AD101,AF101,AH101").Formula = "=STDEVP(F9:F89)"       'E102欄に、STDEVP
    Range("F102,H102,J102,L102,N102,P102,R102,T102,V102,X102,Z102,AB102,AD102,AF102,AH102").Formula = "=F93-F94"              'RANGEには、MIN-MAXを引いた、RANGEの数?
    Range("F103,H103,J103,L103,N103,P103,R103,T103,V103,X103,Z103,AB103,AD103,AF103,AH103").Formula = "=MAX(F9:F89)"          'MAX数値
    Range("F104,H104,J104,L104,N104,P104,R104,T104,V104,X104,Z104,AB104,AD104,AF104,AH104").Formula = "=MIN(F9:F89)"          'MIN数値
 End Sub

 ついでに。

    Range("E100").Interior.ColorIndex = 20    '
    Range("E101").Interior.ColorIndex = 20    '
    Range("E102").Interior.ColorIndex = 20    '
    Range("E103").Interior.ColorIndex = 20    '
    Range("E104").Interior.ColorIndex = 20    '   

 これは

    Range("E100:E104").Interior.ColorIndex = 20

 この1行でOKですよ。

(β) 2016/11/22(火) 11:40


あぁ、決め打ちでいいのか^^

Sub CSVファイル変換()

    Dim sPath As String
    Dim wb As Workbook

    sPath = Application.GetOpenFilename("CSVファイル,*.CSV")
    Set wb = Workbooks.Open(sPath)

    With wb.Sheets(1)
        .Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous
        .Range("E100").Value = "Ave"                         'Ave
        .Range("E101").Value = "SedDev"                         'StdDev
        .Range("E102").Value = "Range"                         'Range
        .Range("E103").Value = "Ave"                         'Max
        .Range("E104").Value = "Min"                         'Min
        .Range("F100").Formula = "=AVERAGE(F9:F89)"      'E102欄に、平均値
        .Range("F101").Formula = "=STDEVP(F9:F89)"       'E102欄に、STDEVP
        .Range("F102").Formula = "=F93-F94"              'RANGEには、MIN-MAXを引いた、RANGEの数?
        .Range("F103").Formula = "=MAX(F9:F89)"          'MAX数値
        .Range("F104").Formula = "=MIN(F9:F89)"          'MIN数値
        .Range("F100:G104").AutoFill Destination:=.Range("F100:AH104"), Type:=xlFillDefault
    End With

    '
    sPath = Replace(sPath, ".csv", ".xlsx")
    wb.SaveAs sPath, xlOpenXMLWorkbook
End Sub

>VBAは超超初心者ですので、宜しくお願い致します。
ことさら初心者を強調しても何の得もないですし、
何でも許される魔法の言葉でもないです。

知らないから聞く。それだけでいいのでわ?
(まっつわん) 2016/11/22(火) 12:57


教えていただいた皆様へ

この度は、色々とご指導を頂き、ありがとうございます。
りりちゃん☆彡です。

いつも大変お世話になりありがとうございます。

(半平太)様、
お忙しい中書込みくださりありがとうございました。
のせてくださったので、一度やってみたのですが途中でとまってしまったんです。。
りりのやり方が悪かったのかなぁ。。
できないりりですみません。。

それにしても、、書いて下さったコード。。
少ない知識しかないりりでも、なんかスマートな気がしたな〜。
りりも、こういう風に考えられるようになったらいいのになぁ〜って思いました。

本当にどうもありがとうございました☆ミ

これからも、このエクセルの学校で、私の名前を見かけたら
ぜひ、またご指導いただけたら嬉しいです。
ありがとうございました。
(*´∨`*)

(β) 様
いつもお世話になっております。
今回も教えてくださりありがとうございました。

それにしても、、コードの書き方っていろんな書き方があるんですね〜。
色部分の書き方。。そうですよね〜一つ一つやらなくてもあ〜ゆうふうにできますよね(^-^;
見て思いだした、あ、本でもそう書いてあったかもって。。
それと、 Range("F100").Formula = "=AVERAGE(F9:F89)" のあたりの所なのですが、
りりは、あの一つだけやっと思いついて、あれをAH列まで最初書く気だったんだけど、
3列位までやってみて、なんだかなぁ〜と思ってここで聞こうって決意したの(*´罒`*)
あれも一つ一つ書く以外にもいろんな書き方があるんですね。
教えてくださってどうもありがとう(^^♪勉強になります。

できるVBA〜の本で、色々習ったつもりたけど、いざなんかやろうとするとあれ?習ったっけ?
って思っちゃう。。そんな自分にいつもがっかりさせられているけど、
これからも気長に一つ一つ勉強して行きたいと思います。

今後とも、ご指導の程どうぞよろしくお願い致します。

(まっつわん)様
前回に引き続きお忙しい所ご指導、ありがとうございます。
本に書いて有ったコードにつけたし?してを何とか使えないかと、やっと考えついたのが昨日私がのせたコードなんですが、(まっつわん)様が書いて下さったように書くと、プログラムっぽいっていうか
なんかかっこいい!って思いました。

りりも、早く(まっつわん)さんみたく書けるようになりたいですヽ(*´∇`)ノ

これからも、このエクセルの学校で、私の名前を見かけたら
ぜひ、またご指導いただけたら嬉しいです。
ありがとうございました。
(りりちゃん☆彡) 2016/11/22(火) 22:26


こんにちは。

解決後に失礼します。
>それと、 Range("F100").Formula = "=AVERAGE(F9:F89)" のあたりの所なのですが、
>りりは、あの一つだけやっと思いついて、あれをAH列まで最初書く気だったんだけど、
> 3列位までやってみて、なんだかなぁ〜と思って

前スレにも書きましたが、ここがループの使いどころなんですが
なぜ、ご自身でやってみて そのうえでのご質問とならないのでしょうね。
不思議ですねぇ。

数式を入力したあとに、その範囲をコピーして
2個右に貼り付け、2個右に貼り付け、2個右に貼り付け、、、、AH列まで。
むつかしいですかねぇ。

( 佳 ) 2016/11/23(水) 19:12


こんにちは。
解決後に失礼します^2

関数の位置が決め打ちでよいなら、あらかじめ関数の入力されたシートを作っておいて
マクロでは、CSVを開いたシートから そのシートにセルをコピペして 保存で
用は足りると思いますが、いかがでしょうね。

( 佳 ) 2016/11/23(水) 19:23


( 佳 ) 様

こんばんは、前回に引き続きコメントありがとうございます。
りりちゃん☆彡です。
いつもお世話になっております。

そうなんですよね。シート枚数が複数でなければ、それでも良かったんですが。。
実は複数枚あって、その後の処理に、関数書きした数値を使います。
その関係で、あのようにした方がいいのかな〜?と考えたんです。

実際は、csvでとりだしたデーター内にも"Ave" "SedDev" などの
自動計算された数値だけは入っていますが、あえてエクセルで再計算して
その数値が間違いがないかを確認しています。

あの方法が良いのかどうなのか、まだ作業途中と言う事もあり分かっていませんが。。
とりあえず、この方法で一連の作業が少しでも楽になればいいかなと思っています。

これからも、またエクセルの学校でご相談させていただくこともあると思います。
また私の名前を見かけたら、是非ご指導いただけたら嬉しいです。
(りりちゃん☆彡) 2016/11/23(水) 20:55


こんにちは。
りりちゃん☆彡さん、おへんじありがとうございます。

申し訳ありませんが、シート枚数が複数うんぬんは理解できません。
 csvのシート枚数が複数か? まさかですね(笑
 csvのファイルが複数か?
 マクロブックのシート枚数か?
 このあとで他のシートが登場するという意味か?
いずれにせよ、問題があるなら対応を考えるまでで、それは普通のことなので。
う〜む。
分からないけれど 流れが悪いのかな、程度の理解です。

★そうそう。
わたしはもうひとつアドバイスしています。
もしかしたら見落とされたのかもしれませんので もう一度書いておきますね。

>ここがループの使いどころなんですが(中略)
>数式を入力したあとに、その範囲をコピーして
>2個右に貼り付け、2個右に貼り付け、2個右に貼り付け、、、、AH列まで。
>むつかしいですかねぇ。

ちなみに
この手順をコードにして 洗練させると、半平太さんがアップされたコードになります。

むつかしいですかねぇ。。。

( 佳 ) 2016/11/24(木) 09:50


コメント返信:

[ 一覧(最新更新順) ]


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