• ベストアンサー

エクセルで自動入力をマクロで・・・(No.1798323の応用編)

応用が効かなくて申し訳ありません。 1798323で素敵なご回答をいただいたのですが、 状況が進展して変わってくるとVBAの書き換えがわからなくなりました。もう一度教えてください。 ※変更点は、入力元がAI列、『入力先をQ~V列に限定』したい点です。   Q    R    S    T   U V・・ AI 1 田中 鈴木 佐藤          山田 2 鈴木 山田              海岡 3 田中 佐藤              佐藤 というような表があり、T1に「山田」、S2「海岡」と、その行に関してAI列に新規の名前が入力されたときに自動入力することをVBAでどのように書けばよいのか、ご教授お願いいたします。 尚、3行目には「佐藤」さんがすでいるので入力不要です。 よろしくお願いします。

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

  • ベストアンサー
  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.13

No.11です。 > 重複チェック時のメッセージボックスが不要である場合、‥ 単にメッセージを出さないようにする、っていうことですよね? てっとり早いのは、 MsgBox myName & "さんは入力済ですよ!", vbInformation   ↓ Exit Sub に変えてください。 重複している場合は何もしないで処理を抜ける( Exit Sub ) ということです。 '---------------------- If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), myName) > 0 Then   Exit Sub '---------------------- ★ ただし↑だけでは、 名前を上書きしようと思って 「3中田」 のように入力したけれど、中田さんはすでに入力済みの場合、入力元には 「3中田」 と数字が残ったままになります。 この数字を消して 「中田」 とだけにしたいなら、 '---------------------- If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), myName) > 0 Then   If myChgFlag Then     Application.EnableEvents = False     .Value = myName     Application.EnableEvents = True   End If '---------------------- としてください。この場合、Exit Sub は不要です。 ◆ ついでと言ってはナンですが‥ '---名前上書きのエラーチェック の下に myChgFlag = False myErrFlag = False の 2行がありますよね。 この 2行は不要といえば不要なんですが、入れるとしたらココではなく、 コードの 14行目 If Not IsNumeric(Left(.Value, 1)) Then の前でした。 '---------------------- myChgFlag = False myErrFlag = False If Not IsNumeric(Left(.Value, 1)) Then   myName = .Value '---------------------- に変更してください。

yastaro
質問者

お礼

ありがとうございます。超初心者にこんなに懇切丁寧にご指導いただきましたことを感激しています。実際、VBAの可能性とsiotan99さんの力量に驚いています。感謝のことばしかありません。本当にありがとうございました。

その他の回答 (12)

  • kamejiro
  • ベストアンサー率28% (136/479)
回答No.12

#7です。日数が経ちましたが…。 yastaroさん、最初の頃からみると、かなりの追加仕様ですね。私も頭が悩みます。(若くないので頭の柔軟性がありません。) >入力元がAI,AQ,AY・・・、入力先は変わらずQ~Vといった具合…。 この場合、#7でのプログラムはそのままで、Sheet2を    A        B 1 入力元列番号  35   …AI列 2 入力元開始行  1 3 入力元終了行  13   …1行目から13行目 4 入力先開始列  17 5 入力先終了列  22   …Q列からV列 のように入力し実行します。 入力元をAQ列に換えるときは、B1のセルを「35」から「43」に換えて実行します。 入力元をAY列に換えるときは、B1のセルを「43」から「47」に換えて実行します。 それにしても、shiotan99さん。丁寧な回答には大変参考になります…。入力誤りを訂正するといった応用って…、整合性の取れたロジックを考えつくなんて…。

yastaro
質問者

お礼

kamejiroさん、ありがとうございます。そうか!入力元のセル番号をマクロを使って順次変えていけばいいということですね。わかりました。ありがとうございます。職場での要望の変化の対応するという事情もありましたが、”追加仕様”にとことんお付き合いくださいましたことに心より感謝申し上げます。

  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.11

