プロが教えるわが家の防犯対策術!

excel2007 Winndows2007です。
添付表例、A5セル「客先名:い」を選択しコマンドボタンで「行呼出し」をクリックしたらA5~D5の
セル連動した行のレコードデータをユーザーフォームで呼び出しC5セルの価格20を30に変更入力しユーザーフォームの「更新ボタン」をクリックし更新を終了させたいのです。
本屋で参考書を何冊も読みましたが最終行から1つ下の行に新規入力するというのはありましたが入力済み行をユーザーフォームで呼び出しある箇所を修正し更新するのがなく宜しく御願いします。

「入力済み、選択したセルに連動した行のデー」の質問画像

質問者からの補足コメント

  • 後学の為に教えていただけたらと思うのですが、UserFormはわかりやすい名前に変更していいものと思っていましたがだめなんでしょうか?
    そういう物と覚える物なのでしょうか?

    No.6の回答に寄せられた補足コメントです。 補足日時:2017/03/08 08:04

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

A 回答 (7件)

こんな感じではいかがでしょうか?


--------------------------------------------------------------------------
Sub 行呼出し()
UserForm1.Show
End Sub
--------------------------------------------------------------------------
Private Sub UserForm_Activate()
客先名.Value = Cells(Selection.Row, 1).Value
製品名.Value = Cells(Selection.Row, 2).Value
価格.Value = Cells(Selection.Row, 3).Value
数量.Value = Cells(Selection.Row, 4).Value
End Sub

Private Sub キャンセル_Click()
UserForm1.Hide
End Sub

Private Sub 更新_Click()
Cells(Selection.Row, 1).Value = 客先名.Value
Cells(Selection.Row, 2).Value = 製品名.Value
Cells(Selection.Row, 3).Value = 価格.Value
Cells(Selection.Row, 4).Value = 数量.Value
UserForm1.Hide
End Sub
--------------------------------------------------------------------------
※「Sub 行呼出し()」は「行呼出し」のボタンに登録してください。
※ テキストボックスのオブジェクト名は「客先名」「製品名」「価格」「数量」にしてあります。
※ ボタンのオブジェクト名は「キャンセル」「更新」にしてあります。
※ ユーザーフォームのオブジェクト名は「UserForm1」のままです。
    • good
    • 1
この回答へのお礼

回答有難う御座います。いただいたコード試してみました。
フォームから入力し更新クリックするとセルに反映されるのですが、「行呼出し」ボタンをクリックしても既に入力されているセルの値を呼び出す事が出来ませんでした。

お礼日時:2017/03/06 23:42

補足コメントについて



もちろん変更してもOKです。呼び出すときにそのオブジェクト名で呼び出せば良いだけです。
「入力表」でしたら「UserForm1」を「入力表」に全て変えるだけです。
    • good
    • 1

以下はどこに登録されていますか?


----------------------------------------------------------
Private Sub UserForm_Activate()
客先名.Value = Cells(Selection.Row, 1).Value
製品名.Value = Cells(Selection.Row, 2).Value
価格.Value = Cells(Selection.Row, 3).Value
数量.Value = Cells(Selection.Row, 4).Value
End Sub
----------------------------------------------------------
「キャンセル_Click()」と「Sub 更新_Click()」と同じユーザーフォームのモジュールに書き込まれていないといけないのですが、標準モジュールに書き込まれていたりしませんよね。
この回答への補足あり
    • good
    • 0
この回答へのお礼

表示されるようになりました。
原因は「UserForm」の記述を自分でわかりやすいようにと「入力表」と書き換えていたためでした。
こんな所でつまづくなんて未熟者です。いろいろお手数お掛けして申し訳御座いませんでした。

お礼日時:2017/03/07 22:32

No.4 追補



何らかの方法で「ユーザーフォーム」が先に表示されてしまうがやめ方が判らなくて、いちいち「キャンセル」ボタンを押すのが面倒とか言うことならば「行呼出し」ボタンを押したときに一度閉じるようにしましょうか?以下のように「UserForm1.Hide」を1行足すだけで出来ます。
--------------------------------------------------------------------------
Sub 行呼出し()
UserForm1.Hide
UserForm1.Show
End Sub
--------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

