• ベストアンサー

エクセル Do~LoopかFor Nextで・・・・

いつもお世話になります。 記録マクロで行った部分です Columns("R:R").Select Selection.Insert Shift:=xlToRight Range("R2").Select ActiveCell.FormulaR1C1 = "=IF((RC[-4]=1),((RIGHT(RC[-1],8)*1)),(IF((RC[-4]>R[-1]C[-4]),(RIGHT(RC[-1],8))-(RIGHT(R[-1]C[-1],8)),(R[-1]C))))" Selection.NumberFormatLocal = "[$-F400]h:mm:ss AM/PM" Selection.AutoFill Destination:=Range("R2:R65536") Range("R2:R65536").Select Columns("R:R").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False これでいきますと、R列全てに対して計算してしまうので 隣が入力されている所までを判断して次の処理に入りたいと思っているのですが、いまいち分からないのです。 どうかよろしくお願いします。

  • hou66
  • お礼率50% (79/155)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんにちは。 一応、今回のものでコツがわかっていただけたと思います。 いくらVBAプログラミングとは言っても、今回の切り抜け方は、Excel独特の方法ではないかと思っています。 実は、まだ、ここらあたりには裏ワザがあります。それは、一般数式で可能な範囲はその方がよいのですが、配列数式は、Evaluate関数の中では、配列確定、Alt+Ctrl -> Enter をなしに使えます。非常にコードが少なくて便利なことがあります。 また、数式で入れる場合は、Excel 2003 以下は、配列数式は、セルの計算に使う延べ数 5,500個を目途にしたほうがよいことと、それ以上になると、スワップメモリが働いてしまいます。 一般数式は、仮に、列を全部範囲指定しても、データ範囲(Ctrl+Endの最終行)までしか認識しませんし、まったく空(Empty)状態の場合は、メモリに格納されません。ひとつのセルで、約20byte +文字数です。数式も文字数として換算されます。配列数式は、その数式で使われたセル数すべてがメモリの対象となります。ここが、配列数式との大きな違いです。 一般数式の場合は、値を格納していますから、参照セルの変更のあったところのみの、数式の結果が反映されます。だから、意外にメモリの使用量が少ないのですが、配列数式は、値を格納できませんので、一気に値を計算しなおそうとしてメモリを使用してしまいます。メモリというのは、仮想メモリのことで、物理メモリではありません。 今回、試験的にExcel 2007(Vista) で行ってみました。配列の上限数はなくなって、計算には、1つの演算プロセッサが使われたようですが、しかし、違った現象が現れました。 =IF(COUNTIF($A$2:$A$33930,A2)=1,b2,AVERAGE(IF($A$2:$A$33930=a2,$B$2:$B$33930)))} の式を、全部消して、一般の数式に直そうとしたら、ハングしてしまいました。何が原因かは分かりませんが、この数式は、無理だったのかなって思いました。 なお、 >dimの宣言を冒頭にしていませんが別段問題なく動作していますので・・・・ なくても問題はないのですが、Dimの宣言というのは、本質的には省メモリのためなのです。上記で書いたように、20byte +αというのは、Variant 型の変数のことです。それを特定の型で指定することで、消費メモリを減らすことができます。 しかし、本当に、Dim の宣言が必要になる時は、厳密な計算が必要になる場合です。もしも、計算が変だということに出会ったら、その時に、改めてDim宣言についてお調べになってもよいのですが、VBAの教本には詳しいことが出ていないかもしれません。「浮動小数点丸め誤差」という問題に対処しなくてはならない時があります。ワークシートは、ある程度の補正処理をしていますが、VBAでは、そういう補正がありませんので、自分で解決しなければなりません。

hou66
質問者

お礼

ありがとうございます。 今回の件は他方に色々と使えそうでもっとジックリ理解を深めたいと思います。 また、byte数の事まで考えて処理を考えてられるのは凄いですね また、色々と質問をすることがあると思いますが 見かけたときはアドバイスよろしくお願いします。  諸般の事情により以前よりレスポンスが悪くなっていますがご容赦ください。

