• 締切済み

エクセル2003のVBAで質問です(当方初心者です)。

エクセル2003のVBAで質問です(当方初心者です)。 セル内に入力した文字の一部を別のシートの指定したセルにコピーしたいのですが、上手くいきません。 例えば、 sheet1には A1 猿2上野 A2 牛3旭山 A3 亀2横浜 と入力されていて、 sheet2では A1 猿  B1 2  C3 上野 A2 牛  B2 3  C2 旭山 A3 亀  B3 2  C3 横浜 となるように入力したいのです。 コマンドボタンを押したときにそうなるようにしたいと考えています(コマンドボタンの使用などは上手くいっています。) character関数などを用いても「このプロパティまたはメソッドをサポートしていない」と上手くいきません。 宜しくお願いいたします。

みんなの回答

  • sample_
  • ベストアンサー率76% (20/26)
回答No.4

正規表現を使うと楽にできたりするのですが、正規表現自体難しいので参考までにコード及び説明をのせておきます。 Sub Sample()    Dim Reg As Object, result As Object    Set Reg = CreateObject("VBScript.RegExp")    Reg.Pattern = "^(¥D+)(¥d+)(¥D+)$"    Dim r As Integer    For r = 1 To 3        Set result = Reg.Execute(Cells(r, 1))        Sheets("Sheet2").Cells(r, 1) = result(0).SubMatches(0)        Sheets("Sheet2").Cells(r, 2) = result(0).SubMatches(1)        Sheets("Sheet2").Cells(r, 3) = result(0).SubMatches(2)    Next End Sub 簡単な説明 2行目:Reg変数は、正規表現のオブジェクト作成用、resultは正規表現の結果を格納する用のオブジェクト 3行目:正規表現のオブジェクトを作成。 4行目:正規表現をセット。     先頭から数字じゃない文字が1つ以上続き、数字が1つ以上続き、数字じゃない文字が1つ以上続く場合にマッチする 6行目:For文で使う変数。現在の行数を格納 7行目:For文でA1,A2,A3を順にループして値を取得 8行目:正規表現を実行し、結果をresultに格納 9行目:正規表現「^(¥D+)(¥d+)(¥D+)$」の最初の括弧にあたる数字以外(¥D+)を取り出す(猿/牛/亀の部分) 10行目:正規表現「^(¥D+)(¥d+)(¥D+)$」の2番目の括弧にあたる数字(¥d+)を取り出す(2/3/2の部分) 11行目:正規表現「^(¥D+)(¥d+)(¥D+)$」の3番目の括弧にあたる数字以外(¥D+)を取り出す(上野/旭山/横浜の部分) 9行目~11行目は、シート2の各セルに代入しています。 正規表現は、むずかしいとよくいわれて敬遠されが使えるように なるとすごい便利ですのであえてあげさせてもらいました 汗

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

すべて入力し終わったあとでの操作案です。 入力すると同時にシート2に表示したいというのなら他の意見で。 「猿2上野」 に規則があればあるほど対応がやりやすくなりますが、例外があると厳しいです。 「猿2上野」の「猿」や「上野」に数値が存在しない 「猿2上野」の「2」に数値1ケタしか存在しない ならば 「猿2上野」の「猿」「2」「上野」になればいいわけなので 「猿2上野」の「2」を「,2,」にすることで 「猿,2,上野」といった カンマ区切りの形式ができそうです。 CSV形式で保存して、 数値10個分置換え、 CSV形式を開く、 これだけです。 同等のことをVBAでやっても構いません。

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

A1 猿  B1 2  C3 上野 A2 牛  B2 3  C2 旭山 A3 亀  B3 2  C3 横浜 は A1 猿  B1 2  C1 上野 A2 牛  B2 3  C2 旭山 A3 亀  B3 2  C3 横浜 の間違いだろう。 初心者と言うことで、正規表現を使うのは無理だろう。 1文字づつ判別して考えて行く。 また他シートへ出すのも少し勉強が要るので同一シートに出してみる。 これとて、ロジックのコントロールは慣れないとやや難しい。 例データ A列 東京2横山 健一 横浜東23木村 進 靜岡山手234野村 順 ーーー 数字は半角であること 3部分は全データで揃っている、ものとして ーーー 標準モジュールに Sub test01() d = Range("A65536").End(xlUp).Row For i = 1 To d s = Cells(i, "A") 'msgBox "L" & Len(s) jyoutai = 1 '数字前状態 For k = 1 To Len(s) Select Case jyoutai Case 1 If IsNumeric(Mid(s, k, 1)) Then Cells(i, "B") = Mid(s, 1, k - 1) '第1漢字部分 jyoutai = 2 '数字状態 numst = k 'MsgBox "F" & k End If Case 2 If Not (IsNumeric(Mid(s, k, 1))) Then 'MsgBox "T" & k Cells(i, "C") = Mid(s, numst, k - numst) '数字部分 Cells(i, "D") = Mid(s, k, Len(s) - k + 1) '第2漢字部分 Exit For End If End Select Next k Next i End Sub 結果B-D列 東京 2 横山 健一 横浜東 23 木村 進 靜岡山手 234 野村 順

  • zant
  • ベストアンサー率25% (7/28)