・「行呼出し」ボタンに「行呼出し」マクロはチャント登録されていますか?
 ⇒標準モジュールに登録されています。

・「ユーザーフォーム」が先に表示された状態で「行呼出し」ボタンをクリックしていませんか?
(先に表示されないようにするか「キャンセル」ボタンで一度消してください)
 ⇒先に表示はされてはいません。
  「行呼出し」ボタンクリックしてから「ユーザーフォーム」が表示されますがテキストBoxは空白になっています。そこに入力して「更新」すればセルに表示されます。
しかし別の行のセルを選択しても先程フォームに入力したデータが表示されてしまいます。

お礼日時:2017/03/07 17:03

No.2 へのお礼について



・「行呼出し」ボタンに「行呼出し」マクロはチャント登録されていますか?
・「ユーザーフォーム」が先に表示された状態で「行呼出し」ボタンをクリックしていませんか?
(先に表示されないようにするか「キャンセル」ボタンで一度消してください)
    • good
    • 0

    • good
    • 0
この回答へのお礼

回答有難う御座います。文字の書き込みが数行になりセル幅調整したりも有る為、VBAでやれればと思っています。
動画の回答いただいたのは初めてでわかりやすいですね。

お礼日時:2017/03/06 23:56

「excel2007 Winndows2007」とは「Excel2007 Windows7」でしょうか?


ユーザーフォームにはテキストボックスが4つと「更新ボタン」がとりあえず有るということでしょうか?
    • good
    • 0
この回答へのお礼

有難う御座います。
スペル間違いました「Excel2007 Windows7」です。
ユーザーフォームにはテキストボックスが4つと「更新ボタン」です。今思いましたが「閉じる」ボタンも必要かと。

お礼日時:2017/03/05 23:10

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

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

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

Q欲しいデータの行だけ別ブックに抽出したい

Excel初心者です。
(使用環境:win7 office2010)
膨大なデータから必要行だけを抽出したいのですが、手動で行っているととても時間がかかってしまうので、マクロかもしくは関数で持ってきたいと思っています。

D列に記載されているデータと同じか近いデータを、別ブックのデータベースから行ごと(検索する値によっては複数行だったり1行だったりします。)コピーして、抽出先のブックの最終行に追加していきたいのですが、違う情報がコピーされてきてしまったり、持ってきたデータが上書きされてしまったりとうまくいきません。



りんご町
りんご町1
りんご市
りんご
りんごジュース町
りんごジュース市
りんごケーキ町
りんごケーキ市
みかん町
みかん町2
みかんジュース町

※やりたいこと
・りんごジュース、みかんジュース以外のデータを別ブックのデータベースから抽出したい(りんごやみかんの後ろに付く名称は町や市、数字もしくは何もつかない)
・コピーした行の、下?次?の行にデータを追加していきたい。

うまく説明できず申し訳ありません。
どうかご教授頂けたら幸いです。
よろしくお願いいたします。

Excel初心者です。
(使用環境:win7 office2010)
膨大なデータから必要行だけを抽出したいのですが、手動で行っているととても時間がかかってしまうので、マクロかもしくは関数で持ってきたいと思っています。

D列に記載されているデータと同じか近いデータを、別ブックのデータベースから行ごと(検索する値によっては複数行だったり1行だったりします。)コピーして、抽出先のブックの最終行に追加していきたいのですが、違う情報がコピーされてきてしまったり、持ってきたデータが上書きされてしまった...続きを読む

Aベストアンサー

https://www.youtube.com/watch?v=OSORil3rF9M&index=36&list=PLgDikxs7ej9-KvtnnbmINgyqTzN2y5Iv5

Q再計算の負担度低い関数式

お世話になります。

例題から説明しますと、

J列に「数値、文字列」を入力し、
それがE列からG列の間にある数値、文字列に含まれているかどうかを検索するには、
COUNTIF関数を用いています。

=COUNTIF($E:$G,$J2)