その他の回答 (8)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 >今回教えていただいた数式を同じように組み込もうと思ったのですが >範囲選択の仕方がわかりません。 (1) =IF(COUNTIF($A$2:$A$33930,A2)=1,b2,AVERAGE(IF($A$2:$A$33930=a2,$B$2:$B$33930)))} ---この数式、かなりの関数の猛者が作ったような内容ですが、配列にする必要がありませんでしたね。 (2) = SUMIF($A$2:$A$33930,A2,$B$2:$B$33930)/COUNTIF($A$2:$A$33930,A2) 一度、試してみていただければよいのですが、(1)と(2)は、似ているようで、メモリの使い方が違っています。だから、(1)のような範囲のシビアさはないはずなのですね。でも、それでは直接の回答にはなっていませんから、ひとまず提案として、このようにしたらどうでしょうか。 A列に対して、右に4つ = Offset(,4) = E列 の場合は、 A列を起点にして、このようにして範囲を取ります。(ただし、こういうマクロは、標準モジュールのほうがエラーが少ないです) Dim rng As Range Set rng = Range("A2", Range("A65536").End(xlUp)) rng.Offset(, 4).Formula = _ "=SUMIF(" & rng.Address & ",A2," & rng.Offset(, 1).Address & ")/COUNTIF(" & rng.Address & ",A2)" ' rng.Offset(, 4).Value =rng.Offset(, 4).Value '数式から値に変更する End Sub だいたい、状況はつかめましたので、もし、うまくなかったら、全面的に内容を変えます。この質問は、Excel独特というか、VBAのみできる人では、うまくは、できない問題だと思います。

hou66
質問者

お礼

こんばんは、ありがとうございます。 いつも大変ありがたく思っています。 最終的にはこの様な形にしました dimの宣言を冒頭にしていませんが別段問題なく動作していますので・・・・ 'R列に挿入後時間計算を実行 Columns("R:R").Insert Shift:=xlToRight With Range("Q2", Range("Q65536").End(xlUp)).Offset(, 1) .NumberFormatLocal = "[$-F400]h:mm:ss AM/PM" .Formula = "=IF(RC[-4]=1,RIGHT(RC[-1],8)*1,IF(RC[-4]>R[-1]C[-4],RIGHT(RC[-1],8)-RIGHT(R[-1]C[-1],8),R[-1]C))" .Value = .Value End With 's行に平均値を求める Dim rng As Range Columns("s:s").Insert Shift:=xlToRight Set rng = Range("e2", Range("e65536").End(xlUp)) rng.Offset(, 14).Formula = _ "=SUMIF(" & rng.Address & ",e2," & rng.Offset(, 13).Address & ")/COUNTIF(" & rng.Address & ",e2)" rng.Offset(, 14).Value = rng.Offset(, 14).Value '数式から値に変更する あっという間に答えが出ているのでびっくりしました。 今回のように処理する範囲選択を自動で出来ると大変ありがたく思います この後の処理としては集計を用いてそれぞれをマトメ選択元1つ1つの時間を抽出する事になりますが 現状でもかなり時間短縮できました。 関数計算でもそこそこの時間を必要としていましたが、本当に目が点でした。 ありがとうございます

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 >000000:15:00と出力されているため時刻に戻すため右から8桁としています 割り切れる数だと良いのですが、Excelには、無限小数は存在しないけれども、小数点第16位から、数えることになりかねませんので、INTで切ったほうがよいと思いました。 >S列に行挿入をして「配列関数?」を使いE列を基準としてR列のデータをまとめたいと思い同じ様な処理で可能かと考えたからです 配列数式は、マクロに置き換えると、目からテンになるほど軽くなりますが、以下の数式は、 >=IF(COUNTIF($A$2:$A$33930,A2)=1,b2,AVERAGE(IF($A$2:$A$33930=a2,$B$2:$B$33930)))} = SUMIF($A$2:$A$33930,A2,$B$2:$B$33930)/COUNTIF($A$2:$A$33930,A2) ということだと思います。

hou66
質問者

お礼