No.10です。何度もスミマセン。 No.10 はちょっとあわてていて、一通りの動作確認だけで送信してしまいました。 いまあらためてコードを見直すとそのあまりの稚拙さに絶句です。 とりあえず Exit Sub が多すぎ‥ ほとんど代わり映えはしませんが、↓の方で試してみてください。 動作的には No.10と何も変わりません。 ◆ No.10に同じく、名前を上書きしたい場合は 「1中田」 とか 「3中田」 のように、《一桁の数字+名前》でお願いします( 修正可能なのは直前入力のみ )。 '------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)   Dim i As Integer, ret As Integer   Dim myName As String, myChgFlag As Boolean, myErrFlag As Boolean   Static myLastCell As String, myLastRow As Long   '---入力先(変更の場合↓を修正)   Const startCol As Integer = 17   Const endCol As Integer = 22   With Target     '---入力元(変更の場合↓を修正)     Select Case .Column       Case 35, 43, 51       Case Else         Exit Sub     End Select     If .Row < 5 Or .Count > 1 Then Exit Sub     If .Value = "" Then Exit Sub     If Not IsNumeric(Left(.Value, 1)) Then       myName = .Value     Else       '---名前上書きのエラーチェック       myChgFlag = False       myErrFlag = False       If Len(.Value) = 1 Then         myErrFlag = True         MsgBox "数字のあとに変更したい名前を入力してください!", vbExclamation       ElseIf myLastCell = "" Then         myErrFlag = True         MsgBox "前回入力情報がありません。直接変更してください。", vbInformation       ElseIf myLastRow <> .Row Then         myErrFlag = True         MsgBox "前回入力とは別の行に入力されています。" _           & vbNewLine & "名前を変更する場合、先ほどと同じ行に入力してください。", vbInformation       End If       If myErrFlag Then         Exit Sub       Else         myChgFlag = True         myName = LTrim(Mid(.Value, 2))       End If     End If     '---重複チェック     If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), myName) > 0 Then       MsgBox myName & "さんは入力済ですよ!", vbInformation     '---直前入力の変更     ElseIf myChgFlag Then       ret = MsgBox("入力済の「" & Range(myLastCell).Value _         & "」さんを「" & myName & "」さんに変更します。" _         & vbNewLine & vbNewLine & "よろしいですか?", vbQuestion + vbOKCancel)       If ret = vbOK Then         Application.EnableEvents = False         Range(myLastCell).Value = myName         .Value = myName         Application.EnableEvents = True       End If     '---入力件数オーバー     ElseIf WorksheetFunction.CountBlank(Range(Cells(.Row, startCol), Cells(.Row, endCol))) = 0 Then       MsgBox "この行にはこれ以上入力できません!", vbInformation     Else       For i = startCol To endCol         If Cells(.Row, i).Value = "" Then           Application.EnableEvents = False           Cells(.Row, i).Value = .Value           Application.EnableEvents = True           myLastCell = Cells(.Row, i).Address           myLastRow = .Row           Exit For         End If       Next i     End If   End With End Sub '-------------------------------------------------------

yastaro
質問者

補足

shiotan99さん、本当に本当にありがとうございます。すばらしいものができました。 今度こそ最後にもう一つだけ教えてください。 いかにも超素人らしい質問ですが、 重複チェック時のメッセージボックスが不要である場合、「'---重複チェック IfWorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), myName) > 0 Then MsgBox myName & "さんは入力済ですよ!", vbInformation」を削除したらよいかと思い、やってみたところ、不具合を起こすようです。せっかく素敵なメッセージを作っていただいたのですが、作業現場としてはそこまではいいよということでした。(登録先に入力できているとわかっていても入力元のほうでは入力するケースがあるとのことです)申し訳ありません。これにて最後の質問です。よろしくお願いいたします。

  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.10

