人に聞けない痔の悩み、これでスッキリ >>

Excel VB (Excel 2007) の質問

Sheet1のセルD1、D2、D3に文字が入力されています。
そして同じシート上の任意の場所にテキストボックスが配置されています。
テキストボックスには"テキスト ボックス 1"、"テキスト ボックス 2"、"テキスト ボックス 3"と名前がつけられています。

セルD1の値を"テキスト ボックス 1"に複写、セルD2の値を"テキスト ボックス 2"に、セルD3の値を"テキスト ボックス 3"に
複写したいのですがどのようにすればいいのでしょうか。

インターネットのQ&Aで調べましたが同じような質問でも難しすぎて理解できません。
例えば以下のように簡単にできないでしょうか。
D1の値を"テキスト ボックス 1"に複写する場合

Range("D1").Select
Selection.Copy
ActiveSheet.Text."テキスト ボックス 1".Activate  'テキストボックスを選択(アクティブ)する記述が解りません。
ActiveSheet.Paste                 ’選択したテキストボックスに貼り付ける方法もわかりません。

勿論上記の記述ではうまくいきません。
VB初心者でお手数をおかけしますがよろしくお願いします。

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

A 回答 (3件)

テキストボックスにセルの値を入れるのだけならマクロは必要はありません。


 
【操作手順】
 ・テキストボックスス「テキスト ボックス 1」を選択する。
 ・数式バーで「=D1」を入力して【Enter】キーを押す。

  以上を"テキスト ボックス 2"、"テキスト ボックス 3"を同様に行う。

ネットでも色々説明しています。以下は手順を絵的に説明しています。
http://www.bayclotho.jp/blog/archives/907
    • good
    • 0
この回答へのお礼

早速の回答有難うございました。
こんなに簡単にできるとは驚きました。

お礼日時:2011/05/02 23:01

>テキスト ボックス 1"に複写


ここに、質問者が、エクセルのことがよく判ってない点が在るようだ。
テキストボックス=テキストの値だけを保持できる。リッチテキストのテキストボックスなんていうのもあるが、別として。
一方
エクセルのセル=セルの値、表示形式、文字色などの書式、コメント、関数式、など重畳的な仕組みになっている。このことが理解できてないのでは。
そして複写というのは後者を総体的に移すことをねっらって言う言葉。
だから本件では代入というべきなんだ。
ーーー
一部の図形で数式バー部に=A1などと入れて図形のテキストに出来るものもあるが、その話ではなかろう。
普通には、エクセルVBAでは
Sub test01()
Worksheets("Sheet1").TextBox1 = Range("A1")
End Sub
を実行する。
エクセルVBAでは2つあって、上記はシートにテキストボックスを貼り付けた場合である。
Worksheets("Sheet1").を忘れるな。
もうひとつはユーザーフォーム上にテキストボックスを貼り付ける場合で
Private Sub UserForm_Click()
UserForm1.TextBox1 = Range("A1")
End Sub
このイベントは不自然ともいえるが。
この2つの区別の質問者には出来てないのでは。
ーーー
それとテキストボックスの値をテキストボックスの入力分から拾うキッカケは、コマンドボタンのクリックなどでとらざるを得ない
入力キーストローク中もテキストに出していく考えもあろうが。
Private Sub CommandButton1_Click()
UserForm1.TextBox1 = Range("A1")
End Sub
シート上にコマンドボタンがあるなら、Sheet1のシートモジュールに
Private Sub CommandButton1_Click()
Worksheets("Sheet1").TextBox1 = Range("A1")
End Sub
こう言うことも質問には書いてない。情況の説明(特にイベントとの絡み)が全的になされていない。
ーー
まだまだエクセルとVBAを経験する必要がありそう。
ーー
どちらかというと、シートのセルの値をテキストボックスに持っていく場合は、頻用されないと思うが、どういった使い方なのかな。
逆のためのコントロールで使われるのが多いと思うので。またテキストボックスはシートのセルで代用することも出来なくは無いから。
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございました。
勉強不足であることが良くわかりました。
もっとVBの勉強をします。

お礼日時:2011/05/02 22:48

コピー&ペーストではなく、「値の代入」と考えればよいのではないでしょうか。