ありがとうございます。 数式確かに同じ結果になりました。 若干早いのかも知れません。 前回教えていただいた内容はとても早くてびっくりです。 今回教えていただいた数式を同じように組み込もうと思ったのですが 範囲選択の仕方がわかりません。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 相対参照式の入力には、ループ系は使いません。 しかし、元の数式自体が良く分かりません。時間を計算するはずなのに、RIGHT(RC[-1],8) という文字列を取得するというのは、疑問です。文字列になっているなら分かりますが、文字列のままというのもExcelでは扱いにくいです。 例: 2008/12/17 0:12:00 これ(シリアル値)から時間を取るなら、=Q2-INT(Q2) となります。 それと、"[$-F400]h:mm:ss AM/PM" は、このようなロケール指定子はあっているのでしょうか。"[$-411]h:mm:ss AM/PM" なら、日本を指します。 Columns("R:R").Insert Shift:=xlToRight With Range("Q2", Range("Q65536").End(xlUp)).Offset(, 1)   .NumberFormatLocal = "[$-F400]h:mm:ss AM/PM"   .Formula = "=IF(RC[-4]=1,RIGHT(RC[-1],8)*1,IF(RC[-4]>R[-1]C[-4],RIGHT(RC[-1],8)-RIGHT(R[-1]C[-1],8),R[-1]C))"   .Value = .Value End With なお、VBAのコーディングでは、FormulaR1C1 の数式を限定する必要はありません。

hou66
質問者

お礼

ありがとうございます。 いつもお世話になっています。 >RIGHT(RC[-1],8) という文字列を取得するというのは 取得するのは確かに時刻なのですが出力された時点で 000000:15:00と出力されているため時刻に戻すため右から8桁としています >"[$-F400]h:mm:ss AM/PM" ですが、マクロ記録で行ったため わかっていません(汗 loop系として問い合わせをしたのは、同じようにこの次の作業として S列に行挿入をして「配列関数?」を使いE列を基準としてR列のデータを まとめたいと思い同じ様な処理で可能かと考えたからです 現在はE列とR列を新規シートに貼り付け =IF(COUNTIF($A$2:$A$33930,A2)=1,b2,AVERAGE(IF($A$2:$A$33930=a2,$B$2:$B$33930)))}で求めていますが これも、必要部分まで届いているのかどうかを確認して動かしていますので 範囲選択方法を理解するためにもと思いloop処理での問合せをしました 配列関数を使うとやたらと時間がかかるのでちょっと困ってもいるのですが・・・・

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

>Do~LoopかFor Nextで・・・・ 使わなくてもいけますよ Sub test() Dim i As Long i = Range("q65536").End(xlUp).Row Columns("R:R").Select Selection.Insert Shift:=xlToRight Range("R2").Select ActiveCell.FormulaR1C1 = "=IF((RC[-4]=1),((RIGHT(RC[-1],8)*1)),(IF((RC[-4]>R[-1]C[-4]),(RIGHT(RC[-1],8))-(RIGHT(R[-1]C[-1],8)),(R[-1]C))))" Selection.NumberFormatLocal = "[$-F400]h:mm:ss AM/PM" Selection.AutoFill Destination:=Range("R2:R" & i) Range("R2:R" & i).Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

hou66
質問者

お礼

ありがとうございます。 欲しい結果は出ています

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

こんな感じで如何でしょうか。 Do~LoopかFor Nextではありませんが・・・ Sub test() Columns("R:R").Insert Range("R2").FormulaR1C1 = _   "=IF(RC[-4]=1,RIGHT(RC[-1],8)*1,IF(RC[-4]>R[-1]C[-4],RIGHT(RC[-1],8)-RIGHT(R[-1]C[-1],8),R[-1]C))" Range("R2").NumberFormatLocal = "[$-F400]h:mm:ss AM/PM" With Intersect(Range("R2:R65536"), ActiveSheet.UsedRange)   Range("R2").AutoFill Destination:=Range(.Address)   .Copy   .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone   Application.CutCopyMode = False End With End Sub あと、最初セルR2に設定する計算式 括弧の数が必要以上に多いように思いましたので削りました。

hou66
質問者

お礼

ありがとうございます。 欲しい結果になっています

回答No.3

No.1,No.2です。 そのままでは使用できないので、思い直しましたm(_ _)m No.1、No.2は(参考にはなると思いますが)無視してください 1. S65536セルをクリックして 2. [Ctrl]+[↑] で最終行が選択できます。 3. VBEにおいて Selection.Row で最終の行番号が取得できます なんか、回答がボロボロですみませんm(_ _)m 記録マクロのあとで[Alt]+[F11]VBEで検証して下さい もう少し高度なものは自分で会得するか他回答者にお任せします

hou66
質問者

お礼

ありがとうございます。 十分参考になっています。

