• 締切済み

vbaプログラミングについて教えてください。

vba初心者です。下記のようにプログラミングしましたがもっといいプログラムの仕方はないでしょうか。ちょっとごちゃごちゃしていて見にくいです。どなかたお力をお貸しください。 Private Sub データUPDATE輸入_Click() ActiveSheet.Unprotect Dim Line As String Dim Maxrow As String Sheets("Invoice").Select Line = 5   Do Until Cells(Line, 7).Value = "" On Error Resume Next 'A列の空欄をコピーして埋める If Cells(5, 1).Value = "" Then Cells(Line, 1).Value = "" ElseIf Cells(Line, 1).Value = "" Then Cells(Line, 1).Value = Cells(Line - 1, 1).Value End If 'B列の空欄をコピーして埋める If Cells(5, 2).Value = "" Then Cells(Line, 2).Value = "" ElseIf Cells(Line, 2).Value = "" Then Cells(Line, 2).Value = Cells(Line - 1, 2).Value End If 'C列の空欄をコピーして埋める If Cells(5, 3).Value = "" Then Cells(Line, 3).Value = "" ElseIf Cells(Line, 3).Value = "" Then Cells(Line, 3).Value = Cells(Line - 1, 3).Value End If 'D列の空欄をコピーして埋める If Cells(5, 4).Value = "" Then Cells(Line, 4).Value = "" ElseIf Cells(Line, 4).Value = "" Then Cells(Line, 4).Value = Cells(Line - 1, 4).Value End If 'E列の文字を「輸入シート」から検索しF列に貼り付ける If Cells(Line, 5).Value = "" Then Cells(Line, 5).Value = Cells(Line - 1, 5).Value End If Cells(Line, 6).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 2, 0) 'E列を検索しデータが存在しない場合はF列に「データがありません」を表記 If Cells(Line, 6).Value = "" Then Cells(Line, 6).Value = "データがありません" GoTo コピー貼り付け End If コピー貼り付け: If Cells(Line, 6).Value = "データがありません" Then Cells(Line, 5).Copy 'コピーする Maxrow = Worksheets("輸入Parts").Range("A1").End(xlDown).Row + 1 Worksheets("輸入Parts").Range("A" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If 'H列の空欄をコピーして埋める If Cells(5, 12).Value = "" Then Cells(Line, 12).Value = "" ElseIf Cells(Line, 12).Value = "" Then Cells(Line, 12).Value = Cells(Line - 1, 12).Value End If 'E列の文字を「輸入シート」から検索しZ列に貼り付ける Cells(Line, 26).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 3, 0) 'E列を検索しデータが存在しない場合はZ列に「データがありません」を表記 If Cells(Line, 26).Value = "" Then Cells(Line, 26).Value = "データがありません" End If 'AD列の空欄をコピーして埋める If Cells(5, 30).Value = "" Then Cells(Line, 30).Value = "" ElseIf Cells(Line, 30).Value = "" Then Cells(Line, 30).Value = Cells(Line - 1, 30).Value End If 'E列の文字を「輸入シート」から検索しAM列に貼り付ける Cells(Line, 39).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), 18, 0) 'E列を検索しデータが存在しない場合はAM列に「データがありません」を表記 If Cells(Line, 39).Value = "" Then Cells(Line, 39).Value = "データがありません" End If '「Unit price」の計算・円建と外貨建が合わさったインボイスの場合の合計金額 If Cells(Line, 14).Value = "" Then Cells(Line, 13).Value = Cells(Line, 17).Value * Cells(Line, 33).Value / Cells(Line, 7).Value Else Cells(Line, 17).Value = Application.WorksheetFunction.RoundDown(Cells(Line, 14).Value * Cells(Line, 16), 0) Cells(Line, 15).Value = Cells(Line, 16).Value * Cells(Line, 33).Value / Cells(Line, 7).Value End If 'T.Invoice Priceの計算 Cells(Line, 23).Value = Application.WorksheetFunction.Sum(Cells(Line, 17), Cells(Line, 18), Cells(Line, 19), Cells(Line, 20), Cells(Line, 21), Cells(Line, 22)) 'VLOOKUP関数が終わり、エラーが発生したら止まる On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop End Sub