No.3 & No.8です。 > 入力先の「田中」(誤)の上に「中田」(正)を > 上書きということまでは難しいでしょうか? 単に 「中田」 と入力しただけでは、フツーに入力したいのか上書きしたいのか判断できませんよね。 これは上書きだよ~、とわかるものが名前の前にでも入力されていればできると思います。 何か記号を入力すればいいのですが、特定の記号だと何を入力するのか覚えていられるかちょっと不安です。 ★ で、名前の前に何でもいいので数字を入力すれば、これは上書きしてね、というサインだということにしてみました。 上書きしたい場合は、「1中田」 とか 「3中田」 というように入力する、ということです。( 一桁の数字です! ) ↓な感じです( 直前に入力したものしか変更できません )。 '----------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)   Dim i As Integer   Dim ret As Integer   Dim myName As String   Dim myFlag As Boolean   Static myLastCell As String   Static myLastRow As Long   '入力先(変更の場合↓を修正)   Const startCol As Integer = 17   Const endCol As Integer = 22   With Target     '入力元(変更の場合↓を修正)     Select Case .Column       Case 35, 43, 51       Case Else         Exit Sub     End Select     If .Row < 5 Or .Count > 1 Then Exit Sub     If .Value = "" Then Exit Sub     '名前の前が数字?     myFlag = False     If Not IsNumeric(Left(.Value, 1)) Then       myName = .Value     Else       If Len(.Value) = 1 Then         MsgBox "数字のあとに変更したい名前を入力してください!", vbExclamation         Exit Sub       End If       If myLastCell = "" Then         MsgBox "前回入力情報がありませんので変更できません!", vbInformation         Exit Sub       End If       If myLastRow <> .Row Then         MsgBox "現在位置が、前回入力した行番号とちがうので変更できません!", vbExclamation         Exit Sub       End If       myFlag = True       myName = LTrim(Mid(.Value, 2))     End If     If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), myName) > 0 Then       MsgBox myName & "さんは入力済ですよ!", vbInformation       Exit Sub     End If     '名前上書き     If myFlag Then       ret = MsgBox("入力済の「" & Range(myLastCell).Value _         & "」さんを「" & myName & "」さんに変更します。" _         & vbNewLine & vbNewLine & "よろしいですか?", vbQuestion + vbOKCancel)       If ret = vbOK Then         Application.EnableEvents = False         Range(myLastCell).Value = myName         .Value = myName         Application.EnableEvents = True       End If       Exit Sub     End If     If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), "") = 0 Then       MsgBox "この行にはこれ以上入力できません!", vbInformation     Else       For i = startCol To endCol         If Cells(.Row, i).Value = "" Then           Application.EnableEvents = False           Cells(.Row, i).Value = .Value           Application.EnableEvents = True           myLastCell = Cells(.Row, i).Address           myLastRow = .Row           Exit For         End If       Next i     End If   End With End Sub '------------------------------------------

yastaro
質問者

お礼

shiotan99さん、ありがとうございます。ネットが職場でしかつながっていなくって、御礼が遅くなって申し訳ありません。今から確認してみます。取りいそぎ心からの感謝をと思います。まさかできるとは!VBAはすばらしいものですね。それ以上にshiotan99さんの構築力、すばらしいです。確認後No.12のお礼欄で改めて御礼申し上げます。他業務で遅くなるかもしれませんが・・・

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんばんは。Wendy02です。 もう、余計な口出しになると思いますので、コードの公開は控えますが、ちょっと、関わったので、一応書いておきます。 >このようなケースで入力先の「田中」(誤)の上に「中田」(正)を上書きということまでは難しいでしょうか? Static変数 にして、プロシージャの最後に、Targetのアドレスを確保すればよいのではありませんか? 後は、文字列の前に、プレフィックスでもつけて、例えば「!」などを付けて、通常入力とは分岐させて、修正用入力として、2文字目からを、前のセルに飛ばせば出来ますね。 ---------------------------------- (Off Topic は削除される可能性があるのですが) >今回はポイントごめんなさい 人によりけりだと思いますが、ポイントよりも、質問者さんの心のこもったお礼の一言のほうが大きいものなのです。点数は心には残りませんが、丁寧なお礼は心に残ります。次の回答の励みになります。

yastaro
質問者

お礼

Wendy02さん、いつもありがとうございます。職場でしかネットがなくて御礼がおそくなり申し訳ありません。Wendy02さんのコメントの方こそ、私の心に潤いをいただきました。ありがとうございます。ご指導内容については、私が初心者であることからも今は理解できていませんが、がんばって勉強してみますね。今後もよろしくお願いします。

  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.8

