• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelのVBAコードをズバリで・・・。)

Excel VBAコードを使ってマンホールの調査書を作成する手順と図の更新方法を教えてください

このQ&Aのポイント
  • 高齢者活用センターの紹介でExcelでマンホールの調査書を作成することになりました。マンホールには電気線と通信線の穴がありますが、それぞれの穴の数と径、使用状況を調査します。データを入力した後、作図シートに対応する図を配置し、数字を書き込みます。そして、更新ボタンを押すことでデータに応じて図を変更します。作図シートにはマンホールの左右側面と前後側面の4カ所に図を描きます。
  • 作図要領には、管なしの穴は破線の○、未入線の穴は実線の○に数字1、入線有の穴は実線の●に数字2を配置します。また、○と●の直径は管径情報に基づいて0.3mmから0.5mmに変更します。穴の数は24~50程度あります。
  • VBAコードを使用して図を更新する要領を教えてください。例えば、破線の○を検索して更新するコードは、Worksheets(3)などではなくシート名で指定する方法がわかりません。また、XXXXの箇所も検討が付きません。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

Shape.TextFrameオブジェクトのOrientationプロパティで設定します。 右向きが sp.TextFrame.Orientation = msoTextOrientationDownward 左向きは sp.TextFrame.Orientation = msoTextOrientationUpward msoTextOrientationDownward,msoTextOrientationUpwardは定数で msoTextOrientationDownwardは 3 msoTextOrientationUpwardは 2 です。 Orientationプロパティの値はLong型ですからtxtMukiはLongで宣言してください。 >マニュアルの読むべき箇所 Excelのバージョンが2007以外だったら「マクロ記録」とヘルプが参考になる、 と書きたいところですが、バージョンによって誤りがあります。 VBEで[ローカルウィンドウ]を使って変数spの中身を展開してプロパティを確認したり、 [オブジェクトブラウザ]で定数を確認したりすると良いです。 #AccessVBAは経験者でいらっしゃいましたよね? #なので[ローカルウィンドウ]、[オブジェクトブラウザ]等、 #基本的な説明は省いてますけど大丈夫ですよね。

noname#140971
質問者

お礼

テストしましたら該当の図のみをそれぞれにキャッチできました。 もはや、完成したも同然です。 これで、明日からの作業は半分の時間となります。 ありがとうございました。

その他の回答 (5)

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

>PS: しかし、未だ1行も書けずです・・・。 質問が来ないからいいのではなくて、 自分の担当作業にある程度責任を持ってやりましょうよ、ということ。 趣味のレベルならともかく仕事で使うなら あなた自身も確認が必要です。 回答者がどれだけ確認したかどうかあてにできない時もあります。 100%を求められるのでは?。

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

>国土交通省に提出するマンホールの調査書 今更ですが、 結果は正確さを求められるのでは?。 頼むとしても、実績のある業者に頼めなかったのでしょうか?。 仕様取り間違え、仕様漏れ、とかすでに起こりそうな気配です。 ここでの結果をどうやって正しいと検証するのか、気になります。 提出先から、「どうしてこの値がxxなのか?」みたいな質問は来ないのですか?。 そのとき「ネットでプログラム作ってもらったからわかりません・・・」と いうのは言い訳にならないと思います。

noname#140971
質問者

お礼

>提出先から、「どうしてこの値がxxなのか?」みたいな質問は来ないのですか?。 来ないと思います。 データ入力の際に、管径とかは横のセルに換算して表示するようにしています。 また、作画する円の大きさ情報も更にその横のセルに表示。 =IFERROR(VALUE(CutStr("/220/150/100/160/100/50/75/80/30", "/",FIND(F14, "XABCDGHIJK", 1))),"") Aが管の呼び名で、その径が220ということです。 同じ要領で、作画する円の径も求めます。 これ位の式ですと社員の方も理解できるし必要に応じて修正できるかと思います。 こうして、プログラム中にマジックナンバーを埋め込むことはしません。 ですから、動作する限りではミスはないでしょう。 PS: しかし、未だ1行も書けずです・・・。 何が判らないから書けないのかが判らない現状。 トホホのトホホです。 補足質問するやもしれませんので宜しく!

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