Me.[テキスト ボックス 1] = Me.Range("D1").Value
Me.[テキスト ボックス 2] = Me.Range("D2").Value
Me.[テキスト ボックス 3] = Me.Range("D3").Value
    • good
    • 0
この回答へのお礼

こんなに早く回答をいただきありがとうございました。
丁寧な回答で問題は解決しました。

お礼日時:2011/05/02 23:03

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

Q[エクセルVBA]セルの値をテキストボックスに表示

よろしくお願いします。

ユーザーフォームを使って作業しています。
その中で、コンボボックス1で指定した名前を検索値として、VLOOKUPを使ってあるシート(例:シート名「時間検索」)からセルの値をテキストボックスに表示させるようにしたいのです。

コードを作成し表示させることはできたのですが、セルに入っている値の書式が「[h]:mm」の時間形式(例:19:00)のためか、セルの値を引っ張ると小数点(例:0.79166....)で表示されます。

色々と調べてみた中で、format関数を使ったりしてみたんですが不首尾に終わっています。

なんとかテキストボックスに、セルと同じ形式で表示したいのですが、どのように考えればよろしいでしょうか?
ご教示お願いいたします。

質問の仕方が悪かった場合は補足・訂正させていただきますので、どうぞよろしくお願いします。

Aベストアンサー

方法1
textbox1 = format(application.vlookup(combobox1, worksheets("シート名").range("検索対象範囲"),列,false), "[h]:mm")


方法2
dim r as long
r = application.match(combobox1, worksheets("シート名").range("左端列:列"), 0)  ’★
textbox1 = worksheets("シート名").cells(r, "欲しい列番号").text

★言わずもがなですが
 range("A:A")のように列:列指定して検索すれば直接の行番号が取得できる
 range("A4:A10")のように範囲指定したときは,勿論その先頭セルからの移動量が取得される


方法3
dim h as range
set h = worksheets("シート名").range("左端列").find(what:=combobox1, lookin:=xlvalues, lookat:=xlwhole)
if not h is nothing then
textbox1 = h.offset(0, 列数).text
end if




#各方法共通:
Comboboxの値は「文字列」なので,シート上の「数値」を検索する場合は変換が必要です

方法1
textbox1 = format(application.vlookup(combobox1, worksheets("シート名").range("検索対象範囲"),列,false), "[h]:mm")


方法2
dim r as long
r = application.match(combobox1, worksheets("シート名").range("左端列:列"), 0)  ’★
textbox1 = worksheets("シート名").cells(r, "欲しい列番号").text

★言わずもがなですが
 range("A:A")のように列:列指定して検索すれば直接の行番号が取得できる
 range("A4:A10")のように範囲指定したときは,勿論その先頭セルからの移動量が取得される


方...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QエクセルVBAで、テキストボックスにセルの値を入れる

宜しくお願いします。

エクセルデータの各項目を、すでに書式(表)が印刷された用紙のそれぞれの項目の位置に印刷させたいのですが・・・

各項目には、500行ぐらいのデータがあり、別のワークシートの表示させたい位置(すでに印刷された用紙にあわせてある)に各項目ごとのテキストボックスを作っておいて、そのテキストボックスに各項目のデータを1行ごとに表示させて、テキストボックスのフォント調整、印刷 ~を繰り返したいのですが、どのようなコードを書けばよいのでしょうか?

進め方としては、データシートからテキストボックスに各項目のデータが表示されたら、シート上でテキストボックスのフォントや位置の微調整が出来るようにしておいて、印刷ボタンをクリックすると印刷され、次へのボタンをクリックすると、次の行のデータがテキストボックスに表示されるようにしたい。

※印刷する場合は、テキストボックス内の文字のみ印刷(シートには印刷したくない文字書きたいので・・・)

また、そのフォームには、パターンが5つあって、データには1行ごとにパターン番号が入力されているとして、それぞれのパターンにあわせたテキストボックスの配置してあるシートへ行くようにもしたい。

データの入れ替わりが多いので、別のワークブックと繋がるような仕組みにしておいて、テキストボックスの配置してあるブック側から、データのあるブックを呼びに行ってデータを取りに行くようにしておきたい。

