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

WindowsXPでOffice2003です。
エクセルのマクロの初心者です。
履歴一覧表から部屋別シートに転記しようとしています。
シート名は部屋番号を、数字のみ (4桁)、A101~、B101~に分けています。
今、一覧表の部屋番号が、本来A101のところがA-101になっていたりすると、シート名が見つからずエラーになってしまいます。
この時にA-101をA101に書き換えて続行させる方法が分からず立ち往生しています。
急いではいませんのでよろしくお願いします。

A 回答 (7件)

>A-101をA101に書き換えて続行させる方法が分からず立ち往生


 ⇒本来、部屋番号は4桁でハイフン等の文字列が入らないようにした方が良いと思う。
  例えば、入力規則でも使って部屋番号データを規制するとか。

  又、入力されているのならば置換すれば良いだけのように思えます。
  マクロはシンプルにした方が良いと思いませんか、マクロ処理前の役割分担をした方が良い思うので
  検討されては如何でしょうか。
    • good
    • 0
この回答へのお礼

返事が遅くなってしまいましたが、この欄でまとめてお礼させていただきます。

この履歴一覧は、過去5年間のデーターを複数の担当者が入力していた為に、起きたミスで細かいところまで把握しないで作り始めた結果でした。
皆さんのアドバイスを参考に置換する方法でやってみたのですが、A-XXXXと4桁あるものが出てきたため、msgboxで間違った部屋番号を表示して、inputboxで正しい部屋番号を入力するようにして、うまくいきました。
又、今後は入力時に、規制してこのようなことが起きないようにしました。

皆様が懸念した通り、皆様が回答してくださったコードはほとんど理解できませんでした。
今回このような質問をするレベルにも達していない事が、良く分かりました、回答して下さった皆様方には、本当に申し訳ないと思っています、今回はありがとうございました。

お礼日時:2011/02/24 14:43

作業の進め方はどう?。



部屋別シートに転記したい、これが先行している。後でイレギュラーがあって困る。これでは遠回りです。

どんなデータが存在しどういうシート名を生成するか決める、イレギュラーなケースはないか、エラーになりそうな要素をクリアしてから転記のマクロに取り掛かると作業戻りが少ない。
これは自分で感じながらしないと、「勉強しますっ」だけでは直らない。

仕様を固める、エラーを防ぐ、機能を考える、こんなこと考えてからマクロ作成すると良い。

最初の土台が良ければブレない。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいましたが、NO7の方のお礼でまとめて書かせていただきました、今回はありがとうございました。

お礼日時:2011/02/24 14:50

どういうマクロになっているのでしょうね。


それで、直しようもないので、こちらが勝手にコードを書かせていただきます。

 A    B
部屋番号 人員
A101    6
A102    3
A-111   5  'ハイフン無しでも、存在しない
A104    10


Sub TestConvertData1()
 Dim rng As Range
 Dim c As Range
 Dim n As String
 Dim tmp As Variant
 Set rng = Range("A2", Cells(Rows.Count, 1).End(xlUp))
 On Error GoTo ErrHandler
 For Each c In rng
  n = c.Value
  Worksheets(n).Cells(Rows.Count, 1).End(xlUp).Value = c.Offset(, 1).Value
 Next c
 Exit Sub
ErrHandler:
 '見つからない場合の処理
 n = Replace(c.Value, "-", "", , , 1) '全角でも除去可能
 tmp = Evaluate("'" & n & "'!A1")
 If IsError(tmp) Then
  Resume Next
 Else
  c.Value = n
  Resume
 End If
End Sub
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいましたが、NO7の方のお礼でまとめて書かせていただきました、今回はありがとうございました。

丁寧にコードを書いていただきましたが、ほとんど理解できませんでした。申し訳ありませんでした

お礼日時:2011/02/24 14:49

>シート名は部屋番号を、数字のみ (4桁)、A101~、B101~に分けています。