みんなの回答

回答No.2

VBAでExcelオブジェクトを操作する場合は、オブジェクト(CellやRangeなど)の参照は 時間がかかる為、極力少ない方がベターです。 また、Rangeの文字列指定による参照はパフォーマンスをかなり落とすので、利用しない事がベターです。 色々いじるセルがあるようですから、恐らく、下記ようにして、予め対象行の対象セルを 全部Rangeに入れておいて、そのオブジェクトを使いまわす、がいいかもしれません。 Dim CellSetGroup1 As Range Dim CellSetGroup2 As Range Set CellSetGroup1 = Range(Cells(line, 1), Cells(line, 6)) ' A列~F列 Set CellSetGroup2 = Range(Cells(line, 10), Cells(line, 15)) ' J列~O列 MsgBox CellSetGroup1(1).Value ' A1の値を出力 みたいな。 いじってて他に思ったのは、以下の点です。  ・プロシージャを分けて、責任範疇を狭める。  ・マジックナンバーは行わない。   5とか7って言われてもどこの列を参照しているのか不透明です。   全て必要な列はenumを利用するなどして定義するべきでしょう。  ・Line、MaxRowの型が数値型ではない。正しい型宣言にするべき。  ・リテラル文字は定数定義に変えるべき。   "輸入Parts"とか"A2:R20000"とか。 以下、それっぽくリファクタしたコードです。動くのかどうか知りませんし、 何をどうしたいのか理解した上でいじったわけではないので、もっと色んな場所で 改善の余地があると思います。 Private Sub データUPDATE輸入_Click() On Error GoTo Exception Dim line As Long Dim maxRow As Long ActiveSheet.Unprotect Sheets("Invoice").Select line = 5 Do Until Cells(line, 7).Value = "" ' 他のセルを考慮した値出力 Call putJudgeCells(line) ' E列 Call putPreviousCellValue(line, 5) ' 輸入シート関係 Call putSearchCellValue(line) '「Unit price」の計算・円建と外貨建が合わさったインボイスの場合の合計金額 If Cells(line, 14).Value = "" Then Cells(line, 13).Value = Cells(line, 17).Value * Cells(line, 33).Value / Cells(line, 7).Value Else Cells(line, 17).Value = Application.WorksheetFunction.RoundDown(Cells(line, 14).Value * Cells(line, 16), 0) Cells(line, 15).Value = Cells(line, 16).Value * Cells(line, 33).Value / Cells(line, 7).Value End If 'T.Invoice Priceの計算 Cells(line, 23).Value = Application.WorksheetFunction.Sum(Cells(line, 17), Cells(line, 18), Cells(line, 19), Cells(line, 20), Cells(line, 21), Cells(line, 22)) '次の行に移り最後の行まで検索 line = line + 1 Loop Exit Sub Exception: Call MsgBox(Err.Description) End Sub '/** ' * 他セル値を考慮するセルの値を出力を行う ' * @param row 行 ' * @param column 列 ' */ Private Sub putJudgeCells(row As Long) ' A, B, C, D, H, AD列 For Each column In Array(1, 2, 3, 4, 12, 30) Call putJudgeCellValue(row, CLng(column)) Next End Sub '/** ' * 他セル値を考慮して値を出力する ' * @param row 行 ' * @param column 列 ' */ Private Sub putJudgeCellValue(row As Long, column As Long) ' 5行目のセル判断 With Cells(row, column) If Cells(5, column).Value = "" Then .Value = "" Exit Sub End If End With Call putPreviousCellValue(row, column) End Sub '/** ' * 対象セルの前行セルから値を出力する ' * @param row 行 ' * @param column 列 ' */ Private Sub putPreviousCellValue(row As Long, column As Long) With Cells(row, column) If .Value = "" Then .Value = .Offset(-1, 0).Value End If End With End Sub '/** ' * 輸入シートから検索を行い、セルの値を出力する ' * @param row 行 ' * @param column 列 ' */ Private Sub putSearchCellValue(row As Long) Dim maps(1 To 3) As Variant maps(1) = Array(6, 2) maps(2) = Array(26, 3) maps(3) = Array(39, 18) For Each map In maps With Cells(row, CLng(map(0))) .Value = getInWareHouse(line, map(1)) If .Value = "" Then .Value = "データがありません" ' F列の場合、輸入シートにセルコピー If map(0) = 6 Then Call copyUnmatchKey(row) End If End If End With Next End Sub '/** ' * E5の値から「輸入シート」から対象データを検索する ' * @param row 行 ' * @param targetColumn 取得列 ' */ Private Function getInWareHouse(row As Long, targetColumn As Long) As String On Error GoTo Exception getInWareHouse = Application.WorksheetFunction.VLookup( _ Cells(row, 5).Value, Worksheets("輸入Parts").Range("A2:R20000"), targetColumn, False) Exit Function Exception: If Err.Number = 1004 Then getInWareHouse = "" Exit Function Else Call Err.Raise(Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext) End If End Function '/** ' * 輸入シート不一致の場合、輸入シートにコピーする ' * @param row 行 ' */ Private Sub copyUnmatchKey(row As Long) Dim maxRow As Long Cells(row, 5).Copy maxRow = Worksheets("輸入Parts").Range("A1").End(xlDown).row + 1 Worksheets("輸入Parts").Range("A" & maxRow).PasteSpecial Paste:=xlPasteValues End Sub

