VBAでエクセル関数を実行する方法は?

このQ&Aのポイント
  • VBAを使用してエクセル関数を実行する方法を教えてください。
  • 特定の式をVBAマクロに組み込むことは可能でしょうか?
  • エクセル関数をVBAで処理する方法について詳しく知りたいです。
回答を見る
  • ベストアンサー

エクセル関数をVBAでやりたい

IFERROR(INDEX(***,MATCH(***)),"")この式を下記マクロに組み込むことは、可能でしょうか? Sub Macro1() ' Dim line3 As Integer Dim line5 As Integer line5 = 2  '初期値を2行目に設定してます Do While Worksheets("Sheet5").Cells(line5, 1).Value > 0 'sheet5の通し番号をsheet3のH列から検索して、その行数をline3に代入する。   line3 = Worksheets("Sheet3").Range("H:H").Find(what:=Worksheets("Sheet5").Cells(line5, 8)).Row 'A,B列内容のコピー   Worksheets("Sheet5").Range("A" & line5, "B" & line5).Copy Worksheets("Sheet3").Cells(line3, 1) 'D~G列内容のコピー   Worksheets("Sheet5").Range("D" & line5, "G" & line5).Copy Worksheets("Sheet3").Cells(line3, 4)   line5 = line5 + 1    '次の行へ Loop   ( http://soudan1.biglobe.ne.jp/qa8921867.html )

  • kent4
  • お礼率55% (5/9)

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

  • ベストアンサー
回答No.4

#3です。お礼欄拝見しました。 > 最初の式はシート3のI8セルから90列 200行 IFERROR(INDEX($G9,MATCH(I$8,$F9,0)),"") > 関数を入れてます。 「I8セル」は「I9セル」のことでしょうね(循環参照になる筈ないので)。   =IFERROR(INDEX($G9,MATCH(I$8,$F9,0)),"") という数式だけでは、意図が伝わりませんが、 たぶん、   =IF($F9=I$8,$G9,"")  のような数式での処理を意図している■と判断しました。  Sheet3    F列[今回]日付   I8から右90列[過去の数量記録欄]の日付  が一致した場合だけ   一致した列 and 該当行位置に、G列[数量]を出力 という処理を、ご提示のマクロに追加したい■と。 シートデータ(表)のイメージが判りましたので、 こちらでは、説明された通りのシート構成を作成してテストしました。 解らないのは、  Sheet3 の見出しが、1行めと8行めの2ヶ所あるのは何故か?■  Sheet3 常に9行め以下を処理すればいいのか、それとも、明示できる条件があるのか?■ 疑問は残ったままですが、指示通り、8行めを見出し行、9列めからがデータ という前提で書きました。 もし、違っている場合は、   「.... 中見出し行位置 を★★指定」 と書かれた行の数値指定' = 8 'を書き換えてください。 結構手数が要る課題なので、もし、これで不足があっても対応には時間掛かると思っていてください。 因みに、過去の質問を読み込んでも、セルの位置や細かい具体的条件が変わっているようなので 状況の把握には役立ちませんでした。 マクロ(VBA)では、曖昧な指示をすることが出来ませんので、 位置情報やシートレイアウトについては、こちらも確実なものを求めるしかありません。 補足を戴く場合は、貴方が実際に目にしているものすべてが、 こちらには見えていないことを意識して、何を伝えれば解決に繋がるかだけを考えて、 十分な情報を用意し、短い手数で解決できるようお互いにつとめましょう。 こちらからは4点の確認事項■を提示していますのでチェックしてください。 現在のマクロを以下のマクロに(一時的に)差し替えて 動作を確かめて下さい。 こちらが想定している通りのシートデザインであれば、 こちらでは動作確認してあります。 そちらでも実際に試してみて下さい。 ' ' ============================== Sub Macro1() ' Re8927109rh Dim tmp Dim rng As Range, rng5SrNum As Range Dim nTopRow As Long, nBtmRow As Long, nPDate1 As Long, nPDateL As Long Dim i As Long, j As Long   Set rng5SrNum = Sheets("Sheet5").Range("H:H") ' Sheet5 H列[通しNo] 列(H?)を★指定   With Sheets("Sheet3") '    Set rng = .Range("A:A").Find(What:="月", After:=.Cells(Rows.Count, "A"), _ '            LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious) '    If rng Is Nothing Then MsgBox "A列に見出し「月」が見当たりません", vbExclamation: Exit Sub '    nTopRow = rng.Row     nTopRow = 8 ' Sheet3 中見出し行位置 を★★指定     nBtmRow = .Cells(Rows.Count, "H").End(xlUp).Row ' Sheet3 データ最下行位置 列(H?)を★指定     nPDate1 = 9 ' Sheet3 [過去の数量記録欄]の先頭列位置 を★指定     nPDateL = .Cells(nTopRow, "I").End(xlToRight).Column ' Sheet3 [過去の数量記録欄]の右端列位置 列(I?)を★指定     Application.ScreenUpdating = False ' 描画更新を一時停止     For i = nTopRow + 1 To nBtmRow ' Sheet3 中見出し行位置 から データ最下行位置 まで行をループ     ' ' Sheet3 H列[通しNo]をループして Sheet5 H列[通しNo]の一致したセルを取得       Set rng = rng5SrNum.Find(What:=.Cells(i, "H"), _             LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext) ' 列(H?)を★指定       If Not rng Is Nothing Then ' 万が一を考えて 見つかった時だけ以下の処理         rng.EntireRow.Resize(, 2).Copy Destination:=.Cells(i, "A") ' Sheet5からSheet3 A:Bをコピペ 列(A?)を★指定         rng.EntireRow.Resize(, 4).Offset(, 3).Copy Destination:=.Cells(i, "D") ' Sheet5からSheet3 D:Gをコピペ 列(.Offset(, 3)?D?)を★指定         tmp = .Cells(i, "F").Value ' Sheet3 F列[今回]日付を変数に格納 列(F?)を★指定         For j = nPDate1 To nPDateL ' Sheet3 [過去の数量記録欄]の 先頭列位置 から 右端列位置 までループ           If .Cells(nTopRow, j).Value = tmp Then ' [今回]日付 と一致する列 を見つけたら             .Cells(i, j) = .Cells(i, "G") ' Sheet3 [過去の数量記録欄] 該当行 一致した列 にG列[数量]を出力 列(G?)を★指定             Exit For ' それ以上 [過去の数量記録欄] を探す必要がないので ループを抜ける           End If         Next j       ' ' 万が一 [今回]日付 が [過去の数量記録欄] で見つからない場合 メッセージ         If j > nPDateL Then MsgBox "今回日付:" & .Cells(i, "F") & "該当日付欄未設定", vbExclamation ' 列(F?)を★指定       End If     Next i   End With   Application.ScreenUpdating = True ' コピー処理をループした後に描画エラーを防ぐ為の記述 End Sub ' ' ==============================

kent4
質問者

お礼

説明不足にもかかわらず ご理解いただき感謝いたします。 思い道理の仕上がりに感激しました。 皆様は、どのようにVBAを学ばれたのでしょうか? では、またの質問の時も 宜しくお願い致します。

その他の回答 (3)

回答No.3

こんにちは。お邪魔します。 > IFERROR(INDEX(***,MATCH(***)),"")この式を下記マクロに組み込むことは、可能でしょうか? 可能です。  「Sheet3のH列の値を Sheet5のH列から探し」   (つまりご提示のマクロと比べて「探す」ことの「主従」を逆にします)  「見つかれば、Sheet5のH列と同じ行の値をそれぞれ転記」  「見つからない場合、指定の値で項目を埋める」 ということがなさりたい、という理解でいます。 例えば、Sheet3は100行め、Sheet5は90行め、が最下行だとすると、   Sheet3のA2:B100,D2:G100に   =IFERROR(INDEX(Sheet5!A$2:A$90,MATCH($H2,Sheet5!$H$2:$H$90,0),1),"-") のような数式を一括で設定した結果として、 もし、Sheet5のH列で見つからない場合は、"-"という値を返す。 ということを、マクロ(VBA)で実現してみます。 ニーズへの理解に若干自信がないので、3例挙げますが、 結果はどれも(データ内容については)同じです。 1■なるべく、元のコードを残す書き方。 (Sheet3での行位置をループするので、For Nextで書くことになります。) ' ' ============================== Sub Re8927109a() Dim line5 As Variant Dim i As Long   With Sheets("Sheet3")     For i = 2 To .Cells(Rows.Count, "H").End(xlUp).Row       On Error Resume Next       ' ' MATCH関数で見つかる行位置       line5 = WorksheetFunction.Match(.Cells(i, 8), Worksheets("Sheet5").Range("H:H"), 0)       If Err.Number <> 0 Then         On Error GoTo 0         .Range("(A:B,D:G) " & i & ":" & i).Value = "-" ' Sheet5には記載がない場合       Else         On Error GoTo 0         Worksheets("Sheet5").Range("A" & line5, "B" & line5).Copy .Cells(i, 1) ' A,B列内容のコピー         Worksheets("Sheet5").Range("D" & line5, "G" & line5).Copy .Cells(i, 4) ' D~G列内容のコピー       End If     Next i   End With   Application.ScreenUpdating = True ' コピー処理をループした後に描画エラーを防ぐ為の記述 End Sub ' ' ============================== 2■ほぼ変わらない内容だけど、コピペすると煩わしいので 値だけを転写します(書式等はコピーしません)。 ' ' ============================== Sub Re8927109b() Dim line5 As Variant Dim i As Long   With Sheets("Sheet3")     For i = 2 To .Cells(Rows.Count, "H").End(xlUp).Row       On Error Resume Next       ' ' MATCH関数で見つかる行位置       line5 = WorksheetFunction.Match(.Cells(i, 8), Worksheets("Sheet5").Range("H:H"), 0)       If Err.Number <> 0 Then         On Error GoTo 0         .Range("(A:B,D:G) " & i & ":" & i).Value = "-" ' Sheet5には記載がない場合       Else         On Error GoTo 0         .Cells(i, "A").Resize(, 2).Value = Worksheets("Sheet5").Cells(line5, "A").Resize(, 2).Value ' A,B列の値をトレース         .Cells(i, "D").Resize(, 4).Value = Worksheets("Sheet5").Cells(line5, "D").Resize(, 4).Value  ' D~G列の値をトレース       End If     Next i   End With End Sub ' ' ============================== 3■「IFERROR(INDEX(***,MATCH(***)),"")この式を下記マクロに組み込む」 というオーダーに素直に答えた場合の例(書式等はコピーしません)。 現代の Excel VBA としては、広く知られた手法でもあります。 ' ' ============================== Sub Re8927109f() Const 数式 = "=IFERROR(INDEX(Sheet5!A$2:A$#,MATCH($H2,Sheet5!$H$2:$H$#,0),1),""-"")" Dim sFml As String Dim nBtmRow3 As Long Dim nBtmRow5 As Long   nBtmRow5 = Sheets("Sheet3").Cells(Rows.Count, "H").End(xlUp).Row ' Sheet5の最下行位置   sFml = Replace(数式, "#", nBtmRow5) ' Sheet5の最下行位置を数式に反映   With Sheets("Sheet3")     nBtmRow3 = .Cells(Rows.Count, "H").End(xlUp).Row ' Sheet3の最下行位置     With .Range("(A:B,D:G) 2:" & nBtmRow3) ' Sheet3の数式を適用する範囲を一纏めに       .Formula = sFml ' 数式を設定       .Areas(1).Value = .Areas(1).Value ' 数式の計算結果を固定値(定数)化(ブロック1)       .Areas(2).Value = .Areas(2).Value ' 数式の計算結果を固定値(定数)化(ブロック2)     End With   End With End Sub ' ' ==============================

kent4
質問者

補足

早速のご回答有難うございます。 説明不足ですね。申し訳ありません。文章にするのがにがてなもので、 最初の式はシート3のI8セルから90列 200行 IFERROR(INDEX($G9,MATCH(I$8,$F9,0)),"") 関数を入れてます。 Sub Macro1()の処理実行をすると上記関数も実行出来ればと思ってるのですが。            SHEET3    A   B    C    D     E   F    G    H   I   J 1  月   日      2  3    8    ・         シート5に    シート5からシート3 ・         抽出ボタン     転記ボタン ・   8  月   日   得意先  前回    数量  今回  数量      2/5  2/6  2/7 9  3   7    A商事  1/7       3  2/5     2    1    2 10  3   7    B商事  1/5       2  2/6     1    2           I列以降は、保存(3か月ほど)したいのです。 VBA なら記録を残せると以前、解答をいただいてます。 転記ボタン クリックでJ10セルにG10の 1を転記したいのです。 http://soudan1.biglobe.ne.jp/qa8918740.html いろいろな方法をご提示いただき、誠に恐縮でございますが、この説明でご理解頂けたでしょうか? どうか宜しくお願い致します。  

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問に補足をしてはどうかと思う、理由は >IFERROR(INDEX(***,MATCH(***)),"") とは何をしたいのか。 IFERROR関数は、存在し無いのでは? MATCH関数で引数に***を使っているのは何。どうしたいのか? ***は一般化したいのか。しかし我流では。 INDEX関数も、***を使っているのは同じ疑問有り。 ーー VBAやプログラムに詳しい人でも、関数を複雑に組み合わせたものなど、何をやっているか、解釈しにくい場合がある。過去の回答状況から、両方詳しい人は少ないだろう。 プログラムに詳しい人(プロ)でも、エクセルや、エクセルVBAにくわしくない人もいた。本格的にプログラムをやる人は、普通にエクセルは使えても、エクセルなんて、という人も見た。 ーーー だから VBAのことを聞くなら、簡単な実例(セル範囲とデータ)を自作して、質問に書いて、何をしたいか1歩ずつ、文章で書いて説明すべきだ (例)H列から値XXを探して、見つかったら、その行のYYをZZセルに代入する、とか ーーー 質問者は本件が判ればそれでよいと、お考えかもしれないが、OKWAVEにこの分野で登録するとみんなに質問が回され、質問を読まされる。 また数年後にも、Googleで関連したキーワードで照会すると本質問と回答が出てくるのだ。 第1義的には私的だが公的な面もある。だから質問は判りやすく書いてほしい。 ーーーー >エクセル関数をVBAでやりたい をこの行だけ文字通り解釈すればApplication.WorksheetFunctionを使えば仕舞というケースもある。 http://www.moug.net/tech/exvba/0100035.html たとえばMatch関数は C1:C5にデータを入れて ss a df ss b Sub test02() r = Application.WorksheetFunction.Match("a", Range("c1:C5"), 0) MsgBox r End Sub を実行して2が返る、のように見つかった行番号がわかる。 しかし第2、第3の該当は見つけてくれないので、工夫がいる。たとえば範囲を狭めて再実行するとか。 しかしあまり過去の回答でもこの方式を見かけない。 Findも第2、第3の該当を見つけることや、探索繰り返しの終わりを察知して処理を終わるのは、初心者にはむつかしいように思う。 この質問の主眼点は検索ですか? ーー 本質問はそういう単純な例ではなさそうなので、質問者が書けるVBAコードは参考に付記して、回答者に優れたロジックやコードを公募して、良いと思えば勉強したらよいと思う。 ーー どうしても質問者のコードの形をこだわる(残す)なら、 文章で、コード行の直前(上)に、したいことを文章で書き込んで(コメント)、わからないところ(行)だけ文章だけにして質問するとかもある。 ーー 私の好み。 VBAではCopy貼り付けよりも、シート名・セル番地=シート名・セル番地と、代入方式を使うほうが わかりやすいのでは? 書式まで持っていきたい場合は、そう多くないから。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

>IFERROR(INDEX(***,MATCH(***)),"")この式を下記・・・ Findで見つからなかった時の対策なら別案ですが参考に Sub Test()  Dim i As Long  Dim myRng As Variant  With Worksheets("Sheet5")   'Sheet5の2行目から最終行までループ   For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row    'Sheet5のCells(i, 8)の値をSheet3のH列から完全一致で検索    Set myRng = Worksheets("Sheet3").Range("H:H").Find(What:=.Cells(i, 8).Value, LookIn:=xlValues, LookAt:=xlWhole)    If myRng Is Nothing Then     '見つからない時の処理     'MsgBox i & "行目の" & .Cells(i, 8).Value & "が見つかりません", 16    Else     '見つかればSheet3にコピー     .Cells(i, "A").Resize(, 2).Copy Worksheets("Sheet3").Cells(myRng.Row, 1)     .Cells(i, "D").Resize(, 4).Copy Worksheets("Sheet3").Cells(myRng.Row, 4)    End If   Next i  End With End Sub

関連するQ&A

  • ExcelのVBAについて質問です。Excelは2003です。

    ExcelのVBAについて質問です。Excelは2003です。 コマンドボタン1で下記のプログラムを実行するようにしています。 Sub Macro1() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String Dim i As Integer For i = 1 To 100 Application.Wait Now + TimeValue("00:00:05") ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet4").Range("1:1") ' CH1 の最新データをシート3にコピー Worksheets("Sheet3").Range("B9").Value = Worksheets("Sheet1").Cells(iRows, 3).Value ' CH2 の最新データをシート3にコピー Worksheets("Sheet3").Range("C9").Value = Worksheets("Sheet1").Cells(iRows, 4).Value Next i End Sub これをコマンドボタン2で途中でも強制的に終了するようにしたいのですがコマンドボタン2にはどのようなプログラムを入れればいいでしょうか?

  • ExcelのVBAについての質問です。

    ExcelのVBAについての質問です。 計測機器をつないでsheet1に数値が書き込まれていってる状況です。下記のプログラムを特定の時間内に複数回ループされるように設定したいのですが、そのようなプログラムを加えればいいのでしょうか? Sub Macro1() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet3").Range("1:1") ' CH1 の最新データをシート3にコピー Worksheets("Sheet3").Range("B4").Value = Worksheets("Sheet1").Cells(iRows, 3).Value ' CH2 の最新データをシート3にコピー Worksheets("Sheet3").Range("B5").Value = Worksheets("Sheet1").Cells(iRows, 4).Value End Sub

  • EXCELのVBAでDcount関数がうまく動きません。

    EXCELのVBAでDcount関数を使おうとして、下記コードを作成しましたが、Dcount関数の部分が期待どおり動かず、該当なしとして、0を返してきます。 デバックで途中でマクロを止めて(Dcount関数の前)、セルに直接Dcount関数を入力すると、期待どおりの値を返してきます。 Dcount関数の記述の何が問題なのか、ご教示いただければ幸いです。 Sub 期間集計() Dim myrow, Krow As Double Dim First, Last As Date Dim i, Count As Integer Dim Data As Integer Dim Keria As String 'Worksheets("期間別").Activate Worksheets("期間別").Range("A1:BB65536").Delete Worksheets("入力").Activate With Worksheets("入力") '入力表の最終行の行数をmyrowに代入 myrow = .Range("A65536").End(xlUp).Offset(1).Row '出力前に入力データを日付順にソート .Range("A3").Sort _ Key1:=.Columns("A"), _ Header:=xlGuess First = Worksheets("集計").Range("G3") Last = Worksheets("集計").Range("H3") .Range("BH3:BH5").ClearContents .Range("BH3") = "日付" .Range("bi3") = "日付" .Range("BH4") = ">=" & First .Range("BI4") = "<=" & Last .Range(.Cells(2, 1), Cells(myrow, 47)).AdvancedFilter Action:=xlFilterCopy, _ Criteriarange:=.Range("BH3:BI4"), Copytorange:=Worksheets("期間別").Range("C11"), Unique:=False Krow = Worksheets("期間別").Range("C65536").End(xlUp).Row Keria = "C11:" & "AW" & Krow End With Worksheets("集計").Activate With Worksheets("集計") .Range(.Cells(13, 10), .Cells(24, 10)).ClearContents For i = 1 To 12 Count = 12 + i .Range(.Cells(Count, 16), .Cells(Count, 61)).Copy .Range(.Cells(11, 16), .Cells(11, 61)).PasteSpecial Paste:=xlValues .Range(.Cells(10, 16), .Cells(11, 61)).Copy With Worksheets("期間別") .Range(.Cells(11, 53), .Cells(12, 98)).PasteSpecial Paste:=xlValues Data = WorksheetFunction.DCount(.Range(Keria), .Range("C11"), .Range("BA11:CT12")) End With .Cells(Count, 10) = Data Next i End With

  • エクセルVBA!(COPY) Win2000,offce2000

    単純な質問かもしれませんが、 WorkBooks("test")から 別のWorkBooks("Data").WorkSheets("Sheet1")のデータの数を判定して全てをコピーして、 WorkBooks("test")のWorkSheets("Sheet2")へペーストしたいのですが、うまくいきません ↓のような感じです。 Dim wstest As Worksheet Dim wsData As Worksheet Dim wsNM As String Dim Drow As Long Sub copy() 'DataSheetのSheet名がその都度違うので、取得しました。 wsNM = wsData.Sheets(1).Name Set wsData = Workbooks("Data.xls").Worksheets(wsNM) Set wsTest = Workbooks("Test.xls").WorkSheets("Sheet2") 'データの範囲判定 Drow = wsData.Range("H65536").End(xlUp).Row '/////// ここからが???です /////// wsDataのA1からBAのDrowを範囲を指定して、Copy → wsTestのA1に貼り付けたいのですが、どうしたらよいのでしょうか? コピーしたり、直接書くようにしたりといろいろなコードを書いてみましたがダメでした。 Cellsで範囲をとる方法がわかりません。Rangeなら(A1:BA300)のように取れる範囲もCellsの時はどうしたらよいのでしょうか?(そのまま書けば、Cells(1,1):Cells(Drow,53)みたいな・・・・・) と、悩んでいるより一気にコピーするのもどうかと思いFor~Nextで1行ずつ書いていったらどうかとも考えましたが、うまくいきませんでした。 End Sub ※ Drowは、6000~20000 よろしくお願いします。

  • VBA コピペ Range エラー

    いつもありがとうございます。 https://okwave.jp/qa/q9586463.html この質問のコードを自力で実務用に改変中です。 GetShe.Range(Cells(RowCnt, 1), Cells(RowCnt, 2)).Copy PutShe.Cells(PutRowCnt, 1) ↑このコードでRangeメソッドが失敗しましたというエラーが出るのですが、超初心者のため、原因がわかりません。 GetSheシートのRowCnt行の1列目と2列目をコピーして、PutSheシートのPutRowCnt行の1列目に貼り付けしたいです。 ○番目のシート、行という意味です。 お願いします。 Sub msukei6() ' 変数を宣言 Dim GetShe As Worksheet Dim PutShe As Worksheet Dim SheCnt As Long Dim RowCnt As Long Dim ColCnt As Long Dim PutRowCnt As Long Dim x As Long ' このブックに何シートあるか調べる SheCnt = ThisWorkbook.Worksheets.Count ' "集計"シートが抽出先である Set PutShe = ThisWorkbook.Worksheets("集計") PutRowCnt = 9 For SheCnt = 4 To 6 ' コピー元は4シート目~6シート目 Set GetShe = ThisWorkbook.Worksheets(SheCnt) ' 各シートの氏名をカウントする x = WorksheetFunction.CountA(GetShe.Range("b3:b100")) Do For RowCnt = 3 To x + 3 ' コピー元は3行目からコピーする If GetShe.Cells(RowCnt, Worksheets("集計").Cells(4, 2)) <> "" Then PutRowCnt = PutRowCnt + 1 GetShe.Range(Cells(RowCnt, 1), Cells(RowCnt, 2)).Copy PutShe.Cells(PutRowCnt, 1) End If Next RowCnt Exit Do Loop Next SheCnt End Sub

  • エクセルVBAで別シートにコピー貼り付け

    VBA初心者です。下記のようにプログラムしましたがうまくいかなくて困ってます。どなたかお力をお貸しください。内容としましては輸入Partsのシートからコピーして商品内容確認のシートのセルB17に貼り付けたいです。輸入Partsシートで3列目の空白を探し同じ行の1列目をコピーします。商品内容確認のシートのセルB17にはカーソルは動いているようですが貼りつきません。 Private Sub 商品内容確認2_Click() If MsgBox("商品内容確認へ移動しますか?", 33, "移動の確認") = 2 Then MsgBox "処理を中止します。" Range("A2").Select Exit Sub End If Dim Line As String Dim Maxrow As String Worksheets("輸入Parts").Select Line = 2 Do Until Cells(Line, 1).Value = "" On Error Resume Next If Cells(Line, 3).Value = "" Then Cells(Line, 1).Copy 'コピーする Maxrow = Worksheets("商品内容確認").Range("B17").End(xlDown).Row + 1 Worksheets("商品内容確認").Range("B" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop Worksheets("商品内容確認").Visible = True Worksheets("商品内容確認").Select Worksheets("商品内容確認").Range("B6").Select Worksheets("商品内容確認").輸入Partsシート2.Visible = True Worksheets("商品内容確認").輸出Partsシート2.Visible = False Worksheets("輸入Parts").Visible = False End Sub

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • Excel VBAで毎回新しく入力したキーワードに指定のキーワードを置換できますか?

    仮ファイルに、シートA・B・Cがあります。 シートAのセルB3は、キーワードが入っています。 シートBにはA・B・F・G・H列の3行目から、データが入っています。 シートCには、まだ何も入っていません。 今、シートB内にあるの“○○”というキーワードだけを、シートAのセルB3で指定しているキーワードに置換させたいと思っています。 そのキーワードは毎回変わるので、シートBの中ではなく、別シートにしています。 この置換は、ただ“○○”というキーワードの入っているシートBにそのまま結果を出力するのではなく、別シートのシートCに置換されたデータに出力したいのです。 それで、以下のようなコードを書きましたが、作動しません。 A・B・F・G・H列のデータは配列に入れましたが、それが失敗なのでしょうか…? どこがおかしいか教えて頂けないでしょうか? よろしくお願いします。 Public ovtA As Long Public ovtB As Long Public gglF As Long Public gglG As Long Public gglH As Long Public i As Integer Public j As Integer Public k As Integer Public l As Integer Public m As Integer Public TD1 As Worksheet Public TD2 As Worksheet Sub Test() Workbooks("仮.xls").Activate Set TD1 = Worksheets("シートB") Set TD2 = Worksheets("シートC") ovtA = TD1.Range("A65536").End(xlUp).Row ovtB = TD1.Range("B65536").End(xlUp).Row gglF = TD1.Range("F65536").End(xlUp).Row gglG = TD1.Range("G65536").End(xlUp).Row gglH = TD1.Range("H65536").End(xlUp).Row For i = 3 To ovtA - 1 For j = 3 To ovtB - 1 For k = 3 To gglF - 1 For l = 3 To gglG - 1 For m = 3 To gglH - 1 If TD2.Range("A3") = "" Then TD1.Activate Selection.Replace what:="○○", Replacement:=Worksheets("シートA").Range("B3") TD1.Range(A).Copy Sheets("完成原稿").Cells(1, 1) TD1.Range(B).Copy Sheets("完成原稿").Cells(1, 2) TD1.Range(F).Copy Sheets("完成原稿").Cells(1, 6) TD1.Range(G).Copy Sheets("完成原稿").Cells(1, 7) TD1.Range(H).Copy Sheets("完成原稿").Cells(1, 8) Exit For End If Next Next Next Next Next End Sub

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

専門家に質問してみよう