No.3です。 いつの間にかずいぶんにぎやかになっていますね。 > たとえば、z列まで拡張したいときは、 > 8行目の「For i = 17 To 22」をさわればいいのですね? そうです。Z列の列番号は 26ですから For i = 17 To 26 としてください。 > AI,AQ,AY・・・といくつか入力元を持ちたいのです。 AI列の列番号が 35ですから、 If .Column <> 35 Then Exit Sub とすれば、AI列以外はここで処理を終了します。 AQ列、AY列も入力元にするなら、AND演算子でつなげてやってください。 列番号は、AQ列が 43、AY列が 51ですから、 If .Column <> 35 And .Column <> 43 And .Column <> 51 Then Exit Sub となります。 または、 Select Case .Column   Case 35, 43, 51   Case Else     Exit Sub End Select としてもかまいません。入力元の列番号を Case 35, 43, 51 のようにカンマをつけて列挙してください。 列番号がわからなければ、その列のどのセルでもいいので =COLUMN() と入力すればわかります。 整理すると、最初の部分は↓な感じです( AI列、AQ列、AY列が入力元の場合 )。 '----------------------------------------- Dim i As Integer With Target   '入力元   Select Case .Column     Case 35, 43, 51     Case Else       Exit Sub   End Select   If .Row < 5 Or .Count > 1 Then Exit Sub   If .Value = "" Then Exit Sub '----------------------------------------- ◆ ついでに、No.3 をちょっと変更してみました( 入力元…AI列、AQ列、AY列です )。 ↓の場合、入力先を拡張するときは、3行目の Const endCol As Integer = 22 の 22が V列の列番号ですから、これを修正してください。 '------------------------------------------ Private Sub Worksheet_Change(ByVal Target As Range)   Dim i As Integer   '入力先(変更の場合↓を修正)   Const startCol As Integer = 17   Const endCol As Integer = 22   With Target     '入力元(変更の場合↓を修正)     Select Case .Column       Case 35, 43, 51       Case Else         Exit Sub     End Select     If .Row < 5 Or .Count > 1 Then Exit Sub     If .Value = "" Then Exit Sub     If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), "") = 0 Then Exit Sub     If WorksheetFunction.CountIf(Range(Cells(.Row, startCol), Cells(.Row, endCol)), .Value) > 0 Then Exit Sub     For i = startCol To endCol       If Cells(.Row, i).Value = "" Then         Application.EnableEvents = False         Cells(.Row, i).Value = .Value         Application.EnableEvents = True         Exit For       End If     Next i   End With End Sub '--------------------------------------------

yastaro
質問者

補足

shiotan99さん、懇切丁寧なご回答、解説をありがとうございます。確認できました。ほぼ理想通りです。本当に感謝いたします。shiotan99さんのご回答を待ってよかったです^^ もう一点だけご質問をすることをお許しください。AI5に「田中」(誤)と入力(Entaer)して、あっ!間違えたということで「中田」(正)を入力しなおすと、入力先に「田中」残り、その次の列に「中田」が入ります。このようなケースで入力先の「田中」(誤)の上に「中田」(正)を上書きということまでは難しいでしょうか?

  • kamejiro
  • ベストアンサー率28% (136/479)
回答No.7

kamejiroです。 入力元列と入力先列に自由度を持たせたいのであれば、 入力元列 何行目から何行目か 入力先列 何列目から何列目か こちらを別のシート(例えば、Sheet2)に値を入れてこちらを参照しながら動作するようにしてみてはいかがでしょうか。 Sheet2を次のように入力しておきます。 (例1)    A      B 1 入力元列番号  27   …AA列 2 入力元開始行  1 3 入力元終了行  10   …1行目から10行目 4 入力先開始列  1 5 入力先終了列  26   …A列からZ列 (例2)    A      B 1 入力元列番号  35   …AI列 2 入力元開始行  1 3 入力元終了行  13   …1行目から13行目 4 入力先開始列  17 5 入力先終了列  22   …Q列からV列 VBAは、 Sub テスト() i = Worksheets("Sheet2").Cells(2, 2) Do Until i = Worksheets("Sheet2").Cells(3, 2)   j = Worksheets("Sheet2").Cells(4, 2)   flg = ""   Do Until flg = "END"     If j = Worksheets("Sheet2").Cells(5, 2) Then       flg = "END"     End If     If Cells(i, j) = Cells(i, Worksheets("Sheet2").Cells(1, 2)) Then       flg = "END"     End If     If Cells(i, j) = "" Then       Cells(i, j) = Cells(i, Worksheets("Sheet2").Cells(1, 2))       flg = "END"     End If     j = j + 1   Loop   i = i + 1 Loop End Sub と書き換えてみてはいかがでしょうか。 ※継ぎ接ぎの即席VBAゆえ、見づらいかもしれませんが…。

