[[20220303142521]] 『マクロを使用した関数の挿入を行いたい』(ぺんぎん) ページの最後に飛ぶ

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

 

『マクロを使用した関数の挿入を行いたい』(ぺんぎん)

毎日集計したデータを作り、別のエクセルに貼付てまとめています。
張り付ける場所が奇数行・偶数行と関数が少し違います。
奇数行:=IF(ISERROR(VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,3,0)),0*1,VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,3,0))

偶数行:=IF(ISERROR(VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,4,0)),0*1,VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,4,0))

1日目:E列5行目〜E列62行目
2日目:F列5行目〜G列62行目



31日目:AI列5行目〜AI列62行目
最大で31日目まであります

私は、関数を挿入する方法が
Range("E5").Value = "=IF(ISERROR(VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,3,0)),0*1,VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,3,0))"

こういう方法しか分かりません
ただこれだと、58行×31列分必要になるので…
しかも、いらない部分にも張り付いてしまう可能性があり(月で曜日が違うので)、ボタンなどを31個作る形になる…(ボタン⇒マクロ設定したボタン)

行いたいのは、
E5セルを選択した状態でマクロを実行した場合はE列に関数を張り付ける
F5セルを選択した状態でマクロを実行した場合はF列に関数を張り付ける
この様にできたらと思っています。

また、関数を沢山書かなくても「+2」していく事ができたらと思っています。
出来な場合、
=IF(ISERROR(VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,3,0)),0*1,VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,3,0))
=IF(ISERROR(VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,4,0)),0*1,VLOOKUP($B5,[集計先.xlsx]Sheet2!$A:$D,4,0))
=IF(ISERROR(VLOOKUP($B7,[集計先.xlsx]Sheet2!$A:$D,3,0)),0*1,VLOOKUP($B7,[集計先.xlsx]Sheet2!$A:$D,3,0))
=IF(ISERROR(VLOOKUP($B7,[集計先.xlsx]Sheet2!$A:$D,4,0)),0*1,VLOOKUP($B7,[集計先.xlsx]Sheet2!$A:$D,4,0))
このように「+2」づつ増やしている関数を全て明記しないといけないので…

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

< 使用 Excel:unknown、使用 OS:Windows10 >


よくわかりませんが、こんな感じでしょうか。

 Sub Test()
    Dim c As Long, n As Long, r As Long

    c = ActiveCell.Column
    n = 5
    For r = 5 To 61 Step 2
        Cells(r + 0, c).Formula = "=IF(ISERROR(VLOOKUP($B" & n & ",[集計先.xlsx]Sheet2!$A:$D,3,0)),0*1,VLOOKUP($B" & n & ",[集計先.xlsx]Sheet2!$A:$D,3,0))"
        Cells(r + 1, c).Formula = "=IF(ISERROR(VLOOKUP($B" & n & ",[集計先.xlsx]Sheet2!$A:$D,4,0)),0*1,VLOOKUP($B" & n & ",[集計先.xlsx]Sheet2!$A:$D,4,0))"
        n = n + 2
    Next
 End Sub

(わからん) 2022/03/03(木) 14:58


IFERROR関数やMOD,ROW()関数などを使えば、もともとの式をまとめられそうですが。
(γ) 2022/03/03(木) 15:05

(わからん)さん、完全にそういう事です!
ありがとうございます。

こんなさっぱりした式でできるんですね…

因みに、これを張り付けた後に値貼り付けする事は可能ですか?
(ぺんぎん) 2022/03/03(木) 16:35


 参考までに。

 Sub test()
    Dim c As Long
    c = ActiveCell.Column
    With Cells(5, c).Resize(58, 1)
        .Formula = "=IFERROR(VLOOKUP(IF(MOD(ROW(),2)=1,$B5,$B4),[集計先.xlsx]Sheet2!$A:$D,IF(MOD(ROW(),2)=1,3,4),FALSE),0)"
        .Value = .Value
    End With
 End Sub

(γ) 2022/03/03(木) 17:00


Yさん、ありがとうございます。

.Value = .Value
これが値貼り付けですか?

というか、2つの関数が1個でまとまってるんですか?

どういう考え方ですか?
(ぺんぎん) 2022/03/03(木) 17:22


 >.Value = .Value
 >これが値貼り付けですか?
 はい。

 >というか、2つの関数が1個でまとまってるんですか?
 はい。

 =IFERROR(VLOOKUP(IF(MOD(ROW(),2)=1,$B5,$B4),
                  Sheet2!$A:$D,
                  IF(MOD(ROW(),2)=1,3,4),
                  FALSE),
          0
  )
 (ブック指定は回答上省略しましたが。)

 これをじっくり睨みつけてみてください。
(γ) 2022/03/03(木) 17:37

(γ) さん、もう1っ個教えてください。
5行目から62行目までデータを張り付けたあと
63行目・64行目は張り付けないで
65行目・66行目にデータを張り付ける事は可能でしょうか?
(ぺんぎん) 2022/03/04(金) 11:52

いったん66行目まで貼り付けたあと、
63,64行目の当該列をClearContentsしたらいかがでしょうか。

既にそこに入力があって消去することができない状況であれば、
2つの部分にわけて書き込みすればよいと思います。
(γ) 2022/03/04(金) 13:11


Yさん返信ありがとうございます。
63,64行目は、既にデータが入っています。
そうはいっても
63行目(F列の場合)
=F65-F5-F7-F9-F11-F13-F15-F17-F19-F21-F23-F25-F29-F31-F33-F35-F37-F41-F43-F45-F47-F49-F51-F53-F55-F57-F59-F61