lovelyLeoKun
質問者

お礼

こんなにすっきりとしたプログラミングになるんですね。ご指導ありがとうございました。参考にさせていただきます。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

(1)同じような処理は変数でまとめる。 「○列の空欄をコピーして埋める」の処理は全て一つにまとめれます。 たとえば、配列変数 = Split("A,B,C,D,L,AD", ",") For Each 変数 in 配列変数 ~ Next (内部のCellはRangeに変更) のようにして一つのコード内で変数を回し、纏めることが出来ます。 (2)不要な処理を入れない。 以下の処理でIf ~ End Ifが終われば次のコードへ処理が移動するので Go To~やラベルは不要です。 また、処理1のなかに処理2を入れる。 If Cells(Line, 6).Value = "" Then   ~処理1~   Cells(Line, 6).Value = "データがありません"   GoTo コピー貼り付け End If コピー貼り付け: If Cells(Line, 6).Value = "データがありません" Then   ~処理2~ End IF (3)一つのオブジェクトに対する処理はWith オブジェクト~End Withを使用 With~End Withを使えば極端かもしれませんが以下のように記述できます。 (場合によっては可読性が悪くなります) 'D列の空欄をコピーして埋める With Cells(Line, 4)   If Cells(5, 4).Value = "" Then     .Value = ""   ElseIf .Value = "" Then     .Value = .Offset(-1, 0).Value   End If End With (4)オブジェクト変数に代入してコードを短くする 以下のように変数へオブジェクトを代入すれば変数で範囲を利用できます。 Set オブジェクト変数 = Worksheets("輸入Parts").Range("A2:R20000")       ↓ Cells(Line, 26).Value = Application.WorksheetFunction.VLookup(Cells(Line, 5).Value, オブジェクト変数, 3, 0) (5)Range or Cells オブジェクトのValueプロパティは省略可能   RangeやCellsでセル指定した場合のValueプロパティは標準で取得されますので   省略できますが、Valueである認識はもっておく必要があります   またWith~End Withなどでオブジェクトを省略した場合はValueが必要 こんなところを注意して無駄になっているコード 繰り返し同じことをしているコード などを最適化してください。ぐっと短いコードになると思います。