この意味がわからない。「数字のみ」とはなに?
宿泊記録(履歴?)一覧があって、色んな部屋《番号)が出てくる。その部屋番号で、シート別にデータを振り分けたいのか。
その場合に、A101のところがA-101になっている行があると、そのままでは処理できないと言うことか?
もっと丁寧に質問を書くこと。
(1)処理する前に部屋番号の在る列をA列として、-を操作で削除する。
(2)部屋番号別に振り分けるとき、-が無いか調べて、あれば削除してして、削除後のデータでシート名を指定する。
などが考えるが、それで良いか。
ーー
そのコードの書き方が判らないのか。
(1)は操作でも出来る。
A列全体を範囲指定
検索する文字列ー
置換後の文字列 何も指定しない
すべて置換
これらをマクロの記録を採ってVBAコードに出来る。
(2) の場合
A111,A112,A113と言うシートは、挿入ーシートの操作であらかじめ準備しておくとして、(VBAコードでも出来るが略)
Sheet2にデータがあるとして
Sub test01()
d = Worksheets("Sheet2")..Range("A65536").End(xlUp).Row
MsgBox d
For i = 1 To d
sn = Worksheets("Sheet2").Cells(i, "A")
p = InStr(sn, "-")
If p <> 0 Then
sn = Replace(sn, "-", "")
MsgBox sn
Else
End If
ds = Worksheets(sn).Cells(65536, "a").End(xlUp).Row
Worksheets(sn).Cells(ds + 1, "a") = Worksheets("sheet2").Cells(i, "B")
Next i
End Sub
例データ
Sheet2 A1:B4
A-111山田
A112木村
A113鈴木
A-112田中
ーー
コードを実行結果
シート A111 A2
山田
シート A112 A2:A3
木村
田中
シート A113 A2
鈴木
ーーー
これでわかるとおり、
質問のことなど、小さいことで、他の全体的なコードは判っているのか心配。
上記コードを改良すれば出来る課題ではないかと推測する。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいましたが、NO7の方のお礼でまとめて書かせていただきました、今回はありがとうございました。

丁寧にコードを書いていただきましたが、ほとんど理解できませんでした。申し訳ありませんでした

お礼日時:2011/02/24 14:49

A-101のエラーだけでなくA 101やA_101も同じA101でしょう。



その履歴の値はどういう名称のシートか、どういう値だったらエラーなので、というのを精査してからでよいのでは。

後、256シート数は越えないと思いますが念のため。

対処がわからないならシート保留分だけ最終シートにでも固める。

シート名渡してシート名チェックをする。置換も良い。

2桁目固定ならMID関数使う、でも出来る。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいましたが、NO7の方のお礼でまとめて書かせていただきました、今回はありがとうございました。

お礼日時:2011/02/24 14:47

>数字のみ (4桁)、A101~、B101~に分けています。



シート1のA1に部屋番号が記入してあるとして。
どういった間違い要素が紛れているのかまるで不明だとすると,たとえば
dim res
res = strconv(worksheets("Sheet1").range("A1").text, vbnarrow)
if len(res) > 4 then
res = left(res,1) & right(res, 3)
end if
worksheets(res).select
みたいな具合でしょうか。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいましたが、NO7の方のお礼でまとめて書かせていただきました、今回はありがとうございました。

お礼日時:2011/02/24 14:46

難しい方法はわかりませんが


簡単な方法ならありますが コードを書くのが少し面倒かな、、
数が多いと大変だし・・。

IF条件で処理すりゃいいんです

もし 参照セルがA-101だったら 参照セル.Value="A101"
ってな感じで
または 置換という方法もあります
VBAでREPLACE関数を使って - を ””(空白の意味) に置換するのです
REPLACE関数の使い方は ここのスペースで説明するよるも
ネットで検索してください わかりやすいページがあります
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいましたが、NO7の方のお礼でまとめて書かせていただきました、今回はありがとうございました。

お礼日時:2011/02/24 14:46

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