64行目(F列の場合)
=F66-F6-F8-F10-F12-F14-F16-F18-F20-F22-F24-F26-F30-F32-F34-F36-F38-F42-F44-F46-F48-F50-F52-F54-F56-F58-F60-F62

こんだけの計算式が入っているだけです。
これも、同じ様にF列などの指定ない状態で張り付けられたら別に良いのですが…

頂いた式にこんなんかなって居れたら

 Sub test()
    Dim c As Long
    c = ActiveCell.Column
    With Cells(5, c).Resize(58, 1)
        .Formula = "=IFERROR(VLOOKUP(IF(MOD(ROW(),2)=1,$B5,$B4),[集計先.xlsx]Sheet2!$A:$D,IF(MOD(ROW(),2)=1,3,4),FALSE),0)"
        .Value = .Value
    End With

    With Cells(65, c).Resize(66, 1)
        .Formula = "=IFERROR(VLOOKUP(IF(MOD(ROW(),2)=1,$B5,$B4),[集計先.xlsx]Sheet2!$A:$D,IF(MOD(ROW(),2)=1,3,4),FALSE),0)"
        .Value = .Value
    End With
 End Sub
こんなのかなと思って行ったら、更に65行目から沢山張り付いたので…
どうやるのかなって思って...
質問しました。
(ぺんぎん) 2022/03/04(金) 14:05

Cells(65, c).Resize(66, 1)
の意味はわかりますか?
(γ) 2022/03/04(金) 14:16

>同じ様にF列などの指定ない状態で張り付けられたら別に良いのですが…
F63:63行の最終列 の Formulaプロパティの値 = F63の式
F64:64行の最終列 の Formulaプロパティの値 = F64の式
としておけばよいのではないですか?
(上記は実際のコードではなく、考え方を書いたものです)

各列ごとに集計行が違うとかであれば、前提をきちんと書いてもらわないと
回答できません。

質問が広がっていっていますが、最初の質問にはお答えしましたので、
ここまでとさせてください。

(γ) 2022/03/04(金) 14:27


ありがとうございました。
少し悩みます。
(ぺんぎん) 2022/03/04(金) 14:35

>=F65-F5-F7-F9-F11-F13-F15-F17-F19-F21-F23-F25-F29-F31-F33-F35-F37-F41-F43-F45-F47-F49-F51-F53-F55-F57-F59-F61

F27とF39は、なくていいのですか?
(わからん) 2022/03/04(金) 14:41


ここは無くて大丈夫です!
ありがとうございます。
(ぺんぎん) 2022/03/14(月) 17:12

■1
いま詰まってる部分がよくわかりませんが、↓は理解されてるのですよね?
 「MOD(ROW(),2)」←が0になれば偶数行、1になれば奇数行

となると

 =F65-F5-F7-F9-F11-F13-F15-F17-F19-F21-F23-F25-F29-F31-F33-F35-F37-F41-F43-F45-F47-F49-F51-F53-F55-F57-F59-F61
 =F66-F6-F8-F10-F12-F14-F16-F18-F20-F22-F24-F26-F30-F32-F34-F36-F38-F42-F44-F46-F48-F50-F52-F54-F56-F58-F60-F62
          ↓

 =F65〜F66のうち奇数行 - (F5〜F26の奇数行 + F29〜F38の奇数行 + F41〜F62の奇数行)
 =F65〜F66のうち偶数行 - (F5〜F26の偶数行 + F29〜F38の偶数行 + F41〜F62の偶数行)

という表現でもよいような気がします。

■2
さらに、行の関係が決め打ちだというならVBAっぽくループ処理を使って↓のようにしてもよさそうにおもいます。

    Sub ループ処理()
        Dim 行 As Long
        Dim myRNG As Range

        Set myRNG = Range("A5") '←どの列でもよい
        For 行 = 7 To 61 Step 2
            Select Case 行
                Case 27, 39
                    '何もしない
                Case Else
                    Set myRNG = Union(myRNG, Cells(行, "A")) '←どの列でもよい
            End Select
        Next 行

        With Range("F63") '←ここを好きな列に変える
            .Formula = "=" & .Offset(2).Address(0, 0) & "-SUM(" & Intersect(myRNG.EntireRow, .EntireColumn).Address(0, 0) & ")"
            .Copy .Offset(1)
        End With
    End Sub

(もこな2 ) 2022/03/14(月) 19:30


>ここは無くて大丈夫です!
あるほうが、楽なのですが...

まあ、こんな感じでしょうか。

 Sub test3()
    c = ActiveCell.Column
    s = "=R[2]C-R[-58]C-R[-56]C-R[-54]C-R[-52]C-R[-50]C-R[-48]C-R[-46]C-R[-44]C-R[-42]C-R[-40]C-R[-38]C-R[-34]C-R[-32]C-R[-30]C-R[-28]C-R[-26]C-R[-22]C-R[-20]C-R[-18]C-R[-16]C-R[-14]C-R[-12]C-R[-10]C-R[-8]C-R[-6]C-R[-4]C-R[-2]C"
    Cells(63, c).Resize(2, 1).FormulaR1C1 = s
 End Sub

ご参考。
https://www.google.com/search?q=VBA+R1C1%E5%BD%A2%E5%BC%8F

(わからん) 2022/03/15(火) 09:05


コメント返信:

[ 一覧(最新更新順) ]


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