エクセルVBAで別シートへ情報を加工して移したい

このQ&Aのポイント
  • エクセルVBAを使用してAのシートからBのシートへ、特定の情報を抜き出して一覧表に加工したいです。
  • 現在、AのシートからBのシートへの情報の移動はできていますが、加工やクリアの処理について困っています。
  • Aシートには届いたメールの本文が入力されるため、その情報をBシートに加工して貼り付けたいです。
回答を見る
  • ベストアンサー

エクセルVBAで別シートへ情報を加工して移したい

すみません、本当に困ってます。 皆様お忙しいとは存じますが、何卒お力添え頂けませんでしょうか。 エクセルVBAは完全に素人です。 AのシートからBのシートへ欲しい情報だけを抜き出して 一覧表にしていきたいのですが、できないでいます。 いろいろ調べながら現在、AのシートからBのシートへ 情報を移動させ、最後にAのシートをクリアするとこまでできたのですが、 そこから行き詰りました。 やり方としては、Aシートが入力シートとなっています。 Aシートには、届いたメール本文をテキストでそのままペーストします。 そうしますと、AシートのA列には、 ***************** ご利用ID   :99 営業形態   :店舗 事業所名   :サンプル所 ***************** という文字列が入ります。 このAシートに入った情報をBシートのA列に ***************** 99 店舗 サンプル所 ***************** という形に加工して貼り付けたいです。 一応、以下のようにやっているのですが、どうしたら良いか 分かりません。 Private Sub CommandButton1_Click() 'コピー用の項目を作成 '一覧に追加して下へ Worksheets("Bシート").Range("1:1").Insert shift:=xlShiftDown 'IDを追加 Worksheets("Bシート").Range("A1").Value = Application.Transpose(Worksheets("Aシート").Range("A1")) '営業形態を追加 Worksheets("Bシート").Range("A2").Value = Application.Transpose(Worksheets("Aシート").Range("A2")) 申し訳ございませんが、お力添え頂けませんでしょうか。 何卒宜しくお願い申し上げます。

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

ご提示の処理でBシートの1行目を挿入し、 IDや営業形態で1行目と2行目に書き出しという処理を なぜ必要なのか辻褄が合わないように思います。 ので、以下のように解釈しています。 (1)Bシートの1行目を挿入 (2)AシートのA列1行目~○行目(3行固定?)を加工 (3)行列を入替でBシートの1行目のA1、B1、C1セル・・・へ出力 間違っていたら申し訳ありません。 ただし、 エクセル2007では、Bシートの列数の最大が16384列までですので、 Aシートの行数が16384行までの場合に対応します。 ■VBAコード Private Sub CommandButton1_Click() '型宣言 Dim i As Long Dim myStr As String 'Bシートの1行目をシフトダウン Worksheets("Bシート").Range("1:1").Insert shift:=xlShiftDown 'AシートのA列末尾まで繰り返し処理 For i = 1 To Worksheets("Aシート").Cells(Rows.Count, "A").End(xlUp).Row   'AシートA列の値を変数に格納   myStr = Worksheets("Aシート").Cells(i, "A")   '変数から":"を検索して、右側を抜出して格納し直し   myStr = Right(myStr, Len(myStr) - InStr(1, myStr, ":"))   'Bシートの1行目に変数を出力   Worksheets("Bシート").Cells(1, i) = myStr Next i 'Aシートの値削除 With Worksheets("Aシート")   .Range(.Cells(1, "A"), .Cells(Rows.Count, "A").End(xlUp)).ClearContents End With End Sub ■追記 Right関数は「指定した文字列」を「指定した文字数」から「文字数」分だけ抜き出すため、 Len関数と組み合わせて使う必要がありますので、No1さんのコードでは求める結果にならないかと。

queschoooon
質問者

お礼

eden3616様 ありがとうございます。今、回答拝見させて頂きまして、 取り急ぎ御礼申し上げます。 あと、すみません!焦って書いていたため、ご指摘通り BシートのA1,B1,C1・・・と横に展開されるのが 正しいです。 お気づき頂きましてありがとうございます。 まだ試せてないのですが、できそうな感じがします! またご連絡させて頂きます。よろしくお願い致します。