しかし、再計算する上で負担の大きいCOUNTIF関数を用いず、他の関数を用いるとすれば
どんな関数(式)が考えらるでしょうか?

Aベストアンサー

返事ありがとうございます。

#6の補足:
msdnのリンク先
>私のような入門レベルの者にとって、とても難しく、理解するには一苦労ですが、

私もです。合計で5回ぐらい読んで、答えなくてはならなくて、やっと意味が通るようになりました。非常に、わかりにくいです。揮発性とか不揮発性という言葉すら、変な言葉ですからね。不揮発というのは、セルの関数の中に検索データが残るタイプの検索値です。それであれば、負担は大きくないし、COUNTIFも、こちらのタイプです。

別のカテゴリのリンク先の話も同様ですが、かなり難しい内容だと思います。

Qセル内にリストに当てはまる文字列がある場合に文字列の抽出をしたい

A列にデータがあり、D列にリストがあります。
A列のデータには様々な文字列が入っていますが、
D列のリストと一致する文字列があればB列に
その文字列を返したいのですが
色々関数を組み合わせてみたのですが上手くできません。

当てはまる関数を教えてもらえないでしょうか。
ちなみにD列のリストは最大40個程になる予定です。

Aベストアンサー

個人的に配列は極力避けたいので、次のような作業列で説明します。

1行目のE列以降にリストを横に並び替えます。
(邪魔であればもっと右でもいいし、別のシートでもいいです)
例えば、E1にりんご、F1にもも…となります。
E1=INDIRECT("D"&COLUMN()-COLUMN($D1)+1)
これで、E1ならCOLUMN()はEが5番目なので5、COLUMN(D1)はDが4番目なので4、5-4+1=2
D&2なのでD2、INDIRECT(D2)となるので、D2のデータが表示されます。
リストの数(つまり40列?)右にコピーしてください。

まず、りんご(E列)との交点に「その行のデータの中に"りんご"が含まれるかを確認し、含まれているなら"りんご"、含まれてなければ""(空白)」を表示します。
E2=IF(COUNTIF($A2,"*"&E$1&"*")=1,$A2,"")
ただし、この場合A2に「りんご飴」とあっても「りんご」が含まれると判定されますが。
それを避けるのであれば、
E2=IF(ISERROR(FIND(","&E$1",",","&$A2&","))=TRUE(),"",E$1)
これはデータの区切りが","で統一されていること前提ですが、
データの前後及びリストの前後に","を加えることによって、前後が","で区切られた状態で、リストに一致するものの検索を行っています。
FINDを使っての検索になりますので、エラーの場合に空白、該当があれば1行目のデータを表示させるようにしています。
これをデータの数に合わせて下へコピーしてください。

一致するリストが複数あった場合の為に、F列以降は少し式を変形させます。
一致に該当せず、左のセルが空白であったなら空白、空白でなかったならそれと同じデータを表示。
一致に該当し、左のセルが空白であったならリストの内容、空白でなかったならそれと同じデータに","とリストの内容を加える。
とします。なのでデータの全てがリストに一致した場合は、右端のセルはデータと同じものになっています。
一致しなかった場合は空白、一部一致した場合はその一致したデータだけ表示されます。
F2=IF(ISERROR(FIND(","&F$1",",","&$A2&","))=TRUE(),IF(E2="","",E2),IF(E2="",F$1,E2&","&F$1))
これをデータとリストの数だけ下&右にコピーしてください。

40番目の列が何か分からない(数えれば分かりますが…)ので、仮にAZとします。
AZの列には40個のリスト全てにおいて一致した結果が表示されていることになります。
つまり、それをB列に表示させればいいのです。
B2=AZ2
(このAZを該当する最終列の列名に置き換えてください)
これをデータの数だけ下にコピーすれば完了です。

個人的に配列は極力避けたいので、次のような作業列で説明します。

