お忙しいところ大変申し訳ありません、ご回答の程お願い申し上げます。

入力されるデータと列の数は毎回異なり入力された文字自体を修正するVBAを組みたいのですが、検索などで調べた結果「SendKeysステートメント」のコマンド「 SendKeys "{F2}"」というものを発見しました。

それで構文を組んでみたのですが、

Sub Macro1()

Worksheets(1).Activate
Range("A2").Activate
SendKeys "{F2}"

End sub

で単一セルを修正する事はできました。
これを「列(列は毎回固定です)の空白セルまで」というプログラムは組めるのでしょうか?

お忙しい中申し訳ありませんがご回答いただければ幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

これは単一セルだからたまたま実現できたに過ぎません。


範囲内でSendKeys "{F2}"を実行しても入力完了を待ち合わせる事は出来ませんので
各セルに再編集さえできません。

一例ですが、セル選択したら編集モードに変更する事ような事は可能なのでイベント
プロシージャを利用して以下の方法は如何でしょうか。
(1)シートモジュールにしたいのでシートタグ名上で右クリック→コードの表示→以下の
   コードを貼り付けてお試しください。

■サンプルコード
 セル選択でA列範囲、且つセル未入力以外なら該当セルを編集モードに切り替えます。
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("A:A")) Is Nothing _
Or Target = "" Then Exit Sub
SendKeys "{F2}"
End Sub

この回答への補足

お忙しい中ご回答ありがとうございます。 
サンプルコードを使用させていただいたところ、考えていた通りの動きをしてくれました!
本当に凄いです!
補足してもうしわけありませんが、上記のコードをブック(A)から呼び出したブック(B)(つまり他のブックの列に利用できるかどうか)何ですが可能でしょうか?

追加補足で申し訳ありませんがご回答いただければ幸いです。

補足日時:2011/10/25 15:11
    • good
    • 0
この回答へのお礼

お忙しい中本当にご回答の程ありがとうございました。サンプルコードまで提示していただいて期日がせまっている私には嬉しかったです。
ありがとうございます。

お礼日時:2011/10/25 15:15

NO3です。


>他のブックの列に利用できるかどうか
 ⇒個人マクロブックの様な使用は出来無いと思います。
 
    • good
    • 0
この回答へのお礼

そうですか・・ご返信いただきまして嬉しかったです。ありがとうございました。

お礼日時:2011/10/25 16:56

今まで色んなVBAの記事を見ていると、SendKeysは他に方法が無いときに使う手段のようです。


初心者が使うのは適当でないと思う。
(1)1文字だけ置換、決った文字列(数種)だけ置換など、ルール性があるならプログラムで置換を使う
などの方法を考えることでしょう。
ーー
その列のデータ最終行を掴むコードなど、毎日回答にも使われているし、WEBで照会すれば直ぐ出てくる。
こういう方法を勉強しないとVBAなど出来ませんよ。
Googleででも「エクセル データ最終行」
http://www.happy2-island.com/excelsmile/smile03/ …  など
ーー
SendKeys "{F2}"
の件は私が色々やったがうまく行かない(私の力不足だけかもしれないが)
数式バー部に出たデータの任意の位置に(先頭でも)クリックを入れると同等のような動作がVBAでは判らない。
APIとかを使わないとならないのかな。
(よく質問にあるが)初心者の思いつき方法で、解決方法を難しくしてしまっている例かなと思う。
ーー
私が連想した例
セルの値に r が在ればss に変える例。
Sub test02()
d = Worksheets("Sheet1").Range("A65536").End(xlUp).Row '最終行取得
MsgBox d
For i = 2 To d
x = Worksheets("Sheet1").Cells(i, "A")
p = InStr(x, "r")
If p <> 0 Then
Worksheets("Sheet1").Cells(i, "A").Characters(p, 1).Text = "ss"
End If
Next i
End Sub
列データを範囲指定して、For Eachを使う手もある。(自分で操作する場合用か)
他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。
    • good
    • 0
この回答へのお礼

>他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。

たしかにおっしゃるとおりだと思います。予測できない動作をしないようにこれからも勉強したいと思います。
お忙しい中サンプルコードまで提示していただいて本当にありがとうございました。

お礼日時:2011/10/25 15:17

キーボードの[F2]押下ってセルを入力状態にするだけでは?



セルの値を編集するなら、
Sub Macro1()
 Dim xlsSheet As Excel.Worksheet
 Dim xlsRange As Excel.Range
 Dim strTmp As Excel.Range
 Set xlsSheet = Worksheets(1)
 Set xlsRange = xlsSheet.Range("A2")
 MsgBox xlsRange.Value
 xlsRange.Value = xlsRange.Value & "Test"
End Sub
とかでいいのでは?
# SendKeys も Activate もかなり有名な欠点があるけど
# 知った上で使っているんでしょうか。

Sub Macro1()
 Dim xlsSheet As Excel.Worksheet
 Dim xlsRange As Excel.Range
 Dim xlsTargetRange As Excel.Range
 Dim strTmp As Excel.Range
 Dim intColCount As Integer
 Dim intColIndex As Integer
 Set xlsSheet = Worksheets(1)
 Set xlsRange = xlsSheet.Range("A2")
 intColCount = xlsRange.End(xlToRight).Column - xlsRange.Column + 1
 MsgBox xlsRange.End(xlToRight).Address & "まで" & intColCount & "列使ってます。"
 For intColIndex = 0 To intColCount - 1
  Set xlsTargetRange = xlsRange.Offset(0, intColIndex)
  xlsTargetRange.Value = xlsTargetRange.Value & "Test"
 Next
End Sub
End(xlToRight)を使わなくても、セルを1つずつずらしていって
Value で ""(空白)条件に合ったら Exit For するのでもできますよね。
    • good
    • 0
この回答へのお礼

→# SendKeys も Activate もかなり有名な欠点があるけど
 # 知った上で使っているんでしょうか。

その有名な欠点を検索して探してみます。
サンプルコードなどの組み方非常に勉強になりました、お忙しい中提示していただいてありがとうございます。

お礼日時:2011/10/25 15:19

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAで、アクティブなBOOKのファイル名を取得し

エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか?


BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合

大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

Aベストアンサー

拡張子なんでもござれ!
Sub TheBody()
Const xSeparator = "_"
Const xPeriod = "."
Dim KitCut As Variant
KitCut = Split(ActiveWorkbook.Name, xPeriod)
KitCut = Split(KitCut(0), xSeparator)
Range("A1").Value = KitCut(1) & xSeparator & KitCut(2)
Columns("A").AutoFit
End Sub

QACCESS97 VBA のSendKeys

以前Windows2000ProやWindowsXP Pro
ACCESS97のVBAでShell関数を利用し
別のソフトを起動 その後Timerイベントで
SendKeysを実行し別のソフトを操作していました。

しかし最近購入したパソコン(WindowsXP Pro)で
実行したところ別のソフトは起動しますが
Sendkeysの操作が実行されません。

なぜでしょうか?

以前のパソコンと最近購入したパソコンの違いは
以前のパソコンは購入時SP1で
Windows UPdateでSP2にしたこと
セキュリティーソフト(Nortonを使用しています)の
バージョンが異なるぐらいです。
( もちろん起動する別のソフトは、許可にしています)

Sendkeysの操作が実行されるようにする
設定を教えてください。

よろしくお願いします。

Aベストアンサー

SendKeysの処理は、送るタイミングがデリケートで、環境によってはウェイトが必要になります。

まず、AppActivateの二番目の引数を True にして、アクティブになるまで待って下さい。

それでもうまく行かないなら、下記の様にウェイトを入れて下さい。

ウェイトは大きめにしておけば安心ですが、大きすぎるとその分、処理に時間がかかります。

----サンプル----
Private Sub test()
 Dim RtnVal
 
 RtnVal = Shell("notepad.exe", 1)
 wait 0.1
 AppActivate RtnVal, True
 wait 0.1
 SendKeys "12345", True
End Sub

Private Sub wait(sec As Single)
 Dim st As Single
 st = Timer()
 Do Until Timer() > st + sec
  DoEvents
 Loop
End Sub

QExcelVBA:自己のBook名を取得したい

WindowsXP-Proです。
Excelヴァージョンは2003です。

ExcelVBAでコーディングしています。
で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか?

自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。

複数のExcelファイルを、このVBAで操作しているため、
Workbooks("本体のBook名").Activate
を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

Aベストアンサー

Public Sub Auto_Open()
  MsgBox ActiveWorkbook.Name
  MsgBox ThisWorkbook.Name
End Sub

Private Sub Workbook_Open()
  MsgBox Me.Name
End Sub

いずれも、ブック名が表示されました。

QVBAのSendkeysでShift付の文字になる

ExcelのVBAでGOM Playerを動かそうと思っています。
動画の途中から時間指定で再生しようと思っていますが、再生時間を指定するための画面を出す文字コード「G」をSendKeysで送るとなぜかShiftキー付の文字コードが送られてしまっているようです。

GOM Playerでは「G」を押すと「移動先の時間を指定」画面が出るのですが、VBAで「G」を送ると、「Shift+G」で表示される「オーディオキャプチャー設定」画面が出てきてしまいます。

VBAではなく手で「G」キーを押すと何の問題もなく表示されます。

具体的に書きますと
H列のセルを選ぶとH列に書いてある時間(「0:04」など)のところから再生が始まるプログラムになります。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set 指定セル範囲1 = Range("H2:H132")
Set 共有セル範囲1 = Intersect(ActiveCell, 指定セル範囲1)
If Not 共有セル範囲1 Is Nothing Then
Shell "C:\Program Files (x86)\GRETECH\GomPlayer\GOM.EXE", 1
  SendKeys "G"
  SendKeys "00:0" & Cells(Rows.Count, 8).Value
End If
End Sub

「Shell・・」の行はExcelがアクティブの状態からGOM Playerがアクティブの状態にするために入れてあります。

Wait時間を入れてみたり、CRを送ってからGを送ったり
下記のように別のコートで送ってもダメでした。
SendKeys ("G")
SendKeys vbKeyG
SendKeys 71

また「G」だけではなく「P」を送っても「Shift+P」が送られた動作になってしまいます。

すみませんが、お知恵を貸していただけませんでしょうか。
よろしくお願いします。

ExcelのVBAでGOM Playerを動かそうと思っています。
動画の途中から時間指定で再生しようと思っていますが、再生時間を指定するための画面を出す文字コード「G」をSendKeysで送るとなぜかShiftキー付の文字コードが送られてしまっているようです。

GOM Playerでは「G」を押すと「移動先の時間を指定」画面が出るのですが、VBAで「G」を送ると、「Shift+G」で表示される「オーディオキャプチャー設定」画面が出てきてしまいます。

VBAではなく手で「G」キーを押すと何の問題もなく表示されます。

具体的に書き...続きを読む

Aベストアンサー

試してみたところ、GOM Playerでは
 SendKeys "G" → Shift+G
 SendKeys "g" → G
として認識されるようです。

Q他のワークシート名の取得方法 (VBAを使用せずに)

VBAを用いずに、ワークシート関数のみでワークシート名を取得できないか探しています。

自分のシート名は、以下の出力結果の一部より取得することができました。
=CELL("filename")

しかし、他のシート名を取得する方法が思いもつきません。

VBAを用いずにシート名を取得することはできないのでしょうか?

Aベストアンサー

Excel2000でしたら、
1.[挿入]-[名前]-[定義] から、名前を2つ定義します。
  ・名前:PPP  参照範囲:=GET.WORKBOOK(1)
  ・名前:QQQ  参照範囲:=GET.DOCUMENT(88)
2.A1 に =SUBSTITUTE(INDEX(PPP,ROW()),"["&QQQ&"]","") と入力します。
3.A1 を下方にドラッグコピーすると、シート名が一覧で表示されます。

例えば3枚目のシート名のみを取得する場合は、任意のセルに
=SUBSTITUTE(INDEX(PPP,3),"["&QQQ&"]","") と入力します。

※マクロ関数というものですが、最近のバージョンにこれが付帯されているのかどうか
  わかりませんが。   ^_^;

QAccess VBA でのFor_Nextステートメントで使用例の意味が理解できず困っています

Access VBA の勉強を始めて間もないものですが、あるテキストのFor_Nextステートメント使用の一部分の意味がわかりません。教えてください。

Sub ループのネスト()
Dim i As Integer, j As Integer
Dim myStr As String
'九九の結果を表示する
For i = 1 To 9
For j = 1 To 9
myStr = myStr & i * j & " "
Next j
MsgBox myStr, , i & "の段"
myStr = ""
Next i
End Sub
以上の文面で(1)『myStr = myStr & i * j & " "』でmystrにmyStr & i * j & " "を代入する意味だとは理解できますがmystr&を右辺に記載する意味がわかりません。何故必要でしょうか?
(2)『mystr=""』は何故必要なのでしょうか?

Access VBA の勉強を始めて間もないものですが、あるテキストのFor_Nextステートメント使用の一部分の意味がわかりません。教えてください。

Sub ループのネスト()
Dim i As Integer, j As Integer
Dim myStr As String
'九九の結果を表示する
For i = 1 To 9
For j = 1 To 9
myStr = myStr & i * j & " "
Next j
MsgBox myStr, , i & "の段"
myStr = ""
Next i
End Sub
以上の文面で(1)『myStr = myStr & i * j & " "』でmyst...続きを読む

Aベストアンサー

Access VBAとあったのでどんな難しいことかと思ったら
これなら、VB,エクセルVBAでも動くないようだ。
エクセルを持っておれば
標準モジュールに張り付け、実行して
シートを見ると良くわかる。
Sub ループのネスト()
Dim i As Integer, j As Integer
Dim myStr As String
'九九の結果を表示する
For i = 1 To 9
For j = 1 To 9
Cells(i, j + 1) = myStr & i * j & " "
Next j
Cells(i, 1) = myStr & i & "の段"
myStr = ""
Next i
End Sub
&は文字列を結合するもの。
この場合エクセルのセルと違ってMsgboxなので1行で1回の表示にしているので1行分は文字列追加累積しているわけ。
これを使うときはある段階・単位で=””でクリアする。
次の行の文字列を作るに入る前に、前行のものは(同じ変数を使うがため)クリアしなければならない。
i*jは本来文字列の扱いだが、VBでは文字列化しなくても
MsgBoxやエクセルのセル、テキストボックスにセットできる。
>右辺に記載する意味がわかりません
Msgboxやエクセルのセルやテキストボックスにセットするとき
セット・表示する内容は、右辺です。

Access VBAとあったのでどんな難しいことかと思ったら
これなら、VB,エクセルVBAでも動くないようだ。
エクセルを持っておれば
標準モジュールに張り付け、実行して
シートを見ると良くわかる。
Sub ループのネスト()
Dim i As Integer, j As Integer
Dim myStr As String
'九九の結果を表示する
For i = 1 To 9
For j = 1 To 9
Cells(i, j + 1) = myStr & i * j & " "
Next j
Cells(i, 1) = myStr & i & "の段"
myStr = ""
Next i
End Sub
&は文字列を結合するもの。
この場...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qvba Typeステートメント

vbaでTypeステートメントはどういう時に使えばいいのでしょうか?
今までTypeを使わずに問題なくコードを作ってきたのですが
Typeを使いどころがわかりません。

Aベストアンサー

Typeステートメントは、ユーザー定義型変数を宣言する際に使います。

これが無くてもプログラムを組む上で何ら不都合はありませんが、知っておくと、より効率良く、洗練されたコードを書くのに役立ちます。

ある情報を扱うにあたって、その情報に関する属性がたくさんある時に、それらをひとつひとつ別の変数に格納していては、手間が掛かり、効率も悪いですよね。
そこで、大きな分類でひとくくりにして、複数の属性をまとめて面倒みてしまおうというのが、ユーザー定義型変数です。C言語では構造体とも呼ばれます。

例えば、ゲームプログラムでは、敵キャラの属性に関するデータがたくさん必要になる場合があります。名前やレベルやX座標やY座標…といった具合に。これらを、

EnCharaName
EnCharaLv
EnCharaX
EnCharaY

などの変数で個々に管理しても別に問題は無いのですが、より効率良いコーディングを考えるならば、EnCharaでひとくくりにしてしまい、一括管理するほうがスマートです。

Type Prm '宣言
Name As String
Lv As Long
X As Long
Y As Long
End Type '宣言の締め

'サブプロシージャ
Dim EnChara(n) As Prm

With EnChara(n)
.Name = xxx
.Lv = 1
.X =10
.Y =15
End With

という感じにすれば、EnCharaに関する色々な属性を、Withでひとまとめに処理する事が出来、見通しの良いプログラムにすることができます。

小規模で、変数も少ないコードでは、あまり利用価値を実感出来ませんが、内容が大きく複雑になるにつれ、構造体の出番は増えると思います。

Typeステートメントは、ユーザー定義型変数を宣言する際に使います。

これが無くてもプログラムを組む上で何ら不都合はありませんが、知っておくと、より効率良く、洗練されたコードを書くのに役立ちます。

ある情報を扱うにあたって、その情報に関する属性がたくさんある時に、それらをひとつひとつ別の変数に格納していては、手間が掛かり、効率も悪いですよね。
そこで、大きな分類でひとくくりにして、複数の属性をまとめて面倒みてしまおうというのが、ユーザー定義型変数です。C言語では構造体とも...続きを読む

QVBAでアカウント名を取得する方法

VBAで処理したEXCELブックをデスクトップに自動保存しようとしています。VBAで現在作業中のユーザーアカウント名を自動で取得する方法を教えていただきたいのですが。

デスクトップ上にブックを保存するには、パスを記述すればよいのですが、現在PC毎にユーザーアカウントを設定しユーザー名が異なっています。
このため、PC毎にこのユーザー名をデスクトップへのパスに入れ込まなければなりません。毎回キーボードからこのユーザー名を入力する方法もありますが、自動的にユーザー名を取得し、正しいパスを指定する方法を検討しています。
どなたか、VBAでこのユーザー名を取得する方法が有れば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

Environ関数で、環境変数[USERNAME]を取得する。

MsgBox Environ("USERNAME")

QVBAのCallステートメントについて

ExcelのSheet1にCommandButton1(表示)があります。
--------------------------------------------------
Private Sub 表示_Click()
(DBより表示処理)
End Sub
--------------------------------------------------

UserForm1にCommandButton1(登録)があります。
--------------------------------------------------
Private Sub 登録_Click()
(DBへの登録処理)
UserForm1.Hide
Call WorkSheets("Sheet1").表示_Click() ・・・☆
Exit Sub
End Sub
--------------------------------------------------

表記のようなプログラムにしたところ、☆印のところで、
下記エラーが表示されてしまいます。

【エラー】---------------------------------------------------
実行時エラー'91':
オブジェクト変数またはWithブロック変数が設定されていません。
-------------------------------------------------------------

どのようにしたらCallステートメントで表示_Clickを呼び出すことが
できるのでしょうか。

ExcelのSheet1にCommandButton1(表示)があります。
--------------------------------------------------
Private Sub 表示_Click()
(DBより表示処理)
End Sub
--------------------------------------------------

UserForm1にCommandButton1(登録)があります。
--------------------------------------------------
Private Sub 登録_Click()
(DBへの登録処理)
UserForm1.Hide
Call WorkSheets("Sheet1").表示_Click() ・・・☆
Exit Sub
End Sub
----------------...続きを読む

Aベストアンサー

標準モジュールを1つ作って

public sub DB_Syori
(DBより表示処理)
end sub

Private Sub 表示_Click()
'''(DBより表示処理)
call DB_Syori
End Sub


Private Sub 登録_Click()
(DBへの登録処理)
UserForm1.Hide
'''Call WorkSheets("Sheet1").表示_Click() ・・・☆
call DB_Syori
Exit Sub
End Sub

こんな感じで
(DBより表示処理)
を外に移せば動きます。


人気Q&Aランキング

おすすめ情報