失礼。『更新』の意図をちょっと取り違えていました。 既に破線の○があって、"1"や"2"などTextが書いてあり、 それに応じてサイズ変更などの処理をするという事ですね。 Sub try2()   Const B As Single = 25 '管径(仮)   Const C As Single = 30   Dim sp As Shape 'Loop用   Dim tx As String 'テキスト取得用   For Each sp In ActiveSheet.Shapes     With sp       If .AutoShapeType = msoShapeOval Then         tx = ""         'バージョンによってエラーが出る対策として         '一旦Text取得してみる         On Error Resume Next         tx = .TextFrame.Characters.Text         On Error GoTo 0         Select Case tx         Case "1"           .Line.DashStyle = msoLineSolid           .Width = B           .Height = B         Case "2"           .Line.DashStyle = msoLineSolid           .Fill.ForeColor.SchemeColor = vbBlack           .TextFrame.Characters.Font.Color = vbWhite           .Width = C           .Height = C         End Select       End If     End With   Next End Sub ただ、マクロを使わないでも 最初に3種類のShapeを原型として作っておけば 後は[Ctrl]キーを押しながらShapeをマウスドラッグすれば 複製しながら配置ができますのでそれが手っ取り早いような。

noname#140971
質問者

補足

Sub cmdUpdateSokueki_1()   Set myDocument = Worksheets("共同調査データ")   Dim r        As Range    ' 読み込むRange   Dim shapeID     As Integer   ' C14,C15,・・・の値   Dim kanType     As Integer   ' 管の状況   Dim kanDiameter   As Integer   ' 管の直径   Dim shapeDiameter  As Integer   ' 円の直径   With myDocument     For Each r In .Range("C14", .Range("C65536").End(xlUp))       shapeID = r.Value       kanType = r.Offset(, 1).Value       kanDiameter = r.Offset(, 4).Value       shapeDiameter = r.Offset(, 4).Value       updateShapes "特殊部管理台帳", shapeID, kanType, kanDiameter, shapeDiameter     Next r   End With End Sub C14,C15・・・に調査した管の番号が入力されています。 管の状況、管の状況、円の直径等は、横のセルに。 それを順次読みとって updateShepes()に渡すことにしました。 Public Sub updateShapes(ByVal docuName As String,             ByVal shapeID As Integer,             ByVal kanType As Integer,             ByVal kanDiameter As Integer,             ByVal shapeDiameter As Integer)   Set myDocument = Worksheets(docuName)   Dim sp   As Shape   Dim no   As String   Dim txtMuki As String ' 右向き文字か左向き文字か   For Each sp In myDocument.Shapes     With sp       If .AutoShapeType = msoShapeOval Then         no = .TextFrame.Characters.Text         txtMuki = xxxx       End If     End With   Next sp End Sub ところで、壁面は4つあり、壁面毎に文字の向きが違います。同一シートに同じ円識別子である番号を持つ○が複数存在することになります。側壁1(cmdUpdateSokueki_1)は、左向きの文字で同じ識別子を持つ円を更新します。 補足質問: txtMuki = xxxx この1行が書ければ、多分、目的は達成されます。 できれば、教えていただくか、マニュアルの読むべき箇所をお願いします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

#続き その作図シートのA1セルから調査データがあるとして (以下のレイアウト)   A B 1 N 管径 2  0 A 3  1 B 4  2 C 5  0 A : つまり、A2から下にデータが並んでいる場合。 Sub try()   Const A As Single = 20 '径(仮)   Const B As Single = 25   Const C As Single = 30   Dim sp As Shape   Dim r As Range   With ActiveSheet     For Each r In .Range("A2", .Range("A65536").End(xlUp))       Select Case r.Value       Case 0         Set sp = .Shapes("oval0").Duplicate       Case 1         Set sp = .Shapes("oval1").Duplicate       Case 2         Set sp = .Shapes("oval2").Duplicate       End Select       Select Case r.Offset(, 1).Value       Case "A"         sp.Width = A         sp.Height = A       Case "B"         sp.Width = B         sp.Height = B       Case "C"         sp.Width = C         sp.Height = C       End Select       sp.Name = "ov" & r.Address       sp.Left = r.Offset(, 2).Left       sp.Top = r.Offset(, 2).Top     Next   End With   Set sp = Nothing End Sub こんな感じでA2セルからA列最終行までLoopしてデータを読み取りながら 原型のShapeを複製します。 A列を基準にr.Offset(, 1)でB列データを読みます。 r.Offset(, 2)でC列に複製Shapeを配置します。 それと同時にA列のアドレスを複製Shapeの名前にします。 これで作成された複製Shapeを手動で配置してはどうですか? 更新の必要があればShapeの名前がアドレスで関連付けられてますから それが利用できるかと思います。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