回答No.2

No1.です。すみません、一つ抜けてました。マクロの記録の場合です。 1.5 記録終了ツールバーから[相対参照]ボタンをクリック

回答No.1

記録マクロの範囲で 1. S1セル(Q1セルなのかな?)選択 2. [Ctrl]+[Shift]+[↓] 3. [Shift]+[←] 4. [Shift]+[Tab] 5. [Shift]+[←] 高度なものは他の回答者にお任せしますm(_ _)m

関連するQ&A

  • エクセルVBAの保存

    毎月異なった新しいエクセルファイルに同じような加工を施すため、VBAを書きました。対象はActivesheetとしています。 で、質問は、この新しいエクセルファイルの標準モジュールにいちいちこのVBAをコピーペーストせずに実行する方法です。 きっと何かあるとは思うのですが・・・・。 VBAは次のような簡単なものです。 Sub 加工1() Dim e As Integer, s As String, n As String e = Range("A4").End(xlDown).Row s = Replace(Mid(Range("A2"), 8, 5), "年", "") & "-" n = Replace(Mid(Range("A2"), 19, 5), "年", "") & "-" Range("A1:C2").MergeCells = False Columns("B:B").Select Selection.Insert Shift:=xlToRight Columns("A:A").Select Selection.Insert Shift:=xlToRight Columns("C:C").Select Selection.NumberFormatLocal = "G/標準" Range("B3").Select Selection.AutoFill Destination:=Range("B3:C3"), Type:=xlFillDefault Range("B3").Select ActiveCell.FormulaR1C1 = "商品番号1" Range("C4").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C" & e), Type:=xlFillDefault Range("A3").Select ActiveCell.FormulaR1C1 = "抽出年月日" Range("A4").Select ActiveCell.FormulaR1C1 = s & n & 1 Range("A4").Select Selection.AutoFill Destination:=Range("A4:A" & e), Type:=xlFillDefault Rows("3:3").Select Selection.Insert Shift:=xlDown Range("B1:E1").MergeCells = True Range("B2:E2").MergeCells = True ActiveSheet.Name = "提出用" End Sub

  • エクセルVBAの修正をお願いいたします。

    下記VBAをご教授受けて何とか作りましたが、一行指定で作成したのですが、その時によりデータ数にばらつきがありますので、現状データがあるセルだけを拾ってきてデータのあるなしを、JのセルとKのセルに2種類表示するように作成したつもりですが、データがないセルにも延々と Jのセルには 1040272 Kのセルには * が表示されますのでデータが現状ないセルには何も表示されないようにしたいと思います。 自分でいろいろ調べながらしてみるのですが埒が明かない状態になっておりますので、なにとぞお助け、ご教授をお願いいたします。 わかりにくい説明で申し訳ございませんがなにとぞよろしくお願いいたします。 Range("H2").Select ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[-5],RC[-4])" Selection.AutoFill Destination:=Range("H2:H10000") Range("H2:H10000").Select Columns("H:H").Select Selection.Copy Columns("I:I").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.Replace what:="-", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace what:="_", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Sheets("登録商品リスト").Select Columns("C:C").Select Application.CutCopyMode = False Selection.Copy Columns("E:E").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.Replace what:="_", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace what:="-", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("F2").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=UPPER(RC[-1])" Selection.AutoFill Destination:=Range("F2:F10000") Range("F:F").Select Columns("F:F").Select Selection.Copy Columns("G:G").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("J2").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=COUNTIFS(登録商品リスト!C[-3],C[-1])" Selection.AutoFill Destination:=Range("J2:J1500") Range("J:J").Select Dim i As Long, endRow As Long, str As String, c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("登録商品リスト") Set wS2 = Worksheets("Sheet2") endRow = wS2.Cells(Rows.Count, "K").End(xlUp).Row Application.ScreenUpdating = False If endRow > 1 Then Range(wS2.Cells(2, "K"), wS2.Cells(endRow, "K")).ClearContents End If For i = 2 To wS2.Cells(Rows.Count, "I").End(xlUp).Row str = Left(wS2.Cells(i, "I"), 5) Set c = wS1.Range("G:G").Find(what:=str, LookIn:=xlValues, lookat:=xlPart) If Not c Is Nothing Then wS2.Cells(i, "K") = "*" End If Next i Application.ScreenUpdating = True End Sub

  • エクセルマクロでの参照方法の変更

    久々にエクセルのマクロで手直しが必要になりました。 色々調べましたが、判らなくて質問致します。 以下のマクロでAJ6に検索キーを作成しています。 Range("C5").Select 行 = Selection.End(xlDown).Row Range("AJ6").Select ActiveCell.FormulaR1C1 = "=RC[-35]&"" ""&RC[-34]&"" ""&RC[-33]&"" ""&RC[-32]" Selection.AutoFill Destination:=Range("AJ6:AJ" & 行) Range(Selection, Selection.End(xlDown)).Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False, Transpose:=False ActiveSheet.Paste Application.CutCopyMode = False Range("A5").Select の様にRC[-35]ではなく$A6の様に絶対参照?にしたいのです 理由として間の列が追加になるたびにRC[-35]の数値の増減しないといけないので手間が掛かります。 列を増やしても$A6の様に固定ってできないでしょうか?

  • 色々なものを見ながら作っている初心者です。

    色々なものを見ながら作っている初心者です。 よろしくお願いします。 VBAでのエラー対処について 下記のマクロを実行すると、実行時 「Selection.Resize(, Selection.Columns.Count - 2).Select」のところで セルがブランクだった時にエラーが出てします。 対処の方法を教えていただけませんでしょうか? よろしくお願いします。 Sheets("sheetB1").Select Range("A7:C161").Select Application.CutCopyMode = False Selection.ClearContents Sheets("sheetA").Select Range("D12").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToLeft)).Select Selection.Resize(, Selection.Columns.Count - 2).Select Selection.Offset(0, 1).Select Selection.Copy Sheets("sheetB1").Select Range("A7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("sheetA").Select Range("E12").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("B1").Select Range("C7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("sheetB2").Select Range("A7:C161").Select Application.CutCopyMode = False Selection.ClearContents Sheets("sheetA").Select Range("J12").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToLeft)).Select Selection.Resize(, Selection.Columns.Count - 2).Select Selection.Offset(0, 1).Select Selection.Copy Sheets("sheetB2").Select Range("A7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("sheetA").Select Range("K12").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("steetB2").Select Range("C7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=Fals

  • VBAで関数式の値をセルに入力できるようにしたい。

    こんなマクロをマクロの記録で作ったのですが SUMIF関数の数式をセルに入力するのでなく 値だけを入力するしたいのですがどのように すればいいでしょうか? Sub Macro4() Columns("O:O").Select Selection.Insert Shift:=xlToRight Range("N3").Select Selection.AutoFill Destination:=Range("N3:O3"), Type:=xlFillDefault Range("N3:O3").Select Range("O5").Select ActiveCell.FormulaR1C1 = "=SUMIF(出荷貼付け!C1,RC1,出荷貼付け!C5)" ←ここのところを値だけをセルに入力したい。 Selection.AutoFill Destination:=Range("O5:O978") Range("O5:O978").Select Range("O4").Select End Sub

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • 文字列を連続で置き換え・・・・?

    マクロを記録したんですが手直しして繰り返しと空白のセル内が見つかった場合 繰り返しを終わらせワードパッドにコピーして保存終了させたいんですがわかりません? 誰か教えてください。 ' ' Macro2 Macro ' マクロ記録日 : 2012/4/21 ユーザー名 : cocoro ' ' Range("E:E").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""#"",RC[-4])" Range("F1").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""$"",RC[-4])" Range("G1").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""&"",RC[-4])" Range("E2").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""#"",RC[-4])" Range("F2").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""$"",RC[-4])" Range("G2").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""&"",RC[-4])" Columns("G:G").Select Selection.Copy Columns("H:H").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Columns("H:H").Select ActiveWindow.SmallScroll Down:=-6 Application.CutCopyMode = False Selection.Copy End Sub

  • Excel VBA 計算範囲の変更について教えてください。

    こんばんは。とても困っています。 下記のような表で=A1&B1&C1の計算式を入れ、A1とB1を絶対参照にして$A$1&$B$1&C1としてD3までオートフィルをかけます。 そしてD4は =$A$4&$B$4&C4のように絶対参照しているセルを変更したいのです。たくさんありすぎて参照する範囲を変更するのにとても大変な思いをしています。VBAでどのようにすればよいのか教えてください。   |A    B   C     D ------------------------------------- 1| 1T  11L   A    1T11LA (=$A$1&$B$1&C1) 2|          B    1T11LB (=$A$1&$B$1&C2) 3|          C    1T11LC (=$A$1&$B$1&C3) 4| 2T  20L   A    2T20LA (=$A$4&$B$4&C4) 5|          B     2T20LB (=$A$4&$B$4&C5) 6|          C    2T20LC (=$A$4&$B$4&C6) 7| 3T  31M   A    3T31MA (=$A$7&$B$7&C7) 8|          B     3T31MB (=$A$7&$B$7&C8) マクロで記録させたらところ下記のようになりました。 Sub 4行置きに参照範囲を変更する() Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=RC[-3]&RC[-2]&RC[-1]" Range("D1").Select ActiveCell.FormulaR1C1 = "=R1C1&R1C2&RC[-1]" Range("D1").Select Selection.AutoFill Destination:=Range("D1:D3"), Type:=xlFillDefault Range("D1:D3").Select Range("D4").Select ActiveCell.FormulaR1C1 = "=R4C1&R4C2&RC[-1]" Range("D4").Select Selection.AutoFill Destination:=Range("D4:D6"), Type:=xlFillDefault Range("D4:D6").Select Range("D7").Select ActiveCell.FormulaR1C1 = "=R7C1&R7C2&RC[-1]" Range("D7").Select Selection.AutoFill Destination:=Range("D7:D9"), Type:=xlFillDefault Range("D7:D9").Select End Sub ◎初心者なのでVBAにたくさんコメントを入れていただくと助かります。 宜しくお願い致します。

  • VBAマクロエラー【オーバーフローしました。】

    以下のVBAマクロで突然エラーが出るようになってしまいました。 原因がわからず困っています。 どなたかご教授ください。 該当部分 :S = Range("B2").End(xlDown).Row エラーMrg:実行時エラー'6': オーバーフローしました ----------マクロ文---------- Sub 部担コード読み替え() Dim R_Count As Integer Dim P_Sheet As String Dim S As Integer 'データ取込用のファイルを開く Workbooks(D_Book).Activate Sheets("Data1").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select Sheets("Data2").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Columns("G:G").Select Selection.Insert Shift:=xlToRight Range("G2:G" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("G1").Value = "キー" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Columns("E:E").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select End Sub

  • VBA エラー表示についての原因がわかりません

    お世話になります。 現在、社内集計作業のため下記のようなマクロを組みました。 条件として保存動作をすると実行…ということで諸々調べた結果、VBE→ThisWorkBookから指定のプロシージャを選んで、その中にコードを記入する、ということが多数でしたので、それに倣いました。 ところが、いざ下記コード内容で実行しようとすると「インデックス範囲が有効ではありません」とストップをかけられる上、最初の新規ワークブック追加~コピペすら正しく行われません。 標準モジュールでは正しく実行してくれるのですが、このようなケースでエラーになる理由がよくわかりません。 つきましては、下記コードがエラーとなる理由、そして可能であればどのように修正をすればよいかお教えください。 ご面倒をおかけしますが、よろしくお願いいたします。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) ' Macro2 Macro ' ' Columns("A:A").Select Range("A:FU").Select Selection.Copy Workbooks.Add ActiveSheet.Paste Columns("FU:FU").Select Application.CutCopyMode = False Selection.Copy Columns("FT:FT").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Columns("FT:GF").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Columns("A:A").Select Range(Selection, Selection.End(xlToRight)).Select Selection.NumberFormatLocal = "G/標準" Sheets("Sheet3").Select Application.DisplayAlerts = False 'メッセージを出さない ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = False 'メッセージを出さない Sheets("Sheet2").Select ActiveWindow.SelectedSheets.Delete Range("A1").Select Columns("A:A").Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,SkipBlanks _ :=False, Transpose:=False ChDir "\\sv-qlikview.dmsinc.local\Documents\社内実績集計画面\読込用(仮)" Application.DisplayAlerts = False 'メッセージを出さない ActiveWorkbook.SaveAs Filename:= _ "\\sv-qlikview.dmsinc.local\Documents\社内実績集計画面\読込用(仮)\第○営業部.xlsx", _ FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False ActiveWindow.Close End Sub

専門家に質問してみよう