1行目のE列以降にリストを横に並び替えます。
(邪魔であればもっと右でもいいし、別のシートでもいいです)
例えば、E1にりんご、F1にもも…となります。
E1=INDIRECT("D"&COLUMN()-COLUMN($D1)+1)
これで、E1ならCOLUMN()はEが5番目なので5、COLUMN(D1)はDが4番目なので4、5-4+1=2
D&2なのでD2、INDIRECT(D2)となるので、D2のデータが表示されます。
リストの数(つまり40列?)右にコピーしてください。

まず、りんご(E列)との交点に「その行...続きを読む

Q入力フォームで登録した内容を更新したい

タイトルの通り、入力フォーム(UserForm1)を作成してデータベースに
データを登録できるようにしました。


    A        B       C
1  会員番号    名前    クラス
2   0001   佐藤達也    A1
3    0002   鈴木誠     B2

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    A        B       C
1  会員番号    名前    クラス
2   0001   佐藤達也    C3
3    0002   鈴木誠     D6

この場合、新しく変更フォーム(UserForm2)を作成し、
フォーム上にデータを呼び出し、変更したいと考えています。

方法としては
①つは入力フォームと同様の画面設定で全体を呼び出し、打ち込み直して、
同じセルに代入するのが一つかなと思います。
②つ目は変更したい項目のみ呼び出して変更するフォームを作って変更する

できれば、②目つ目が一番良いのですが、フォームを呼び出して変更するような
ものが調べて見ましたが、見つかりませんでした。
どなたか教えて頂けると助かります。よろしくお願い致します。

タイトルの通り、入力フォーム(UserForm1)を作成してデータベースに
データを登録できるようにしました。


    A        B       C
1  会員番号    名前    クラス
2   0001   佐藤達也    A1
3    0002   鈴木誠     B2

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    A        B       C
1  会員番号    名前    クラス
2   0001   佐藤達也    C3
3    0...続きを読む

Aベストアンサー

以下の方法は、昔、人から教わった方法で、ControlSource を使います。以外と便利な方法です。画像をみて、イメージしてください。

'------------------------
Dim rwIdx As Long 'モジュール変数(画面のトップに)
Dim clIdx As Long

Private Sub ComboBox1_Change()
  rwIdx = ComboBox1.ListIndex + 2
End Sub

Private Sub ListBox1_Change()
Dim i As Long
For i = 0 To Me.ListBox1.ListCount
 If Me.ListBox1.Selected(i) Then
  clIdx = i + 1
  Exit For
 End If
Next
End Sub

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'ListBox クリック
 If rwIdx > 0 And clIdx > 0 Then
  TextBox1.ControlSource = Cells(rwIdx, clIdx).Address  'コントロールソース
  ListBox1.ListIndex = -1
 End If
End Sub

Private Sub UserForm_Initialize()
Dim clAry
Me.ListBox1.List = Array("会員番号", "名前", "クラス")
'必要に応じて加えてください。

clAry = Range("A2", Cells(Rows.Count, 1).End(xlUp)).Value
clAry = Application.Transpose(clAry)
Me.ComboBox1.List = clAry
TextBox1.Value = ""
End Sub
'//
細かい部分は、まだ修正が必要かもしれません。

以下の方法は、昔、人から教わった方法で、ControlSource を使います。以外と便利な方法です。画像をみて、イメージしてください。

'------------------------
Dim rwIdx As Long 'モジュール変数(画面のトップに)
Dim clIdx As Long

Private Sub ComboBox1_Change()
  rwIdx = ComboBox1.ListIndex + 2
End Sub

Private Sub ListBox1_Change()
Dim i As Long
For i = 0 To Me.ListBox1.ListCount
 If Me.ListBox1.Selected(i) Then
  clIdx = i + 1
  Exit For
 End If
Next
End Sub

Private Sub Li...続きを読む

Q助けてください!〜特定の文字を含むセルの文字列を抽出する方法

関数初心です。
画像のように、例えば★を含むセルの文字全てを抽出する方法をどなたかご教示いただけませんでしょうか?
もう少し詳しくいうと、A列で★を含むセルの文字である「★バナナ」と「★レモン」を抽出する、という場合です。
どうぞ、よろしくお願いいたします。

Aベストアンサー