>Worksheets(3)などではなくシート名で指定する要領が判りません。 ここは Set myDocument = Worksheets("Sheet1") などと、シート名を文字列で指定してあげれば良いです。 ただ、複数シートを処理するなら、対象シートをまずActiveにして、 ActiveSheetに対して処理をしてもいいかもしれません。(『半自動化』なら) 他の要件については今ひとつ条件が不明確なので ズバリの回答は厳しいです。 ひとつの考え方としては、 まず、作図シートがActiveSheetだとして、原型となるShapeを作成します。 Sub プロト作成()   Const k As Single = 20   With ActiveSheet     With .Ovals.Add(200, 0, k, k)       .Name = "oval0"       .Placement = xlMove       .Border.Color = vbBlack       .Border.LineStyle = msoLineDash       .Interior.Color = vbWhite     End With     With .Ovals.Add(300, 0, k, k)       .Name = "oval1"       .Placement = xlMove       .Text = "1"       .Font.Size = 10       .HorizontalAlignment = xlCenter       .VerticalAlignment = xlCenter       .Border.Color = vbBlack       .Interior.Color = vbWhite       .Font.Color = vbBlack     End With     With .Ovals.Add(400, 0, k, k)       .Name = "oval2"       .Placement = xlMove       .Text = "2"       .Font.Size = 10       .HorizontalAlignment = xlCenter       .VerticalAlignment = xlCenter       .Border.Color = vbBlack       .Interior.Color = vbBlack       .Font.Color = vbWhite     End With   End With End Sub それぞれ"oval0","oval1","oval2"と名前をつけます。

noname#140971
質問者

お礼

早速の回答ありがとうございます。 マンホールの電気と通信の穴の数と配置の型は100程度あるようです。 型番号1~型番号90などの図面があります。 その図面を元に手書きで書き写し、かつ、写真を撮るとのこと。 作業者の手書きと写真を基に穴の現状を再現するのが作画の目的。 ところで、私は、あくまでも高齢者のセンターから派遣された臨時雇いです。 ですから、正社員が作り上げたやり方を踏襲しつつの半自動化。 1、データ入力シートを追加する。 2、穴の配置に応じた破線の○を配置しグループ化した図の集合シートを追加する。 この2つだけが臨時の私ができる改善です。 作業手順 1、集合シートより該当する図を選んで従来のシートにコピペ。 2、入力データに基づいて○を加工。 3、入力データに基づいて各穴の調査データを作成・完成する。 改善1、加工する図の原型が用意されることになる。 改善2、各○の加工が入力データで自動化されるのでミスが防げる。 改善3、各○の調査データもわざわざ入力しないでよくなる。 と、補足しておきます。 本日、午後2時より作業を開始します。 退職して2年。 今更、ExcelのVBAを書くことになろうとは思ってもいませんでした。 でも、工事用のプレハブで必死に作業している作業員の苦労を軽減してやりたいのです。 最低賃金に毛の生えたような報酬でも退職者にはありがたいものです。 さて、ExcelのVBAなんてExcel95のそれしか知りません。 ですから、実際に作業に入れば多分判らないことだらけ。 補足の説明を求めなければならないかも知れません。 そういう事情で、先ずはお礼はここまでとさせていただきます。 お礼を書いていない回答も目を皿のようにして読むつもりです。 本当に、早速の回答ありがとうございました。

関連するQ&A