回答No.1

正規表現を使えばラクラク。 Public Sub Execute() Dim hRegExp As Object Dim hMatches As Object Dim hSubMatches As Object Dim hMatch As Object Dim foo As String Dim bar(2) As String Dim i As Long foo = "" Set hRegExp = CreateObject("VbScript.Regexp") hRegExp.Pattern = "^(.+)(\d)(.+$)" hRegExp.IgnoreCase = True hRegExp.Global = True 'Sheet1に入力された値を変数fooに取得します。 foo = Sheet1.Cells(1, 1).Text Set hMatches = hRegExp.Execute(foo) If hMatches.Count = 1 Then Set hSubMatches = hMatches.Item(0).SubMatches For i = 0 To hSubMatches.Count - 1 bar(i) = hSubMatches(i) Next i End If 'Sheet2に値を設定します。 Sheet2.Range("A1:C1").Value = bar End Sub

参考URL:
http://codezine.jp/article/detail/1655

関連するQ&A

  • エクセルvba初心者です・・・

    エクセルvba初心者です・・・ シート1にあるひとつのセルをコマンドボタンを押した時にそのセル内の文字列をシート2にかいていくようなプログラムをつくりたいです。 例えば シート1のセルに文字入力→”田中”→登録ボタンおす→シート2のセルA1にはいる シート1のセルに文字入力→”竹山”→登録ボタンおす→シート2のセルA2にはいる                  ・                  ・                  ・ というようになるコードわかる方いたら教えてください。おねがいします。

  • エクセル VBA 初心者で困っております!

    いつもありがとうございます。VBA初心者です。 データベース(sheet2)のデータをセルA1(sheet1)の値をオートフィルタ-に反映させて抽出し、 その後、セルB1(sheet1)に入力した値と貼り付けた別のシート(sheet3)で数値1×数値2(B1で入力した値)を掛け算し、数値3に出すのが目的です。 sheet1 セルA1【製品名を入力】例、【製品A】を入力 セルB1【数値を入力】例、5を入力 コマンドボタン1を押すと実行 sheet2(データベース)      製品名      数値1    数値2   数値3 1 製品C       2           2 製品A       2 3 製品A       1 4 製品B       4 5 製品D       3 6 製品D       5 sheet3(貼付先) 実行結果   製品名      数値1    数値2   数値3         1 製品A       2        5     10 2 製品A       1        5      5 当初、リストボックスを選択出来るようにし、その値を別のシートに貼り付け、演算処理を行うの方法を模索しておりましたが、 shee2のデータベース、A1・B1(検索値・値)も毎回変わるため、1回ずつの作業を行うように考えなおしたところ、 いきずまってしましました。 時間がないためによろしくお願い致します。

  • エクセル VBAの初歩的な質問です。

    sheet1のセルにコマンドボタンを置きます。 そのコマンドボタンを押すとA1のセルが選択されるコードを教えていただけないでしょうか? よろしくお願いします。

  • エクセル VBA初心者です。

    D列のセル1から44までそれぞれのセルに入力規則で商品名(例:A,B,C,D等)ドロップダウンリストを 作成し、Aを選択したら自動的に同一セルで“1”、Bを選択したら“2”と変換させたいのですが、Work sheet changeを使って試してみたのですが、うまくいきません。。。 コードを教えていただけると助かります。 宜しくお願いします。

  • Excel VBAで初心者です。

    Excel VBAで初心者です。 他のExcelファイルのワークシートのデータを選択して取得したいのですが Aファイルのシート1のセルA3に入力されている月が4~11と入力されていた場合 ファイル名「B」を、月が6~1が入力されていた場合、ファイル名「C」のデータを 見にいき、更に Aファイルのシート1のセルA1に入力されている西暦と、セルA3に入力されている月が B又はCファイルのシート名[西暦(月)]もしくは平成○年○月度と表示されている(2001/8/1)月 からマイナス1したものとマッチさせて、あったらその中のセルデータを Aファイルに表示させたいと思っています。 今はファイル名と場所を強制的に開くように指示してある状態ですが、 上記の希望のように選択してデータを表示するようにしたいのです。 VBAでは無理なのでしょうか? もしやり方がありましたら、ご指導いただきたくお願い申し上げます。

  • エクセルの質問です

    シート1のA1セルに『13』と記入。 シート1のA2セルに『買い物』と記入。 シート1のB1セルに『14』と記入。 シート1のB2セルに『洗濯』と記入。 シート1のC1セルに『15』と記入。 シート1のC2セルに『休み』と記入。 ◆◆質問はここからなんですが◆ 例えば、シート2のB1セルに『13』と入力すると、 自動的にシート1のA2に入力済の『買い物』がB2セルに表示。 例えば、シート2のB1セルに『14』と入力すると、 自動的にシート1のB2に入力済の『洗濯』がB2セルに表示。 例えば、シート2のB1セルに『15』と入力すると、 自動的にシート1のC2に入力済の『休み』がB2セルに表示。 要は、会社の日毎のシフトを作成しているのですが、 日によって毎月する業務が決まっており、 毎月1日は部屋の掃除、毎月13日は買い物といった感じです。 この「部屋の掃除」「買い物」といった毎月のスケジュールを ある一定セルで日付を書き換えるだけで、指定したセルに表示できればと思っています。 【シート1】    A   B   C 1  13  買い物 2  14   洗濯 3  15   休み 4 【シート2】(例えばB1セルに14と入力した場合)    A   B   C 1      14 2      洗濯 3      4 【シート2】(例えばB1セルに15と入力した場合)    A   B   C 1      15 2      休み 3      4

  • エクセルVBAを使ってデータの抽出をしたいのですが

    タンク容量のデータベースがあります。(以下のような)    A   B   C......←タンクNo 0  100  200  500 ..... 2  90  180  460  ...... 4  80  160   420  ..... 6   70  140   400 .....  ・ ・ ・ ↑タンク上部からの空寸 このようなデータからたとえば、タンクBの160は空寸が4ですが、この空寸4を抽出するにはどうすればいいのか教えてください。 ちなみに、データはシート2にあり、シート1のA1セルにタンクN0、B1セルに容量を入力し、コマンドボタンを押すとC1セルに対応する空寸がでるようにしたいのですが。。 また、容量はぴったり一致するときもありますが、無いときは最も近い値の空寸を持ってきたいのです。 どうか、よろしくお願いします。

  • エクセルのコマンドボタンで、

    コマンドボタンで、Sheet1のA2セルからA100セルとC2セルからC100セルをコピーしたものを、Sheet2のB2セルからB100セルと、C2セルからC100セルに貼り付けるには、どのように書けばいいのでしょう? 何度やっても上手くいきません。 教えてください。

  • EXCELのデータベース利用について(VBA)

    VBA初心者の者です。 下記の様なEXCELファイルを作りたいのですが、どのようにすれば良いのか まったくわかりません。 ACCESSでの構築が簡単なのかもしれませんが、データ量がそれほど多くないことと 職場にACCESSがないため、可能であればEXCELで構築したいと考えています。 私自身、プログラムの知識がなく、EXCEL VBAのサイトを確認するのですが、いまいち どうすれば良いのかわかりません。 ぜひご教授の程よろしくお願いします。 3つのシートの構成は以下になります。 【入力シート】 A1セルに文字列(A~Z)入力欄 【○○データシート】 A列に A~Z の文字列 B列に 001~100までの数値 C列に 001~100までの数値 D列に 001~100までの数値 E列に 001~100までの数値 例)    A列   B列   C列   D列   E列 1   A   001 2   B   001    002    003   004 3   C   003 4   D   002    003 【▽コマンドシート】 A列に 001~100までの一意の数字 B列に 文字列(コマンド) C列に 文字列(コマンド詳細) 例)    A列    B列    C列 1   001   xx     blank 2   002   xxx△   xxx 3   003   xxxx    x○ 4   004   xxxxx   xxx 【欲しいVBA】 1、入力シートのA1セルに○○データシートのA列に該当するA~Zの 文字列を入力。 2、○○データシートのB列~F列までの数値を参照 3、2の数値において▽コマンドシートのA列に記載ある番号と紐づけを行い、 ▽コマンドシートのB列、C列に記載がある文字列を入力シートのB列、C列にコピー ※コピー時は▽コマンドシートの書式や体裁情報も含めてコピー。 例としては以下になります。 入力シートの A1セルにDを入力した場合は 入力シート    A列    B列    C列 1   D    xxx△  xxx 2        xxxx    x○ 3 以上、ご教授よろしくお願いします。

  • エクセル 関数の質問

    いうも回答して頂きありがとうございます。 入力用シートの A1セルに a又は b又は c ・・・ と入力 A2セルに a又は b又は c ・・・ と入力 A3セルに a又は b又は c ・・・ と入力 みたいな感じに入力されていたとします。 で、他の設定用シートの B1セルに a に対応した時間が入力 B2セルに b に対応した時間が入力 B3セルに c に対応した時間が入力 上記の時 入力用シートのC1にA1~A?までの時間の合計を出したいのですが どのような関数を使えばよろしいのでしょうか? 御指導の程、宜しくお願い致します。