yastaro
質問者

補足

kamejiroさん、深夜のご回答を感謝いたします。私の理解不足だけなのかもしれませんが、質問をお許しください。《入力先は一定で、『入力元』を複数同時にもちたい》ケースでの書き方が尚、わかりません。もしよろしければご指導お願いします。例えば、入力元がAI,AQ,AY・・・、入力先は変わらずQ~Vといった具合です。よろしくお願いいたします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

Wendy02です。なぜ、違っているのか、理由がわからなかったので、もう一度、ご質問自体を読み直してみました。 「AI列に新規の名前が入力されたときに自動入力すること」ということをキーワードにして考えてみました。 私は、「初めに、入力した文字ありき」という解釈でしたから。 もし、そういう条件だとしたら、以下のようなマクロでよいかと思います。 ・特定の範囲に、文字があるなしに問わず、左詰で入力をしていく。 ・特定の範囲に対して、重複を許さない ・特定の範囲を越えたら、入力させない。 まあ、これでダメなら、深追いしないほうがよいかもしれませんね。(^^; 以下は、ごちゃごちゃしているように見えるかもしれませんが、Visual Basic Editor に貼り付ければ見えます。 なお、これも、特定の範囲の中で、セルが空いている場合は、そこを左を優先に詰めます。なお、以下のコードは、かなりに特殊な部類のものになります。オーソドックスとは言えません。 '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)   Dim myCol As Integer   '==================================   '設定項目(入力開始+ 設定範囲)   Const IMPUT_ROW As Integer = 5 '行   Const IMPUT_COLUMN As Integer = 35 'AI列   '---------------------------------   Const LEFT_COLUMN As Integer = 17 '左列   Const RIGHT_COLUMN As Integer = 22 '右列   '==================================   With Target   If .Column <> IMPUT_COLUMN Or .Row < IMPUT_ROW Then Exit Sub   If .Count > 1 Then Exit Sub    On Error Resume Next    If WorksheetFunction.CountIf(Range(Cells(.Row, LEFT_COLUMN), Cells(.Row, RIGHT_COLUMN)), .Value) > 0 Then Exit Sub    If WorksheetFunction.CountBlank(Range(Cells(.Row, LEFT_COLUMN), Cells(.Row, RIGHT_COLUMN))) = 0 Then MsgBox "その範囲は、一杯です。", vbInformation: Exit Sub    myCol = Evaluate("MATCH(TRUE," & Range(Cells(.Row, LEFT_COLUMN), Cells(.Row, RIGHT_COLUMN)).Address & "="""",0)")    If Err.Number > 0 Then Exit Sub    On Error GoTo 0    Application.EnableEvents = False    Cells(.Row, LEFT_COLUMN + myCol - 1).Value = .Value    Application.EnableEvents = True   End With End Sub '--------------------------------------------------- .

yastaro
質問者

お礼

たびたび失礼します。質問を読み直してまで再度ご返答いただき、あらためて心より感謝いたします。私の質問がわかりにくかったのですね。ごめなさい。 さっきのお礼もこちらの欄に書くべきでした。またの機会にもこれに懲りずにご指導ください。ありがとうございました。^^

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

P列にはいつもデータがあるとします。 Q-W列について左に詰めて追加します。質問に対し、Y列にデータを入れることに変えてます。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 24 Then 'Y列について値変化 r = Target.Row If Application.WorksheetFunction.CountIf(Range("Q" & r & ":W" & r), Target) = 0 Then Range("w" & r).End(xlToLeft).Offset(0, 1) = Target End If End If End Sub 短いことを趣旨にしてますが、普通には動きますが特殊ケースでは ボロがでるかもしれません。

yastaro
質問者

お礼

ご回答ありがとうございます。imogasiさんは、エクセルに関するご回答をいつもなさってますね^^実は私もそのご回答で勉強させていただいています。また、よろしくお願いします。(今回は、ポイントなくてごめんなさい<(_ _)>)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3さんへ Wendy02です。こちらのコードを、念のため、Watch 式 を取って見ましたが、値は正しくとれているようですが・・・。 >No.1さんのだと、Q列からV列に何も入力されていないような場合うまくいかないと思います。 If (.End(xlToLeft).Column < 17 Or .End(xlToLeft).Column >= 22) Then Exit Sub このように、除外条件を作っていますね。 つまり、35=AI列以下で、何も入っていない場合は、.End(xlToLeft).Column =1 になります。また、V列以降に入っている場合は、22 以上になりますから、除外されます。 >重複チェックもちょっとちがうような‥ End プロパティで、ActiveCell や Target(セル)が移動するわけではありません。論理的ワークシートのセルの上を走るだけです。SelectやActivate で初めて移動します。 '  AI列以下の最も右の列の値 と AI列の値 If .End(xlToLeft).Value <> .Value Then ' 見つかった場所から、セル1つ左に、Target(AI列の値)を代入する  .End(xlToLeft).Offset(, 1).Value = .Value ということです。 イベント・ドリブン型マクロの、ChangeやSelectionChangeイベントは、かなり重い部類に入りますから、なるべく簡易な方法で、そのプロシージャ内の停留時間を減らすのがよいと思います。WorksheetFunction を使った、他の手がないわけではないのですが、私としては、ご質問者のトラブルが、何が原因なのははっきりしませんが、この件はこのぐらいにしておきます。

yastaro
質問者

お礼

Wendy02さん、いつもありがとうございます。質問に対する真摯な態度で取り組んでご回答くださることに感謝いたします。マクロ確認してみました。ありがとうございます。今回はポイントごめんなさい<(_ _)> またご指導お願いいたします。

  • shiotan99
  • ベストアンサー率68% (140/203)
回答No.3

こんにちは~ Q列からV列がすべてうまっている状態で、AI列に別の名前を入力した場合はどうするのでしょうか? それは考慮しなくてもよければ、以下のコードを試してみてください。 該当シートのシート見出しを右クリックして 「コードの表示」 '------------------------------------------------------------ Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Integer With Target If .Column <> 35 Or .Row < 5 Then Exit Sub If .Count > 1 Then Exit Sub If .Value = "" Then Exit Sub Application.EnableEvents = False For i = 17 To 22 If Cells(.Row, i).Value = .Value Then Exit For Else If Cells(.Row, i).Value = "" Then Cells(.Row, i).Value = .Value Exit For End If End If Next i Application.EnableEvents = True End With End Sub '----------------------------------------------------------- No.1さんのだと、Q列からV列に何も入力されていないような場合うまくいかないと思います。 あと、重複チェックもちょっとちがうような‥ かんちがいでしたらゴメンナサイ。

yastaro
質問者

補足

shiotan99さん、ありがとうございました。完璧です。 Q~Vの6件を越えることはないと仕事で使う現場からの要望でしたが、増やしたいとき、たとえば、z列まで拡張したいときは、8行目の「For i = 17 To 22」をさわればいいのですね? もうひとつ、追加質問事項をお世話いただけるでしょうか?入力元をAIだけでなく、ほかにもいくつか設定したいのです。たとえばAI,AQ,AY・・・といくつか入力元を持ちたいのです。入力先はQ~Vで変更ありません。よろしくご指導お願いいたします。楽しみにお待ち申し上げています。

関連するQ&A

  • エクセルで、次のような自動入力をしたい

      A    B    C    D   E  ・・ AA 1 田中 鈴木 佐藤          山田 2 鈴木 山田              海岡 3 田中 佐藤              佐藤 というような表があり、AAの列に名前を入力したとき、 D1に「山田」、C2「海岡」と、その行に関してAA列に新規の名前が入力されたときにD1,C2に自動入力することは、VBAで簡単にできますか? 3列目には「佐藤」さんがすでいるので入力不要です。 よろしくお願いします。(マクロ初心者です)

  • excelオートフィルタの検索条件をセルに入力したい

    以下のようなexcelのリストがあるとします。     A       B    C~ 1 佐藤・鈴木  Aタイプ 2 田中・山田  Bタイプ 3  佐藤     Aタイプ 4  田中     Cタイプ 5 山田・鈴木  Cタイプ A列の"田"が含まれる行を抽出したい場合 オートフィルタをかけ、オプションの抽出条件の指定で "田"を含む、で検索すれば良い、というのはわかります。 ですが、この動作をもうちょっと簡単にできないかと思っています。 具体的には、以下のようにセルに入力して検索・抽出するとはできないでしょうか。     A       B    C~ 1   田 2 3 4   A       B    C~ 6 田中・山田  Bタイプ 8  田中     Cタイプ 9 山田・鈴木  Cタイプ (1、2行目=検索用 3行目=空き 4行目以降=リスト) 過去の質問で、同じようにセルに入力して抽出する方法を 聞いていた方がいらっしゃったので参考にしようと思ったのですが 方法がVBAを使ったもので、VBAの知識がまったく無いために さっぱり理解することができませんでした。 何か良い方法がありましたら教えていただけないでしょうか。

  • セルに入力があったら別のシートに自動で入力させたい

    似たような質問もあり自分でもいろいろ調べたのですが、 解決できなかったのでお願いします。 エクセルは2011で少し使える程度、あまり詳しくはありません。 シート1に「名前」「一回目」「二回目」という列があります。 そこの「一回目」の列に入力があった場合のみ別のシート2に自動で入力(抽出)されるようにしたいです。 例としてはこんなかんじです。↓ シート1 名前  一回目  二回目 佐藤  1         山田       1    鈴木       1 田中  2           とあったら、「一回目」に入力があった行からシート2に シート2 名前  点数 佐藤  50 田中  100 こんなかんじでシート2には「名前」と「一回目」に入力された数値に50掛けたものが自動で表示されるようにしたいのですが、 このようなことは可能でしょうか? 説明がわかりにくいかも知れませんがよろしくお願いします。

  • エクセルのセルに入力した名前を数値化

    どなたかご教授頂ければ幸いです。 エクセルの文字列(一覧表)に 田中 田中 鈴木 鈴木 佐藤 田中 田中 佐藤 佐藤 鈴木 佐藤 佐藤 と入力されているものを 集計表に 田中・・・4 鈴木・・・3 佐藤・・・5 とし、集計したいのですが、 名前を数値に読み替える方法がわかりません。 良い方法があればお教えください。 部下の月次訪問件数を容易に集計する方法を模索中です。 余計な入力を部下にさせたくないので、プルダウンで自身の 名前を選ぶだけで入力を完了とし、別の場所に作った 集計表に数値(件数)となって落ちていくものを作りたいと考えています。 よろしくお願いします。

  • EXCELマクロVBAについて

    Excel2007、XPを使用しています。 AからE列に下記のような情報が入力されています。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/10 11111 / 田中 / 東京都 / 00000000000 / 2012/08/09 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/11 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 A列のIDでくくったとして、 E列の注文日が最大のみの行を表示させたいです。 A / B / C / D / E ID / 名前 / 住所 / 電話 / 注文日 11111 / 田中 / 東京都 / 00000000000 / 2012/08/18 11112 / 佐藤 / 京都府 / 00000000000 / 2012/08/10 11113 / 鈴木 / 北海道 / 00000000000 / 2012/08/15 このようなことはマクロで可能なのでしょうか? 恐れ入りますがご教授お願い致します。

  • EXCELの関数またはマクロ教えてください。

    こんばんは。 よろしくお願いいたします。 EXCEL2000です。 (1)こんな縦に重複した名前の表を、 名前 コード 内訳名 金額 鈴木  1   飴   \100 鈴木  2    ガム  \150 鈴木  4    米   \1,000 鈴木  6    食器  \500 佐藤  1    飴   \100 佐藤  2    ガム  \200 佐藤  3    パン  \300 田中  1    米   \1,300 田中  2    ガム  \200 田中  4    米   \1,300 田中  6    食器  \600 (2)横に一人一レコードにまとめたいのです。  列の項目が内訳名になり増ますよね。 名前  飴    ガム  パン    米    食器 鈴木  \100   \150  \1,000  \500 佐藤  \100   \200  \300 田中  \1,300  \200       \1,300   \600 (3)欲を言えば、飴とガムは合計したいです。これが最終形態です。 名前 お菓子 パン   米  食器 鈴木 \250  \1,000 \500 佐藤 \300  \300 田中 \1,500 \1,300    \600 せめて(1)から(2)にする方法で何かよい関数などないでしょうか。 でなくても、「はじめからこんなマクロ・VBAでこんなのできるよ。」 なんてのがあれば、モジュールで教えてください。 本当に本当によろしくお願いいたします。 このデータは後、300くらいあります。 私のレベルは、MOS上級取得なので、多少理解力はあるかと思います。 というか、必死で頑張りますのでお願いします。m(__)m

  • エクセルのマクロでセルに入力されているセル番地に貼り付け?

    エクセルのマクロで質問です。 下記のように入力されています   A    B    C    D 1 あ   田中  2000  N3   2 い   中嶋  1500  Q3 3 う   吉田  1600  U3 4 え   石川  1800  N11 5 お   横山  1500  Q11 6 か   鈴木  1600  U11 7 き   中村  2500  N19 8 く   山田  1200  Q19 9 け   橋本  1400  U19 ・・・・(500行くらいあります) この表のA1:C1をN3に行列を入換えて貼り付け、 A2:C2をQ3に行列を入換えて貼り付け・・・ のように、ABC列の内容を、D列に入力されているセル番地に貼り付けたいのです。 INDIRECT関数など使ってみましたが、どうにも出来そうにありません。 これをなんとかマクロで出来ないものでしょうか。 困ってます。お願いします。

  • エクセルのデータ並べ替え(抽出)の方法

    エクセルのデータ並べ替え(抽出)の方法 を教えてください。 下記のようなデータがあるとします。   A    B    C   D 1 田中  東京  千葉  福岡 2 山田  京都  滋賀 3 佐藤  奈良  青森  USA 4 鈴木  カナダ 愛媛 A列は名前、B列以降は文字列です。B列以降はC列までの行、D列までの行とさまざまです。重複セルはありません。 これを下記のように並べ替えたいです。   A    B    C   D 1東京  田中 2千葉  田中 3福岡  田中 4京都  山田 5滋賀  山田 6奈良  佐藤 7青森  佐藤 8USA   佐藤 9カナダ 鈴木 10愛媛  鈴木 こういうことは可能でしょうか??? 教えてください。 よろしくお願いします。

  • 同じ組合せが何組みか

    エクセル2003を使っています。 エクセルで作ったスケジュール表があります。 B列に日付、G列にスケジュールの予定が入力されており、I列にその予定を行う者の氏名が入力されております。 例えば、  B列   G列   I列 2009/2/1  採点   山田 2009/2/1  採点   佐藤 2009/2/1  年休   鈴木 2009/2/1  外出   田中 2009/2/1  採点   斉藤 2009/2/2  採点   佐藤 2009/2/2  年休   山田 2009/2/2  採点   斉藤 このエクセルを使って、「採点」を行った同じ組合せが何組あったかを調べたいと思います。 例えば、斉藤・田中・鈴木の組合せが何組あるか、○○・△△の組合せが何組あるかを調べたいと思っています。 手段はVBAでも良いです。 よろしくお願いします。

  • エクセルのマクロについて

    パソコン初心者です。 たとえば シート1のA1に「田中」と入力する。 ボタンを押すとシート2のA1に「田中」と表示される。 次にシート1のA2に「山田」と入力する。 ボタンを押すとシート2のA1に「山田」と表示される。 次にシート1のA3に「鈴木」と入力する。 ボタンを押すとシート2のA1に「鈴木」と表示される。 このようにマクロを組むにはどのようにしたらよいのでしょうか? わかりにくくてすいません。

専門家に質問してみよう