質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

2260閲覧

エクセルの表から値を取得してHTML文を可変的に生成したい

jin007

総合スコア34

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/10/23 12:44

編集2019/10/25 04:13

■実現したいこ

エクセルのひょうに値が存在しているときのみ、HTML文が可変に出現するようにしたい。

■具体例

以下のテーブルがあるとして、

|レシピ|A:チャーハン|B:チキンライス|C:カレー|
|:--|:--:|--:|
|材料1|米|米|米|
|分量|100g|100g|100g|
|材料2|卵|ケチャップ|カレールー|
|分量|1個|大3|1個|
|材料3|中華だし|鶏肉||
|分量|小1|50g||
|材料4|ネギ|||
|分量|1/4本|||

Aには材料が4つ
Bには材料が3つ
Cには材料が2つ
というように、バラバラである。
しかし、以下のサイトのマクロだと個数の可変性が無いため対応できない。

理想は、
Aのときは材料、分量が4つ出る制御
Bのときは材料、分量が3つ出る制御
Cのときは材料、分量が2つ出る制御
というように可変にしたい。

■参考

Excelの表の内容から自分好みのHTMLページを生成する [VBA]

■参考サイトのテーブル

※値は適当にしました。

|品名|製品A|製品B|製品C|
|:--|:--:|--:|
|型番|SAMPLE1|SAMPLE2|SAMPLE3|
|性能|普通|少し良い|すごく良い|
|幅|10|20|30|
|奥行|100|200|300|
|高さ|1000|2000|3000|
|重量|10|20|30|
|価格|111|222|333|

■参考サイトのコード

VBA

1Option Explicit 2 3Sub generateProductSpecDescription() 4 Dim i As Integer 5 6 Dim productName As String 7 Dim modelName As String 8 Dim spec As String 9 Dim width As Long 10 Dim depth As Long 11 Dim height As Long 12 Dim weight As Double 13 Dim price As Long 14 15 '製品はB列から始まるためi=2 16 i = 2 17 18 '製品名が存在する限りループ 19 With Worksheets("Sheet1") 20 Do While .Cells(1, i).Value <> "" 21 productName = .Cells(1, i).Value 22 modelName = .Cells(2, i).Value 23 spec = .Cells(3, i).Value 24 width = .Cells(4, i).Value 25 depth = .Cells(5, i).Value 26 height = .Cells(6, i).Value 27 weight = .Cells(7, i).Value 28 price = .Cells(8, i).Value 29 30 31 'htmlファイルへ書き出し 32 Dim htmlFile As String 33 34 'modelNameをファイル名に使用、製品名を小文字に変換 35 htmlFile = ActiveWorkbook.Path & "\" & LCase(modelName) & ".html" 36 37 Open htmlFile For Output As #1 38 39 'HTMLに出力 40 Print #1, "<!DOCTYPE html>" 41 Print #1, "<html lang=""; ja; "">" 42 Print #1, "<meta charset=""; UTF - 8; "">" 43 Print #1, "<title>" & productName & " - " & modelName & "</title>" 44 Print #1, "</head>" 45 Print #1, "<body>" 46 Print #1, "<h1>" & productName & " - " & modelName & "</h1>" 47 Print #1, "<h2>性能</h2>" 48 Print #1, "この製品の性能は" & spec & "です。" 49 Print #1, "<h2>大きさ</h2>" 50 Print #1, "幅:" & width & "<br>" 51 Print #1, "奥行:" & depth & "<br>" 52 Print #1, "高さ:" & height & "<br>" 53 Print #1, "<h2>重量</h2>" 54 Print #1, weight & "kg" 55 Print #1, "<h2>価格</h2>" 56 '価格に3桁区切りの,を加える 57 Print #1, Format(price, "#,#") & "円(税込価格 " & Format(price * 1.08, "#,#") & "円)" 58 Print #1, "</body></html>" 59 60 Close #1 61 62 i = i + 1 63 Loop 64 End With 65End Sub 66

お力添えのほどよろしくお願いします。

◆追記(2019/10/25)