lovelyLeoKun
質問者

お礼

ご指導ありがとうございました。まだまだ知らないことが多いのでもっと勉強します。

関連するQ&A

  • エクセルvbaでのセルの情報を貼り付け方法

    vba初心者です。sheet1にあるセルの情報をsheet2にあるセルに貼り付けようと考えています。 下記のようにプログラムしました。 If Cells(Line, 6).Value = "" Then Cells(Line, 6).Value = "データがありません" Cells(Line, 5).Value GoTo コピー貼り付け End If コピー貼り付け: Cells(Line, 5).Copy 'コピーする Worksheets("輸入Parts").Range("A2").PasteSpecial Paste:=xlPasteValues '値を貼り付け 問題はコーピー貼り付けの箇所でRange("A2")ではなくA列の最初の空白のセルに貼り付けるようにしたいです。 どなたかお力をお貸しください。

  • エクセル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

  • このVBA、もうちょっとシンプルにできないですか?

    自力でVBAを書いてみたのですが、長くなってしまいました。 もうちょっとシンプルにするアイディアがあればお願いします。 やりたいことは、 (1)ユーザーフォームのテキストボックス内が空欄だったら「無視」 (2)テキストボックスの中が空欄でなければ「書き込み」 以上のことをやりたいのですが、テキストボックスが6種類あるので単純に記述すると結構長くなってしまいました。 特に問題がなければ、その旨をお願いします。 If TextBox1 = "" Then If TextBox2 = "" Then If TextBox3 = "" Then If TextBox4 = "" Then If TextBox5 = "" Then If TextBox6 = "" Then MsgBox ("得点が入力されていません。") ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If ElseIf TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If ElseIf TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If ElseIf TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If End If ElseIf TextBox2 <> "" Then Sheets("総合(得点)").Cells(t + 5, u) = TextBox2.Value If TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ・ ・ ・ こんな感じで規則的に記述しただけです。(文字数が多いので最後は省略しました) 段差がなくて見づらいですが、宜しくお願いします。

  • VBAでの計算後のセルに2重線で囲む

    まだPC・VBA不慣れな為、実行できないので、教えてください。 c16セルに休日を入力すると無理つぶしは成功しましたが、c16セルに祭日を入力すると赤の2重線で囲みたいのですが、できませんので、方法をお願いします。 もう1点がCELLS・RANGEを使った2種類の方法をお願いします。 よろしくお願いします。 Sub 練習44() Dim kyuyo As Currency If Range("c16").Value = "祭日" Then Worksheets("練習1If~Then").Cells(16, 3).xlDouble.ColorIndex = 3 ElseIf Range("c16").Value = "休日" Then Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 5 Else Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 10 End If End Sub

  • エクセルVBA VLOOKUPについて

    エクセル VBA初心者です。 関数でのVLOOKUPをVBAで作りたいのですが、上手くいきません。 あらかじめ、Sheet2の1から300行までに A列  / B列 商品名 / 商品コード が入力されています。(名前の定義=商品コード) Sheet1にユーザーフォームを利用して、データを書き込んだ後、 B列に商品名が書き込まれると、 A列に商品コードが表示されるようにしたいと考えています。 A列に =IF(B2="","",VLOOKUP(B2,商品コード,2,FALSE)) と入力していたのですが、 VBAでIfを使って出来ないかと考えてみたのですが、 上手くいきませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sRow As Long Dim sColumn As Long sRow = ActiveCell.Row sColumn = ActiveCell.Column If Cells(sRow, 2).Value = True Then Cells(sRow, 1).Value = WorksheetFunction.VLookup(Cells(sRow2).Value, Worksheets("Sheet2").Range("A1:B300"), 2, False) ElseIf Cells(sRow, 2).Value = " " Then Cells(sRow, 1).Value = " " End If End Sub ご教授いただけないでしょうか? エクセル2003 WindowsXP

  • Excel VBAについて

    早速ですがExcelVBAについて質問です。 年齢がN列にあるとき、M列に年代を入れたいと思います。(例:19才なら10代、30才なら30代) 以下のように作成しましたが、すべてに20と入ったり正常に動作しないときがあります。 Excelは2003で作成していますが、いずれ2007でも使いたいです。 もっと正確に実行できるコードを教えてください。 ワークシート関数での解決は望んでいません。データ数も多く他の作業もマクロで処理するのでマクロを希望しています。よろしくお願いします。 -------------------------- Sub ByAge() Range("N1").Value = "年代別" Dim i As Long, N As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 13).Value >= 60 And Cells(i, 13).Value < 70 Then Cells(i, 14).Value = 60 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 50 ElseIf Cells(i, 13).Value >= 50 And Cells(i, 13).Value < 60 Then Cells(i, 14).Value = 40 ElseIf Cells(i, 13).Value >= 30 And Cells(i, 13).Value < 40 Then Cells(i, 14).Value = 30 ElseIf Cells(i, 13).Value >= 20 And Cells(i, 13).Value < 30 Then Cells(i, 14).Value = 20 End If Next i MsgBox "完了!" End Sub --------------------------

  • VBAのVLOOKUPの速度向上について

    VBAでVLOOKUPの速度向上について、お知恵を貸していただきたく存じます。 以下のVLOOKUPのVBAがおそく、速くしたいです。行数は2万行ぐらいです。 何卒よろしくお願い申し上げます。 Dim 範囲A As Range Set 範囲A = Worksheets("取引先").Range("A:H") On Error Resume Next myCnt5 = 2 Do Worksheets("受注データ").Cells(myCnt5, 49).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt5, 48), 範囲A, 6, False) myCnt5 = myCnt5 + 1 If Worksheets("受注データ").Cells(myCnt5, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt6 = 2 Do Worksheets("受注データ").Cells(myCnt6, 51).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt6, 50), 範囲A, 8, False) myCnt6 = myCnt6 + 1 If Worksheets("受注データ").Cells(myCnt6, 1).Value < 10 Then Exit Do Loop On Error Resume Next myCnt7 = 2 Do Worksheets("受注データ").Cells(myCnt7, 53).Value = WorksheetFunction.VLookup(Worksheets("受注データ").Cells(myCnt7, 52), 範囲A, 6, False) myCnt7 = myCnt7 + 1 If Worksheets("受注データ").Cells(myCnt7, 1).Value < 10 Then Exit Do Loop 補足 上記VBAには記載していませんが、Application.ScreenUpdatingの停止、Application.Calculationを手動の設定はしています。

  • エクセルVBAについて教えてください。

    DSUMを使ってVBAで自動計算をさせたいのですがうまくいきません。  ・Sheetsデータにデータを置いていて、A1からU1610までデータが入ってます。  ・Sheets集計用は計算させるための(条件を入れる)シートで、A1からE列まで(選択する項目によって何行目になるかわかりません。)  ・mycountでE列のデータが入ってる行を出してます。  ・部屋タイプで1K~1LDKを選ぶとDSUMの式のタイプに1を入れたいのです。(1K~1LDKの場合はCells(1,3) 下記のように書いてみましたが上手くいきません。 どなたかご教授いただけると助かります。 mycount = "=COUNT(集計用!E2:E300)" Sheets("集計用").Cells(5, 7).Value = Range("g10") = " =DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" '部屋タイプの選択 If Sheets("フォーム").Range("c30") = "1K~1LDK" then  タイプ = 3 ElseIf Sheets("フォーム").Range("c30") = "2K~2LDK" Then タイプ = 6 ElseIf Sheets("フォーム").Range("c30") = "3K~3LDK" Then  タイプ = 9 ElseIf Sheets("フォーム").Range("c30") = "4K~4LDK" Then タイプ = 12 Else Sheets("フォーム").Range("c30") = "その他" Then タイプ = 15 End If

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).~」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

専門家に質問してみよう