B2 に以下を入れます(配列数式なのでCtrl+Shift+Enterで入力)
=IFERROR(INDEX($A$2:$A$7,SMALL(IF(LEFT($A$2:$A$7,1)="★",ROW($A$2:$A$7),10000),ROW(A2)-1)-1),"")

あとは下へ向けてフィルドラッグです。

Q年月日の分離

年月日の分離
Excelで、2016/1/20 を年月日に分けて表示したく、
2016、1、20と表示させることできました。
しかし、データそのものは3つとも、2016/1/20のままです。
データを3つに分ける方法ありませんか。
値複写では、2016/1/20のままです。
left、mid、right関数は思いつきました。
しかし、これでは1桁、2桁ある月日の「場合分け」がありそうで面倒です。
確定申告の医療費の集計で、全件不可の通知があり、この問題と解釈しました。
なお、環境はWin10、Excel2013です。

Aベストアンサー

year,month,day,それぞれに関数をつけてググれば
いっぱい出ます。

QExcelで日数を計算したい。

はじめまして。Excelを使用している中でどうしてもわからない事があり今回質問させていただきます。「どこから」+「どこまで」の日数を合わせての計算式を出したいんですけどこの計算ってExcelどうやるんですか?佐川急便の検索ツールのやつですがこのように検出したいのでやり方を教えてくれる方いませんか?

Aベストアンサー

僕も無意味に結合セルを使うのはお勧めしません。

それ以前に最終形態へのビジョンはありますか?
今5*5で25(北海道のせいで図は20だけど)マスですよね。
これ47*47ですよ。2200超えマス。

まずそれだけの個々の日数を調べるの?驚異的じゃありません?
(ま、実は多少の軽減策もなくはないですが。)

次に結合をすすめない理由の一番は、これは見せる部分じゃなく
参照するデータだってことです。
そしたらこれが縦横47に広がったときを想像してみてください。
無駄に行を使わず詰まっている方が全体が見やすいのは自明でしょ?
例えば、今の5:6行はセル結合などせずに縦書きにしたら横幅が
うんと狭く出来て、端まで見るとき横スクロールが激減させられます。

データとしてのメンテナンス性が第一なんです。

参照で関数とかを使うときに結合セルで構成されていると
そもそも空白交じりのデータになるから、うっかり誤動作の
恐れが高くなるんです。例えば一つ下のを見るとき2を足さないと
いけないとか、参照するのにいちいちそんな面倒な事しなきゃいけない
なんて効率悪すぎます。

あとこの表は参照するテーブルになるので名前定義を
マスターしておくと、別シートでもあるから
式がうんと楽になります。

僕も無意味に結合セルを使うのはお勧めしません。

それ以前に最終形態へのビジョンはありますか?
今5*5で25(北海道のせいで図は20だけど)マスですよね。
これ47*47ですよ。2200超えマス。

まずそれだけの個々の日数を調べるの?驚異的じゃありません?
(ま、実は多少の軽減策もなくはないですが。)

次に結合をすすめない理由の一番は、これは見せる部分じゃなく
参照するデータだってことです。
そしたらこれが縦横47に広がったときを想像してみてください。
無駄に行を使わず詰まっている方が全体が見や...続きを読む

Q【至急】エクセルで複数のファイルから文字列を検索、行全てを抽出する

お助けください。
当方Excel初心者です。表などは作成したことがあるものの、マクロや関数にはうといです。
仕事の関係で、複数のExcelファイルから、文字列を検索して、その文字列が含まれる行を他のファイルに抽出したいのですが、調べてみてもなかなかうまくいきませんでした。

例えば
A    B      C
商品名  商品コード 価格
だいこん 000000  100
きゅうり 111111  50
にんじん 222222  50
レタス  333333  100

などが入っているシートがたくさんあり、それがショップごとにファイル分けされています。
それらのファイルは同一のフォルダ内にあり、その中からたとえば「きゅうり」と検索したら、
AからCまでのデータが抽出できるようにしたいのです。