実装することができました。
コードは後で記載いたします。

hermit19901127さんのIFを使って存在チェックを行い存在しないならループから抜けるというものにしました。

ものによってカラムがバラつくものは変数で保持することで解決できました。

新たに問題が発生しているため、この事象について分かりますでしょうか?
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hermit19901127

2019/10/23 13:51

VBAに関しては専門外ですが、基本的に 「weight = .Cells(7, i).Value」 ここで「.Cells(7, i).Value」が空の場合「""」空文字が入り、 VBAの記述の知識はありませんが、一般的言語としては if( weight != "" ) { //weightが空でなければここで掃き出し処理を入れる } ようなことがVBAでも出来るかと思う次第です… 値が""ならIF文を使い「無視する」という処理を入れてみるのはどうでしょうか…
jin007

2019/10/23 14:21

なるほどシンプルにIF制御して、存在する値まで出力するということですね。 それなら、実現できそうです! なんとかスマートにできないものかもう少し考えてみます! ありがとうございます!
hermit19901127

2019/10/23 14:24 編集

本来はContinue文「https://vbabeginner.net/vbaでループのcontinueを疑似的に行う方法/」を使うのがいいのですが、 (たぶんこの形式ではURL繋がらないので、ご興味があれば『VBA Continue文』等で検索を…) VBAではそれを素直に実装できないとの事で、「空の入力がある所」は素直にIF文を駆使して処理実行回避を行うのが分かりやすい解答だと存じます…。 解決ができたら、解決に至るコードを解答に記載の上、自己解決にするのが、後の方の為になると思う次第です…。 そのへんの作法はお任せいたします…。
hermit19901127

2019/10/23 14:29

…これは凄いトリッキーになるのと、質問主さんの現時点での知識で実装できるか分かりません…。 現状では、あくまで頭の片隅に入れておく程度で…。 VBAはエクセルからすぐ使える言語ですが、表現技法としては貧弱です…。 それなら、これを「JavaScript」で扱ってしまうという考え方があります…。 正しい表現をするなら、MicroSoft社が用意したJScriptを「JavaScript」で操るという考え方です… ・batファイル経由でJScriptを用いてエクセルにアクセス ・JScriptで、質問主さんが行っている処理を実装 JavaScriptなら、Continueのような、高級言語なら大抵は実装してるものが扱えると思う次第です… …ですが、まず連携のやり方でハードルが高いので、あくまで雑談レベルの知識提供として留めて頂ければと思う次第です… ・JScriptで
Zuishin

2019/10/23 23:05

いまどき JScript なんかすすめるのはやめてください。JavaScript と同じものでもありません。 終わって何年も経つような骨とう品である JScript.NET の更に先祖です。
Zuishin

2019/10/23 23:26 編集

参考スクリプトを見たところ、一回のループで三つの製品のうち一つしか出力していないので、continue は必要ありません。上から順に出力してセルが空になったところでループを終えればいいと思います。
jin007

2019/10/25 03:56

独自にロジックを考えたら実施できました! 後で、そのコードを記載いたします。
guest

回答1

0

既に回答は出ているようですが、セルの値が空欄か否かで処理を進めていけばよいでしょう。
汎用的に書いたコードを以下に挙げます。
※あくまでもサンプルなのでDebug.Printで出力しています。これを流用するなら適宜修正してください。

VBA

1Sub sample() 2 Dim r As Long 3 Dim c As Long 4 c = 2 5 Do 6 If Cells(1, c) = "" Then Exit Do 7 r = 2 8 Debug.Print Cells(1, c) 9 Debug.Print "<table>" 10 Do 11 If Cells(r, c) = "" Then Exit Do 12 Debug.Print "<tr>" 13 Debug.Print "<td>" & Cells(r, 1) & "</td>" 14 Debug.Print "<td>" & Cells(r, c) & "</td>" 15 Debug.Print "</tr>" 16 r = r + 1 17 Loop 18 Debug.Print "</table>" 19 c = c + 1 20 Loop 21End Sub

投稿2019/10/24 01:02

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問