その他の回答 (1)

  • usami33
  • ベストアンサー率36% (808/2210)
回答No.1

判りやすい様に、一行、位置処理で書いてます。 必ず10文字目以降なら 1 2 3 45 6 7 8 9 ご利用ID   :99 Dim str1 As String Dim str2 As String str1 = Application.Transpose(Worksheets("Aシート").Range("A1")) str2 = RightB(str1, 10) ' 10文字目から右を切り出す Worksheets("Bシート").Range("A1").Value = str2 「:」を探すなら Dim N As Long Dim str1 As String Dim str2 As String str1 = Application.Transpose(Worksheets("Aシート").Range("A1")) N = InStr(str1, ":") str2 = RightB(str1, N+1) ' 10文字目から右を切り出す Worksheets("Bシート").Range("A1").Value = str2

queschoooon
質問者

お礼

usami33様 ご回答ありがとうございます! 焦って書いていたためBシートへはA1,B1,C1と展開されるのが 正しかったのですが、改変すればできるかもしれないと 思いました。 まだ試せてないのですが、本当にありがたく、 心より御礼申し上げます。

関連するQ&A

  • エクセルのフォームのVBAについて

    VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • Excel VBA 別ブックを開かずに転記

    Excel2007のユーザーフォームについて教えてください。 ユーザーフォームを以下のように作成しました。 ■テキストボックス6つ テキストボックス2→件名 テキストボックス3→数 テキストボックス4→名前 テキストボックス5→備考1 テキストボックス6→備考2 ■コマンドボタンが1と3の2つです。 コマンドボタン1→転記と印刷 コマンドボタン3→終了 ■シートの構成  sheet"作成と一覧"   1行目を以下の項目で使用しています。  A1→番号(テキストボックス1を表示)  B1→件名(テキストボックス2を表示)  C1→数(テキストボックス3を表示)  sheet"印刷"  A1→番号(テキストボックス1を表示)  A2→件名(テキストボックス2を表示)  B2→数(テキストボックス3を表示)  A3→名前(テキストボックス4を表示)  A4→備考1(テキストボックス5を表示)  A5→備考2(テキストボックス6を表示) テキストボックスに入力した値を2つのシートにそれぞれ転記して、 シート"印刷"を2部印刷しています。 ここまで以下のコードで行いました。 Private Sub CommandButton1_Click() '入力値を作成と一覧シートに転記 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm1.TextBox1.Value Cells(行, 列 + 1) = UserForm1.TextBox2.Value Cells(行, 列 + 2) = UserForm1.TextBox3.Value '入力値を印刷シートにに転記 Worksheets("印刷").Range("A1") = UserForm1.TextBox1.Value Worksheets("印刷").Range("A2") = UserForm1.TextBox2.Value Worksheets("印刷").Range("B2") = UserForm1.TextBox3.Value Worksheets("印刷").Range("A3") = UserForm1.TextBox4.Value Worksheets("印刷").Range("A4") = UserForm1.TextBox5.Value Worksheets("印刷").Range("A5") = UserForm1.TextBox6.Value 部数 = 2 Worksheets("印刷").PrintOut Copies:=部数, Collate:=True UserForm1.TextBox1.SetFocus Cells(行 + 1, 列).Select End Sub Private Sub CommandButton3_Click() '終了ボタンで値をクリアしてウィンドウを閉じる Dim Ctrl As Control For Each Ctrl In Controls If TypeName(Ctrl) = "TextBox" Then _ Ctrl.Value = "" Next Ctrl Unload Me End Sub 教えて頂きたい事なのですが・・・ コマンドボタン1の入力値を作成と一覧シートに転記の所なのですが、 アクティブセルではなく、常にA列の最後の値の次の空白行に転記するようにしたい場合、 どのように書き換えればいいのでしょうか? もう一点ですが、 別ブックにテキストボックス1から6が入力された一覧があります。 この別ブックを開かずに、 テキストボックス1に入力された番号を探して、 テキストボックス2から6に表示されるようにしたいのです。 うまく説明できないのですが・・・ 別ブックの名前は"たちつ" 別ブックは、あいうサーバーの かきくフォルダの中のさしすフォルダです。 ブック"たちつ"に"一覧"というシートがあります。 一覧のシートのD列の3行目以降には番号が入力されており、日々増えています。 テキストボックス1に入力された番号を、 一覧のD列から探し、 I列の値をテキストボックス2へ K列の値をテキストボックス3へ L列の値をテキストボックス4へ M列の値をテキストボックス5へ J列の値をテキストボックス6へ転記させたいのです。 同じブックの別シートを参照するときには Application.VLookupで出来たのですが、 マクロの記録でやってみても、解決できませんでした。 コードをご覧いただいてお分かりの通り、 VBA超初心者です。 ネットを見ながら試行錯誤している状況です。 コードの間違い等あるかもしれませんが、 ご教示よろしくお願いいたします。

  • VBA Withの使い方

    2つのシートを操作するマクロを書いています。 Worksheets(A).Range("A1").Value = Worksheets(B).Range("A1").Value Worksheets(A).Range("B1").Value = Worksheets(B).Range("B1").Value Worksheets(A).Range("C1").Value = Worksheets(B).Range("C1").Value ・ ・ ・ 簡単に書くとこのような感じです。 =の両辺ともうまくWithでまとめてすっきりさせることは可能ですか?

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).~」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

  • エクセルVBAで(続)

    前日も質問(http://okweb.jp/kotaeru.php3?q=1480399)を出していたものですが、続きがあります。下記は今現在のコードです。 Sub 得意先追加()  Sheets("一覧").Unprotect Dim myRng As Range, a Sheets("新規").Copy before:=Sheets(4) With ActiveSheet .Unprotect 得意先シート登録.Show .Name = .Range("A4").Value & .Range("A3").Value .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True   Set myRng = Sheets("一覧").Range("A65536").End(xlUp).Offset(1) myRng.Value = .Range("A4").Value & .Range("A3").Value Sheets("一覧").Hyperlinks.Add _ Anchor:=myRng, _ Address:="", _ SubAddress:=myRng.Value & "!A1", _ TextToDisplay:=myRng.Value End With Sheets("一覧").Select Range("A4").Activate Selection.End(xlDown).Select ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub 実は一覧シートのA列はコード&得意先名ですが、B列には今期の売上合計(各得意のシートのP10をリンク貼付),D列には前期の売上合計(各得意先のP9よりリンク貼付)があります。 それで,得意先追加を実行しているときに一覧シートのB列・D列にシートの各セルをリンク貼付するにはということなんですが、教えていただけますでしょうか。 宜しくお願いします。

  • エクセル マクロ IF関数について

    Sheet1にグループボックス内で、チェックボタンで項目を選択するとA1に記載されるように作成、マクロで入力ボタン作成しボタンをクリックするとSheet2に記載されるように作りました。しかし、項目が多いためSheet2を見るとABCDEFGなどの列に空白が目立ち使いづらいです。 そこでIF関数を使い何とか出来ないでしょうか? 例)SHEET1 B2に原因のグループボックスにカテゴリー(チェックボックスにて1)入力ミス、2)人、3)機械) B3に対応のグループボックスにカテゴリー(チェックボックスにて1)外注、2)修正、3)報告) と作り、それらがチェックされていたら、A1の列に表示され入力ボタンを押したら、Sheet2のAには原因、Bには対応と記載されるようにしたいです。その時Sheet1のA列に空白があれば、Sheet2の列に表示するようにしたいです。 実際のマクロ記入 Sub 入力() Dim LastRow As Long With Worksheets("Sheet2") LastRow = Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & LastRow).Value = Worksheets("Sheet1").Range("A6").Value .Range("B" & LastRow).Value = Worksheets("Sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("Sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("Sheet1").Range("A9").Value .Range("E" & LastRow).Value = Worksheets("Sheet1").Range("A10").Value .Range("F" & LastRow).Value = Worksheets("Sheet1").Range("A12").Value .Range("G" & LastRow).Value = Worksheets("Sheet1").Range("A13").Value .Range("H" & LastRow).Value = Worksheets("Sheet1").Range("A15").Value .Range("I" & LastRow).Value = Worksheets("Sheet1").Range("A16").Value .Range("J" & LastRow).Value = Worksheets("Sheet1").Range("A19").Value End With End Sub お願いします教えてください。

  • Excel VBA 構文をすっきりさせたい

    いつもお世話になっています。 次のような構文を使って、データを別シートに転送するVBAを作成しました。 転送するデータが多い場合、構文が延々続くことになります。 もっとすっきりと記述する方法がありましたらぜひ教えてください。 お力添え、よろしくお願いします。 Sub データ() With ActiveSheet Dim last last = ActiveSheet.Range("b" & Rows.Count).End(xlUp).Row + 1 .Range("b" & last).Value = Worksheets(2).Range("b2").Value .Range("c" & last).Value = Worksheets(2).Range("c2").Value .Range("d" & last).Value = Worksheets(2).Range("d2").Value     以下同様に続く・・・・ End With End Sub

  • エクセル2000VBA 情報の検索について

    いつもお世話になります。 sheet1は商品情報検索画面で、sheet2は、データのマスターです。 sheet1のセル"D4"に商品コードを入力し、マクロを起動することで、sheet2の商品コード(A列)の同じ情報を検索し、その次のセルの商品コードを表示させたいのです。(ややこしくてすみません) 自分なりに考えてコードを作ってみたのですが・・・ Dim sh2, sh3 As Worksheet Dim temp As Variant Set sh2 = Worksheets("sheet2") Set sh3 = Worksheets("sheet1") d = sh2.Range("A1").CurrentRegion.Rows.Count Set temp = sh2.Range("A2:A" & d).Find(What:=sh3.Range("D4").Value) For l = 2 To d If Not temp Is Nothing Then sh3.Range("D4").Value = sh2.Cells(l, 1).Offset(1, 0).Value ElseIf temp Is Nothing Then sh3.Range("D4").Value = sh2.Range("A2").Value End If Next l 以上だと、次々に情報が更新され、結局最終行の空白が答えになってしまいます。 以上宜しくお願い致します。

  • エクセルVBAで別シートにコピー貼り付け

    VBA初心者です。下記のようにプログラムしましたがうまくいかなくて困ってます。どなたかお力をお貸しください。内容としましては輸入Partsのシートからコピーして商品内容確認のシートのセルB17に貼り付けたいです。輸入Partsシートで3列目の空白を探し同じ行の1列目をコピーします。商品内容確認のシートのセルB17にはカーソルは動いているようですが貼りつきません。 Private Sub 商品内容確認2_Click() If MsgBox("商品内容確認へ移動しますか?", 33, "移動の確認") = 2 Then MsgBox "処理を中止します。" Range("A2").Select Exit Sub End If Dim Line As String Dim Maxrow As String Worksheets("輸入Parts").Select Line = 2 Do Until Cells(Line, 1).Value = "" On Error Resume Next If Cells(Line, 3).Value = "" Then Cells(Line, 1).Copy 'コピーする Maxrow = Worksheets("商品内容確認").Range("B17").End(xlDown).Row + 1 Worksheets("商品内容確認").Range("B" & Maxrow).PasteSpecial Paste:=xlPasteValues '値を貼り付け End If On Error GoTo 0 '次の行に移り最後の行まで検索 Line = Line + 1 Loop Worksheets("商品内容確認").Visible = True Worksheets("商品内容確認").Select Worksheets("商品内容確認").Range("B6").Select Worksheets("商品内容確認").輸入Partsシート2.Visible = True Worksheets("商品内容確認").輸出Partsシート2.Visible = False Worksheets("輸入Parts").Visible = False End Sub

専門家に質問してみよう