色々調べてみて、検索した言葉のセルだけは抽出できたのですが、
行全体までは抽出できませんでした。
どなたかお知恵を拝借させてください。

作業環境 Windows7
使用Excel 2013


ちなみにセルのみ抽出できたコードは以下になります。

Sub Search()
Dim WS As Worksheet
Dim myfolder As String
Dim Str As String
Dim a As Single
Dim sht As Worksheet

Set WS = Sheets.Add

With Application.FileDialog(msoFileDialogFolderPicker)
.Show
myfolder = .SelectedItems(1) & "\"
End With

Str = Application.InputBox(prompt:="検索文字列:", Title:="今指定したフォルダにある全Excelファイルを検索します", Type:=2)

If Str = "False" Then Exit Sub
If Str = "" Then Exit Sub

WS.Range("A1") = "検索文字列:"
WS.Range("B1") = Str
WS.Range("A2") = "パス:"
WS.Range("B2") = myfolder
WS.Range("A3") = "ファイル名"
WS.Range("B3") = "シート名"
WS.Range("C3") = "検索結果"

a = 0

Application.ScreenUpdating = False

Value = Dir(myfolder)
Do Until Value = ""
If Value = "." Or Value = ".." Then
Else
If Right(Value, 3) = "xls" Or Right(Value, 4) = "xlsx" Or Right(Value, 4) = "xlsm" Then
On Error Resume Next
Workbooks.Open Filename:=myfolder & Value, Password:="zzzzzzzzzzzz"
If Err.Number > 0 Then
WS.Range("A4").Offset(a, 0).Value = Value
WS.Range("B4").Offset(a, 0).Value = "Password protected"
a = a + 1
Else
On Error GoTo 0
For Each sht In ActiveWorkbook.Worksheets

