Excel2013のVBAを使った自動更新方法について

このQ&Aのポイント
  • Excel2013のVBAを使って自動更新を行いたいと思っています。ピボットテーブルを使用して特定の条件に基づいてデータを更新しようとしていますが、セルの移動やsendkeysの使用について上手くいかない問題が生じています。
  • 具体的には、セルの移動がうまく機能せず、sendkeysを使ったカーソルの動きも正常に行われません。複数の方法を試しましたが、うまくいきませんでした。
  • sendkeysの使用方法や、より効果的なデータ更新方法に詳しい方は、教えていただけると助かります。
回答を見る
  • ベストアンサー

Excel2013>VBA>sendkeys動ず

Excel2013のVBAを使って自動更新をしようと思っています。    A  B   C 1  あ  AA  0 2  い  AB  1 3  う  AC  0 4  え  AA  1 5  お  AA  0 上記のようにシート内にデータはあります。B列「AA」C列の「ゼロ」を更新してC列の値を「1」にしようとしたときに、ピボットテーブルを使ってみようと思いました。 ピボットテーブルにてB列の「AA」、C列の「ゼロ」を抽出表示しました。   A  B  C 1 あ  AA  0 5 お  AA  0 思っていたように1行目と5行目が抽出されました。 後はゼロを別の値(仮に「2」とします)に変更するときに、カーソルの移動がうまくいきませんでした。 Range("C1").End(xlDown).Select Do ActiveCell.Offset(0, 0) = "2" ActiveCell.Offset(-1, 0).Select If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop しかし、これではカーソルが「C4」に移動してしまいました。 ピボットテーブルでたたんでしまっても、カーソルは見えないセルに移動するようです。 そこで、下記のように変更しました。 Range("C1").End(xlDown).Select Do ActiveCell.Offset(0, 0) = "2" Application.SendKeys "{UP}" If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop これは、カーソルがまったく動かずに最初の地点にいたままでした。 そこで、次はTABで移動することにしました。 Range("C1").Select Selection.SpecialCells(xlCellTypeVisible).Select Do ActiveCell.Offset(0, 0) = "2" Application.SendKeys "{tab}" If Len(ActiveCell.Offset(0, 0)) = 0 Then Exit Do End If Loop これでもカーソルは動きませんでした。 どうにかしてsendkeysの動かし方、もしくは更新でもっとうまいやり方をご存知の方、是非教えてください。よろしくお願いいたします。

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

Row.hidden で「行が非表示か」をチェックできます。    Do 'ひとつ上の非表示ではないセルを選択   ActiveCell.offset(-1,0).select  Loop While ActiveCell.EntireRow.Hidden あるいは、SendKeysを使う場合「ボタンから実行」します。 VBAエディタ上でF5実行とかすると、エディタに対してキーを投げちゃうので、コードにTABが増えてると思いますよ。

usiushi
質問者

お礼

ap_2さん、コメントありがとうございます。 hiddenは「見せないための関数」と思いきや、「見えない部分の関数」だったのですね。とても驚いています。 頂いた内容をマクロに反映させて無事に作成できました。ありがとうございました。 追伸 sendkeysを実行すると確かにエディタの中が大変なことになりました。何故そこだけエディタに投げてしまうのか??? 不思議だったのですが、すっきりしました。合わせて感謝!!!

