• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(VBA) 処理から外すコードを追加)

VBAを使用した翻訳処理の高速化

このQ&Aのポイント
  • 翻訳処理のためにVBAコードを使用しているが、連番と表示時間を省略することで処理を高速化したい。
  • 現在のプログラムでは、1行ずつネットに送信しており、90行で約13秒かかる。
  • 提案されたコードを変更し、連番と表示時間を外すことでパフォーマンス改善を期待している。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.4

> シート上の最終行番号 : 6319 です。 なのに ln = ws2.Cells(Rows.Count, "A").End(xlUp).Row '最終行番号の取得 のlnが ln : 6322 なのは変ですね。最後に何か目に見えない怪しいデータがあるのかもしれませんね。それが""として処理されたのかも。 6320行目にそのデータ(""になった)があったらその時に i = i + 3 で、iが6323になるので(i: 6323の結果と一致します) url = SRC_URL & temp(i, 1) でエラーになります。 それで Dim url As String If temp(i, 1) = "" Then '*  追加 i = i + 3 '*  追加 ElseIf temp(i, 1) = 1 Then '*コメントアウト --- 'i = i + 2 '*  コメントアウト --- End If '*  追加 の部分を Dim url As String If temp(i, 1) = "" Then '*  追加 i = i + 3 '*  追加 If i > ln Then Exit For End If End If '*  追加 最終行の値よりiが大きくなったらループを抜けるを追加してみてください。 前回と同じように数値かつ""ではない連番の行を見つけてそこから2行飛ぶというのに変更しようと思ったのですが、前回は多重ループ(連番を見つけるループの中に翻訳文字の取り出しループ)使ってたので変更がややこしくなりそうでやめました。 前回といい今回といい""にやられました。

NuboChan
質問者

お礼

追加のコードありがとうございます。 >最後に何か目に見えない怪しいデータがあるのかもしれませんね。 >それが""として処理されたのかも。 ビンゴです。 試しに翻訳前の処理列(A列)をコピペして テキストエディターに読み込ませたら6319,6320,6321行に 改行文字が入っていました。 改め元DATAを調べた同じ状況なので元DATA自体にゴミが紛れ込んでいました。 最終行の値よりiが大きくなったらループを抜けるコードを追加して エラー無く処理できました。 ちなみに処理時間は、268秒(4分28秒)でした。 (当初コード変更前は、予想では912秒だったので十分処理時間短縮となりました。) お陰様で今回も先が見えました。 処理の見込みがたったので他の実DATAで処理を行ってみたいと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.3

一行にしたら問題が発覚したということですか、残念でしたね。 前回の案の ElseIf temp(i, 1) = 1 Then i = i + 2 の部分ですが、最初の連番だけの処理ですので、ループの始まりを連番1の字幕部分(先頭から3行目でしょうか)からはじめたら上記部分は不要になり、""じゃない場合に毎回1と比較する時間は節約できると思います(といってもムチャかすかな時間だと思いますが)

NuboChan
質問者

お礼

方針を変更してすいません。 コードを変更して試してみました。 For i = LBound(temp, 1) To UBound(temp, 1) 'HTTPリクエストのURL設定 Const SRC_URL As String = "https://translate.google.pl/m?hl=jp&sl=en&tl=jp&ie=UTF-8&prev=_m&q=" Dim url As String If temp(i, 1) = "" Then '*  追加 i = i + 3 '*  追加 ElseIf temp(i, 1) = 1 Then '*コメントアウト --- 'i = i + 2 '*  コメントアウト --- End If '*  追加 テストDATA(91行)で短時間化が上手く処理できたので 6319行の実DATAで試したのですがエラーが発生しました。 url = SRC_URL & temp(i, 1) インデックスが有効範囲にありません。 エラー時でチェックの結果 ローカルウインドウで   ln : 6322   i: 6323   temp (1 to 6322,1 to 1)   result((1 to 6322,1 to 1) なのに シート上の最終行番号 : 6319 です。 とりあえず transtextをみたら最終の6319を翻訳していました。 実DATAでエラーが出る原因はどこにあるのが不明なので どこをチェックすれば良いでしょうか ?

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.2

あと Dim url As String url = SRC_URL & temp(i, 1) のところを Dim url As String If temp(i, 1) = "" Then i = i + 3 ElseIf temp(i, 1) = 1 Then i = i + 2 End If url = SRC_URL & temp(i, 1) に変更するとか ""だと3行飛んで1(連番の最初だけ)だと2行飛ぶという処理です。

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.1

前回 https://okwave.jp/qa/q10197169.html で字幕の部分だけを取り出していたと思うのですが、そのデータを送信すればいいのではないでしょうか。

NuboChan
質問者

お礼

回答感謝します。 >前回で字幕の部分だけを取り出していたと思うのですが No2の改正候補はまだ試していませんが 以下が変更理由です。 前回は、1行にすると翻訳の精度が少し上がりそうなので思い付きで1行にしてみたのですが。。。 実際複数行の字幕の部分を1行にして字幕部分だけを取り出した結果 実際動画に字幕を付けて再生した場合 これだと1行分の文字数が長すぎる事が多くて 視認性を良くする為に字幕文字を大きくすると字幕を読み切らないうちに 表示が消えてしまったり、 1行に入りきらないで変な所で改行されてしまいます。 以上の理由により1行化して字幕部分だけ別の列に集めて字幕部分だけを翻訳処理すると言う 前回の処理方法をとりあえず変更する事にしました。 字幕部分だけ別の列に集めると言う作業を行っていないので 翻訳する必要が無い連番部分と表示時間部分がじゃまになっています。 (最初の相談で記載しましたように 連番部分と表示時間部分は翻訳には無関係でネットに送るとそれだけ翻訳作業に時間が必要で 処理時間が長くなります。 そこでこれを省くとかなり高速化が見込めると思っています。)

すると、全ての回答が全文表示されます。

関連するQ&A