以上、条件が多くてすみませんが、VBAは初心者で、ほんの部分的にしかまだ分かりません。どなたか詳しい方宜しくお願いします。

宜しくお願いします。

エクセルデータの各項目を、すでに書式(表)が印刷された用紙のそれぞれの項目の位置に印刷させたいのですが・・・

各項目には、500行ぐらいのデータがあり、別のワークシートの表示させたい位置(すでに印刷された用紙にあわせてある)に各項目ごとのテキストボックスを作っておいて、そのテキストボックスに各項目のデータを1行ごとに表示させて、テキストボックスのフォント調整、印刷 ~を繰り返したいのですが、どのようなコードを書けばよいのでしょうか?

進め方としては...続きを読む

Aベストアンサー

前回の解答はプレビューで確認し、プレビュー画面の印刷ボタンを押せば印刷しますが、プレビュー画面を表示しないで直接印刷する場合は、単票印刷の書式覚えておく必要があります。
下記の修正は、印刷時にどのパターンの単票が必要かを知らせます。メッセージ表示のタイミングは、特定の印刷パターンを指定した時は印刷時最初のみ、全パターン指定時は各データ印刷毎です。特定の印刷パターンを指定すれば用紙をまとめてセットできるので実務的と思われます。

●**** 追加 **** と書いた範囲を追加、**** 修正 **** の1行を修正
Public Sub page_Print(sPatt, iPatt As Integer) '**** 修正 ****
'**** 追加 **** ↓
Dim myMsg As String 'メセージ
If iPatt = 0 Then
myMsg = (Worksheets("Sheet1").Range("B5") - 1) & " 行目" & vbLf
myMsg = myMsg & "印刷パターン " & StrConv(sPatt, vbWide) & " を印刷します。" & vbLf
myMsg = myMsg & "  用紙をセットしてください。" & vbLf & vbLf
myMsg = myMsg & "(印刷しない場合はキャンセルを押します。)" & vbLf & vbLf
If MsgBox(myMsg, vbOKCancel) = vbCancel Then
Exit Sub
End If
End If
'**** 追加 **** ↑

Range("Print_Area").Select: Selection.Font.ColorIndex = 2
ActiveWindow.SelectedSheets.PrintPreview 'PrintOut
Selection.Font.ColorIndex = xlAutomatic
Range("Print_Area").Cells(1, 1).Select

End Sub

●**** 追加 **** と書いた範囲を追加、**** 修正 **** の1行を修正
Public Sub job_Print() '指定して連続印刷

Application.ScreenUpdating = False
'**** 追加 **** ↓
If prtPattern <> 0 Then
myMsg = "印刷パターン " & StrConv(prtPattern, vbWide) & " を印刷します。" & vbLf
myMsg = myMsg & "  用紙を複数枚セットしてください。"
MsgBox myMsg, vbOKOnly
End If
'**** 追加 **** ↑
For rowCot = startRow To endRow '連続ページ印刷
Tensou rowCot, prtPattern
If prtPattern = 0 Or (prtPattern = shtPatt) Then '印刷パターンを判定
page_Print shtPatt, prtPattern '**** 修正 ****
End If
Next
Application.ScreenUpdating = True
Worksheets("Sheet7").Activate
End Sub

●**** 修正 ****の1行を修正(5シート同様に修正)
Private Sub CommandButton2_Click() 'シート単位の1ページ印刷ボタン
page_Print Right(ActiveSheet.Name, 1), 0 '**** 修正 ****
End Sub

前回の解答はプレビューで確認し、プレビュー画面の印刷ボタンを押せば印刷しますが、プレビュー画面を表示しないで直接印刷する場合は、単票印刷の書式覚えておく必要があります。
下記の修正は、印刷時にどのパターンの単票が必要かを知らせます。メッセージ表示のタイミングは、特定の印刷パターンを指定した時は印刷時最初のみ、全パターン指定時は各データ印刷毎です。特定の印刷パターンを指定すれば用紙をまとめてセットできるので実務的と思われます。

●**** 追加 **** と書いた範囲を追加、**** 修...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qユーザーフォームの入力をシートに反映

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついたのが、「ひとつ下のセルに記述する」ということでした。
で、本を見ながら考えたのが、
With Sheets(2)
Range("A1").Select
ActiveCell.Offset(1, 0).Value = TextBox1.Text
ActiveCell.Offset(1, 0).Value = TextBox2.Text
ActiveCell.Offset(1, 0).Value = TextBox3.Text
まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