'セルの文字列に完全マッチしたいならxlWholeを使う。部分マッチしたいならxlPartを使う。
' Set c = sht.Cells.Find(Str, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
Set c = sht.Cells.Find(Str, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not c Is Nothing Then
firstAddress = c.Address
Do
WS.Range("A4").Offset(a, 0).Value = Value
WS.Range("B4").Offset(a, 0).Value = sht.Name
WS.Range("C4").Offset(a, 0).Value = c.Value
a = a + 1
Set c = sht.Cells.FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
Next sht
End If
Workbooks(Value).Close False
On Error GoTo 0
End If
End If
Value = Dir
Loop

Application.ScreenUpdating = True

Cells.EntireColumn.AutoFit
End Sub

お助けください。
当方Excel初心者です。表などは作成したことがあるものの、マクロや関数にはうといです。
仕事の関係で、複数のExcelファイルから、文字列を検索して、その文字列が含まれる行を他のファイルに抽出したいのですが、調べてみてもなかなかうまくいきませんでした。

例えば
A    B      C
商品名  商品コード 価格
だいこん 000000  100
きゅうり 111111  50
にんじん 222222  50
レタス  333333  100

などが入っているシートがたくさんあり、それがショッ...続きを読む

Aベストアンサー

こんにちは。

初心者にしては、ずいぶん込み入ったものをお作りなりますね。
お世辞抜きで、初心者でしたら出来過ぎです。
内容もよくできているように思いますが、ただ、今の時点では解決できない問題も含まれていますので、なかなか厄介です。

また、初心者として名乗れる間に、初歩的な部分は直しておいたほうがよいことがあります。特に、Value はプロパティ名ですから、それでエラーにはならないにしても、使い勝手がよくありません。また、Str というのは、UserFormのTextBox に使う関数名です。VB.Net では自由ですが、VBAは、VB6のDNAがあるので、あまり良くありません。カウンター変数は、「i」から始まるとか……。

変数は、ある程度の決まりがありますから、それを逸脱すると、あとでややこしいことになります。(必ずしも、私が守っているとは言い切れませんが、ちゃんとした変数の付け方をしている人はエラーの度合いも少ないです。)

参考は、Excel大辞典 (ただし以下の内容は、古いですから、全部を真似ることはありません。理由を述べると長くなりますが、MS社では、この書き方を現在は推進していません。)
http://home.att.ne.jp/zeta/gen/excel/c04p15.htm

私が書き直してみましたが、以下には、はっきりとした欠陥がひとつあります。パスワードエラーを認めていません。パスワード付きとパスワードなしのブックのみで、そもそもオープン時のエラーを対処するコードを今の時点では思いつかなかったのです。すべてに同じパスワードが入っている場合は、問題がありません。したがって、ファイルオープン時のエラーについては、記録することができません。


'///
Option Explicit
Const MPSWD As String = "ZZZZ" 'パスワードはコードの外に置きます
Sub SeartchingWordsPrc()
 Dim wb As Workbook
 Dim myFolder As String
 Dim strTxt As String
 Dim i As Long, c As Variant
 Dim sh As Worksheet
 Dim mySh As Worksheet
 Dim Fname As Variant
 Dim FirstAddress As String
 
 Set mySh = Worksheets.Add(After:=Worksheets(ThisWorkbook.Worksheets.Count))
 ''Set mySh = ThisWorkbook.ActiveSheet 'アクティブシートの場合
 With Application.FileDialog(msoFileDialogFolderPicker)
  If .Show Then
   myFolder = .SelectedItems(1) & "\"
  End If
 End With
 If Trim(myFolder) = "" Then Exit Sub
 strTxt = Application.InputBox(prompt:="検索文字列:", Title:="今指定したフォルダにある全Excelファイルを検索します", Type:=2)
 If strTxt = "False" Or strTxt = "" Then Exit Sub
 
 With mySh 'ここはまとめました*
  .Range("A1").Resize(, 2).Value = Array("検索文字列:", strTxt)
  .Range("A2").Resize(, 2).Value = Array("パス:", myFolder)
  .Range("A3").Resize(, 3).Value = Array("ファイル名:", "シート名:", "検索結果")
 End With
 
 i = 4 '初期行設定
 On Error GoTo errHandler
 
 Application.ScreenUpdating = False
 ''----Start -----
 Fname = Dir(myFolder & "*.xls?", vbNormal)
 
 Do Until Fname = ""
  If Fname <> "." And Fname <> ".." Then
   Application.DisplayAlerts = False
   Set wb = Workbooks.Open(myFolder & Fname, , Password:="", WriteResPassword:="")
   Application.DisplayAlerts = True
   If wb Is Nothing Then
    With mySh 'ここが生きていません。*
     .Cells(i, "A").Value = Fname
     .Cells(i, "B").Value = "Password protected"
     i = i + 1
    End With
    Else
    For Each sh In wb.Worksheets
     With sh
      'セルの文字列に完全マッチしたいなら
      'xlWholeを使う。部分マッチしたいならxlPartを使う。
      '現在は、部分マッチで、ワイルドカードにしています。*
      Set c = .UsedRange.Find(strTxt & "*", _
      LookIn:=xlValues, _
      LookAt:=xlWhole, _
      SearchOrder:=xlByRows, _
      SearchDirection:=xlNext)
      
      If Not c Is Nothing Then
       FirstAddress = c.Address
       Do
        With mySh
         .Cells(i, "A").Value = Fname
         .Cells(i, "B").Value = sh.Name
         .Cells(i, "C").Value = c.Value
        End With
        i = i + 1
        Set c = sh.UsedRange.FindNext(c)
       Loop While Not c Is Nothing And c.Address <> FirstAddress
      End If
     End With
    Next sh
   End If
   DoEvents
   wb.Close False
   Set wb = Nothing
   Beep
  End If
  Fname = Dir
 Loop
 Application.ScreenUpdating = True
 mySh.Cells.EntireColumn.AutoFit
 Exit Sub
errHandler: '*
 If Err.Number = 1004 Then
  Application.DisplayAlerts = False
  On Error Resume Next
  Set wb = Workbooks.Open(myFolder & Fname, , Password:=MPSWD, WriteResPassword:=MPSWD)
  On Error GoTo 0
  Application.DisplayAlerts = True
  Resume Next
 End If
End Sub

こんにちは。

初心者にしては、ずいぶん込み入ったものをお作りなりますね。
お世辞抜きで、初心者でしたら出来過ぎです。
内容もよくできているように思いますが、ただ、今の時点では解決できない問題も含まれていますので、なかなか厄介です。

また、初心者として名乗れる間に、初歩的な部分は直しておいたほうがよいことがあります。特に、Value はプロパティ名ですから、それでエラーにはならないにしても、使い勝手がよくありません。また、Str というのは、UserFormのTextBox に使う関数名です。VB.Net で...続きを読む

Qエクセルにて2つの列の組み合わせが正しくないものだけ抽出したい

表題の件ですが、
現在エクセルの2つのシートに2列のデータがあります。


シート1
A列 B列
AAAAAA   001
BBBBBB 002
CCCCCC 003
DDDDDD 004
シート2
A列 B列
AAAAAA  001
BBBBBB 002
CCCCCC 003
DDDDDD 005

この2つを比較し、組み合わせが違うものだけを抽出したいのですが、
どのような関数を使えばよいでしょうか。
どなたかご教示お願いいたします。

Aベストアンサー

No.2です。

>シート2の方は部署と承認者番号の組み合わせが違うものがあるので、
>それを抽出したいのです。

Sheet2のデータを抽出すればよいのですね?
どこに抽出したいのか書いてないので、Sheet3に抽出するようにしてみました。

やり方は前回と一緒です。
↓の画像のようにSheet2に作業用の列を設けています。
作業列C2セルに
=IF(OR(COUNTBLANK(A2:B2),COUNTIFS(Sheet1!A:A,A2,Sheet1!B:B,B2)),"",ROW())
という数式を入れフィルハンドルでこれ以上データはない!という位まで下へコピーしておきます。

Sheet3のA2セルに
=IFERROR(INDEX(Sheet2!A:A,SMALL(Sheet2!$C:$C,ROW(A1))),"")
という数式を入れフィルハンドルで列・行方向にコピーすると
画像のような感じになります。m(_ _)m

Qエクセルvba 一つ上の行を指定した回数分コピーする。

教えて下さい。vba初心者です。

A B C D E F G H
7 522 加藤 沖縄 みかん 縄 1 1/5 空欄
8 123 吉田 愛媛 りんご 水 3 2/10 空欄

1️⃣一番最後に入力した行をすぐ下にコピーしたい。(ここでは7行目…入力して行くと行は増えます。)
2️⃣指定回数はE列。

この列ではE列が3回になりますので、
コピーしたい範囲はA〜G列を、すぐ下の8行〜9行までの2回分コピーしたいです。

完成希望例
A B C D E F G H
7 522 加藤 沖縄 みかん 縄 1 1/5 空欄
8 123 吉田 愛媛 りんご 水 3 2/10 空欄
9 123 吉田 愛媛 りんご 水 3 2/10 空欄
10 123 吉田 愛媛 りんご 水 3 2/10 空欄

にしたいです。

教えて下さい。vba初心者です。

A B C D E F G H
7 522 加藤 沖縄 みかん 縄 1 1/5 空欄
8 123 吉田 愛媛 りんご 水 3 2/10 空欄

1️⃣一番最後に入力した行をすぐ下にコピーしたい。(ここでは7行目…入力して行くと行は増えます。)
2️⃣指定回数はE列。

この列ではE列が3回になりますので、
コピーしたい範囲はA〜G列を、すぐ下の8行〜9行までの2回分コピーしたいです。

完成希望例
A B C D E F G H
...続きを読む

Aベストアンサー

前の絵のリスト範囲の所、名前定義も使えますよ。
というか、数式を入れるところの右のボタンみたいのを
押すと、入力する代わりにマウスで別シートでも
ドラッグで範囲指定できるから、範囲指定とぴったり
合致すれば、勝手に名前に変換されるみたいだった。
名前で指定の時、先頭に=はつけないみたいです。

ボタンはどっちをお使いですか?
呼び出している subの名前で判ります。
Private Sub CommandButton1_Click()
と決まっているのがActiveXの方です。


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

人気Q&Aランキング