関連するQ&A

  • vba  

    VBAはじめたばかりで、躓きました。 下記を実行すると、”Nextに対するForがありません。”とでます。 なぜこうなるのか教えてください。  G2~列2000の間が空白になるまで、  下記の処理を続けるようにしたいと思っています。  Dim i As Integer For i = 7 To 2000 Do If Cells(2, i) = "" Then Range("G2").End(xlToRight).Select ActiveCell.CurrentRegion.Resize(6, 5).Select Selection.Cut Range("B2").End(xlDown).Select ActiveCell.Offset(1).Select ActiveSheet.Paste Exit Do End If Next i Loop  よろしくお願いします。

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • VBA withの使い方

    VBAの参考書で勉強をしていますが、withの使い方で引っかかっているので、どなたかご教授ください。Excel2002 よくある見積書の表で、横方向の掛け算を行方向下に連続して行おうとしています。 C列-数量 D列-単価  E列に、C列の数量×D列の単価 をVBAで行の先頭から下方向に順番に計算する。 その際に、C列の数量のセルが空白だったら何もせず終了という下記のループの方法が 参考書に書いてあります。(セルE14がE列の計算する最初のセル) Range("e14").Select Do Until ActiveCell.Offset(0, -2).Value = "" With ActiveCell .Value = .Offset(0, -2).Value * .Offset(0, -1).Value .Offset(1, 0).Select End With Loop 上記のwithの位置をDo~Loopの外に出して以下のように書き換えたら、 Range("e14").Select With ActiveCell Do Until .Offset(0, -2).Value = "" .Value = .Offset(0, -2).Value * .Offset(0, -1).Value .Offset(1, 0).Select Loop End With 最初のセルE14は正しく計算処理をするが、1つしたのセルにアクティブセルが移動した後、永久ループに入ってしまいます。 「デバック」ボタンをクリックすると[.Offset(1, 0).Select]の行が黄色くなっているのですが、どこに問題があるのかが分からない状態です。 お手数ですが、よろしくお願いします。

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • Excel:VBA-改行して同じ動作を繰り返すには

    VBAで下記の動作を実現させたいのですが、もう一歩のところで上手くいきません。 アドバイスを宜しくお願いします。 ・C列が空欄になるまで、AD列を改行させて同じ作業を繰り返す。 Do Loopステートメントで下記のように作ってみたのですが、"AD2"から"AD3"に改行させることが 出来ないのです。 ------------------------------------ Sub 棚番2() Range("C2").Activate Do Until ActiveCell.Value = "" Range("AD2").FormulaR1C1 = _ "=IF(ISERROR(VLOOKUP(RC[-27],棚番!C2:C3,2,0)),"""",VLOOKUP(RC[-27],棚番!   C2:C3,2,0))" Range("AD2").Copy Range("AD2").PasteSpecial Paste:=xlPasteValues ActiveCell.Offset(1).Activate Loop End Sub --------------------------------- 何卒アドバイスを下さいますよう宜しくお願いいたします。

  • VBA Do Until内で値の貼り付けができない

    Excel2003を使用しております。 コピー&値のペースト作業をやってくれるマクロを作成しております。 具体的には、名簿に公がついていれば、その3つ左の名前をD27へ値のみコピペし、 D27がすでに値があれば、D28に書くことを、D37までループするようにしております。 しかし困ったことに、Do Untilコードを使用しておりますが、このコードではなぜか値の貼り付けが出来なくなります。 Sub Ns公() Dim work As Range Set work = Selection If Selection.Value = "公" Then ActiveCell.Offset(0, -3).Select Selection.Copy Do Until Range("D37").Select Range("D27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop If Range("D36").Value <> "" Then Do Until Range("I37").Select Range("I27").Select If Selection.Value = "" Then Selection.PasteSpecial paste:=xlPasteValues work.Select Else ActiveCell.Offset(1).Select End If Loop work.Select End If work.Select End If work.Select ActiveCell.Offset(1).Select End Sub 原因や対策をご教授いただけるとうれしいです。よろしくお願いします。

  • エクセルで行を非表示にするとアクティブなセルが・・・

    エクセルで行を非表示にするとアクティブなセル?行?がどこかわからなくなり、マクロでアクティブなセルを移動するときにエラーが出ます。 Sub example() ActiveSheet.Range("D3").Select Do Until ActiveCell = 23 If ActiveCell <> "" Then ActiveCell.Offset(1, 0).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -3).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -6).Select Else: ActiveCell.EntireRow.Select Selection.EntireRow.Hidden = True ActiveCell.Offset(0, -6).Select End If Loop End Sub 一番下のActiveCell.Offset(0, -6).Select にエラーが出るのですが、どうすればセルを移動できるでしょうか?

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • VBA 計算結果を数値ではなく、数式で表示したい。

    配合表から配合比率を計算するVBAを組みたいのですが、実際の数値ではなく計算式を表示したいです。 こちらが自分で記入したコードです。 Q列とAA列とAB列をかけて、100で2回割った結果をAC列に表示します。同じ行にすべての数値が記入されないので、AB列からそれぞれ必要な列の数値を取得しています。 Sub 配合比率仮() Dim i As Integer Dim AB Dim Q Dim AA Range("AB3").Select For i = 1 To 500 If ActiveCell.Value = "" Then     '空白の場合下のセルへ ActiveCell.Offset(1, 0).Select Else '配合割合の数値がある場合 AB = ActiveCell.Value         'アクティブセルの数値の取得 Q = ActiveCell.Offset(0, -11).End(xlUp).Value        '重量比率を取得 AA = ActiveCell.Offset(0, -1).End(xlUp).Value        '配合割合の左列を取得 ActiveCell.Offset(0, 1) = s * t / 100 * u / 100       '製品の配合比率を計算(ここを数式にしたいです) ActiveCell.Offset(1, 0).Select       '下のセルへ End If Next i End Sub 上記コードでは数値が表示されます。数式で結果を表示させる方法を教えてください。Formula/FormulaR1C1プロパティを使うと思ったのですが、うまく動くコードが書けませんでした。初心者に毛が生えたようなもので上記コードもなっていないものかとは思うのですが、どうぞお力を貸してください。

専門家に質問してみよう