(2)フォームOKボタンを押して、上記の処理をしても、フォームに記入したものが次にフォームを開いた時に消えていないように、
Me.Hide
End Sub
で終わらせたのですが、次に開いても残っていません。

無知でお恥ずかしいですが、宜しく御願い致します。

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついた...続きを読む

Aベストアンサー

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(2).Range("A1")
    .Offset(1, 0).Value = TextBox1.Text
これでSheet2のA2から書き出すはずです。(未確認です)

>で終わらせたのですが、次に開いても残っていません。
『残っていない』のではなく、最初にデザインした状態が再度表示されているわけです。

残すためには、プロパティ『ControlSource』にセルを指定する必要があります。
または、下の例示のように『Initializeイベント』で値を取得する必要があるでしょう。



質問では、オプションボタンやテキストボックスが沢山あるみたいですが、一括で処理する例です。

オプションボタン1~80の値をA1~A80に、
テキストボックス1~80の値をB1~B80に 書き込んでいます。

説明を簡略化するために、オプションボタン等の番号と書き出すセルの行番号を一致させています。

終了後、最後フォームを開いた時に書き込んだ値を取得するために、『Unload』で終わり、
『UserForm_Initialize』で取り込んでいます。コード表現は書き込みと逆ですね。


'Sheet2へ書き込む
Private Sub CommandButton1_Click()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を書き出し
    For i = 1 To 80
      .Range("A" & i) = UserForm1.Controls("OptionButton" & i).Value
    Next
    'テキストボックスの値を書き出し
    For i = 1 To 80
      .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text
    Next
  End With
End Sub


'Formを呼び出したとき、Sheet2から読み込む
Private Sub UserForm_Initialize()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を読み込み
    For i = 1 To 80
      UserForm1.Controls("OptionButton" & i).Value = .Range("A" & i)
    Next
    'テキストボックスの値を読み込み
    For i = 1 To 80
      UserForm1.Controls("TextBox" & i).Text = .Range("B" & i)
    Next
  End With
End Sub


'終了ボタン
Private Sub CommandButton2_Click()
  Unload Me
End Sub

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(...続きを読む

QVBAのテキストボックスに文字列を貼り付ける方法

こんにちは
エクセルのVBAのユーザーフォーム上に作ったテキストボックスに
他でコピーした文字列(または数値)を貼り付け(ペースト)たいのですが、
テキストボックスのプロパティの項目のどれかを設定すれば可能でしょうか?
現状ではここで、右クリック自体できなくなっています。
使っているのはエクセル2000です。

Aベストアンサー

こんばんは。

ちょっと気になったことなので、もしかしたら私の間違いかもしれませんが、#3 のご紹介になつている k窓の kClipboardPaste関数は、Userform上では、Excelの通常のClipBoard ダイアログとは違うものを使っているので、うまくいかないのではないかと思います。

早い話は、やはり、Ctrl + V ですが、以下のようにすれば、右クリックで貼り付けは利きます。ただし、TextBox のプロパティのMultiline をTrue にしておかないと、改行マークが出てきてしまいます。


Private Sub TextBox1_MouseUp(ByVal Button As Integer, _
     ByVal Shift As Integer, _
     ByVal X As Single, _
     ByVal Y As Single)
  Application.EnableEvents = False
 If Button = 2 Then
  Application.SendKeys "^v"
 End If
 Application.EnableEvents = True
End Sub

こんばんは。

ちょっと気になったことなので、もしかしたら私の間違いかもしれませんが、#3 のご紹介になつている k窓の kClipboardPaste関数は、Userform上では、Excelの通常のClipBoard ダイアログとは違うものを使っているので、うまくいかないのではないかと思います。

早い話は、やはり、Ctrl + V ですが、以下のようにすれば、右クリックで貼り付けは利きます。ただし、TextBox のプロパティのMultiline をTrue にしておかないと、改行マークが出てきてしまいます。


Private Sub TextBox1_Mouse...続きを読む

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング