親子におすすめの新型プラネタリウムとは?

今まで、何でもなかったのですが、fc2ブログの PRの枠内の内容が変わったせいか、
ページがハングします。
で、
.Busy = True  <> "complete"
この部分で、プログラムが止まります。
時間で このルーチンを逃げたいのですが、一番簡単な方法は無いでしょうか?できれば 2分くらいで・・・・

で、
Do While .Busy = True
DoEvents
For i = 1 To 40
Call Sleep(50)
DoEvents
Debug.Print .Busy
   If i > 40 Then
   Exit Sub
  End If
Next
Loop
これでテストしたんですが
.Busy が False でも DO-LOOP を ぬけてくれないのです。
どこで 間違ったでしょうか

Set netobjIE = CreateObject("internetExplorer.application")
url = "http://admin.blog.fc2.com/control.php?mode=edito …
With netobjIE
.navigate url
.Visible = True
Do While .Busy = True
DoEvents
Loop

Do While .document.readyState <> "complete"
DoEvents
Loop

Dim in_str As String
Dim doc As HTMLDocument
Set doc = netobjIE.document
Dim sel As IHTMLInputElement
in_str = "ログイン FC2 - 無料ホームページ"
'Debug.Print InStr(IE.document.Title, in_str)
If InStr(netobjIE.document.Title, in_str) > 0 Then 'ログインページなら

このQ&Aに関連する最新のQ&A

A 回答 (4件)

#3の回答者です。



>FC2のPRフレームが、特定のスポンサーの時、HPを読み込め無くてハング状態になるようです。

それは気が付かなかったですね。
最近、また、AdBlock Plusを付けるようになったので、まったく気にならないのです。AdBlock自体が問題を発生させるのは知っていますが、やむを得ないのです。解決策とは言えませんが、一つの方法であることは間違いないと思います。

IEのみでも、同じ効力を発生させることができるのですが、一旦、それをすると、戻せないのです。快適とは言っても見れないものもあります。それに懲りて、AdBlock を利用しているのですが、もうちょっと気の利いたのがあればとは思っています。

おっしゃっていた状況は、想像はつくのですが、ExcelのVBAは、そういう点で弱いです。たぶん、JavaScript と Active X コントロールをVBAの稼働している限りは、有効・無効が可能だと思います。

http://www.ken3.org/vba/backno/vba117.html

objIE.Silent = True
このコマンドが利いてくれれば面白いのですが。

三流君の...
》セキュリティの設定でJavaScriptなどをOFFにしてから巡回作業。
》そんな簡単なプロパティが無い。
》※あったら、マズイんだけど。。。

これは、やる気次第ですね。たぶんですが。

-------------------
なお、#3のコードのIEの宣言の
Dim NetObjeIE As Object
  ↓
Dim NetObjIE As Object
の間違いでした。
    • good
    • 0
この回答へのお礼

お手数おかけしました。

状況理解できました。

お礼日時:2017/02/03 23:07

こんにちは。



今、コードを見てみましたが、ハングしているようにも思えませんが、ただ、コードの目的が良く理解できないのです。たぶん、これは、クローリング(データ取得)ではありませんね。

>url = "http://admin.blog.fc2.com/control.php?mode=edito …

FC2 のHTML のソースの中に、以下のような言葉が混じっています。
※ <クラスはオートメーションまたは予測したインターフェースをサポートしていません。

ということで、オートメーションでのアクセスは不可ということかな?ではなさそうですね。あまり細かく見ていないのですが、そのままではできないということになりそうです。

言い換えれば、
CreateObject("internetExplorer.application")
で、オートメーション・オブジェクトを作った時に、通常IE の持っていた登録情報などは使えたのかなっていうことです。フリーログインにした状態で、IE をShell から立ち上げても、私の方は、弾かれたので、以下のようなコードを考えてみました。

なお、
>Dim doc As HTMLDocument
今のコードの中で、これを使う部分がありますか? objIEを継続・維持している限りは、いらないような気がします。

'//
Const MADD As String = "メールアドレス"
Const MPASS As String = "パスワード"
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Sub TestIEObject()
 Dim NetObjeIE As Object
 Dim URL As String
 Dim doc As HTMLDocument
 
 Set netobjIE = CreateObject("internetExplorer.application")
 URL = "http://admin.blog.fc2.com/control.php?mode=edito …
 With netobjIE
  .navigate URL
  .Visible = True
  Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  End With
  Sleep 50 '気休め 'TimeValue 関数よりも軽いので、Sleep のほうがベター
  With netobjIE
   Dim myID
   .document.getElementById("id").Value = MADD
   .document.getElementById("pass").Value =MPASS
   If .document.getElementsByTagName("INPUT")(2).Value = "ログイン" Then
    .document.getElementsByTagName("INPUT")(2).Click
    Else
    MsgBox "ログインのボタンの状態が変わりました。", vbExclamation
    Exit Sub
   End If
  Do While .Busy Or .ReadyState <> 4: DoEvents: Loop  '画面の切り替わりを待つ
'** この後は分かりません。
  'in_str = "ログイン FC2 - 無料ホームページ"
  ''Debug.Print InStr(IE.document.Title, in_str)
  'If InStr(netobjIE.document.Title, in_str) > 0 Then 'ログインページなら
  ' Stop
  'End If
  End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
どうも、FC2のPRフレームが、特定のスポンサーの時、HPを読み込め無くてハング状態になるようです。(応答なし)
別のスポンサーの時は無問題。

こちらの JAVAかadobeのただソフトのバージョンかもう少し、詰めてみます。

コードはスマートで参考になります。

お礼日時:2017/02/03 17:46

ANo1です



失礼しました
50×40は 2秒でしたね。(^_^;)
訂正しておきます。
    • good
    • 0

こんにちは



時間設定を設けたいのであれば、それをループから抜け出す条件に加えておくのが簡明だと思います。


>これでテストしたんですが
ご呈示のコードを見てみると、
>.BusyがFalseでもDO-LOOPをぬけてくれないのです
ということはないと思います。
ただし、抜けるタイミングが意図したものとは違うようになっているのではないでしょうか。

まず、Forループの中の分岐で i>40 なら抜けるというおつもりのようですが、ループ内では1≦i≦40に制御されていますから、i>40になることはありません。
従って、この条件分岐は機能しないことになります。

また、このループの中では他には分岐する処理がないので、Forループは必ず最後まで回るということになります。
ループ内にSleep(50)がありますので、このForループは2分以上(50×40回)はかかりますから、仮にその間に.Busyの値がFalseに変わったとしても、そのままループは継続されます。
その後、Do Wileで改めて.Busyが評価され、外側のループを抜けることになると思いますので、タイミングが悪いと反応が起こるまでに2分程度かかる可能性があります。
さらには、.Busy=Trueが続いた場合は、当然ながら無限ループになります。


最初に述べたように時間制限をそのままDo Wileの条件に加えたものを、簡略化して記述してみると以下のような感じになると思います。

timeOut = Now + TimeValue("00:02:00") '←2分後を設定

Do While .Busy = True And Now < timeOut
 DoEvents
Loop

If .Busy = True Then
' タイムアウト時の処理
End If
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QVBAで3の倍数の乱数を取得する

excelのVBAのことなのですが
3の倍数で整数で乱数を取得する方法がわかりません。

これがどうしてもわからなくて困ってます。
教えてください。

Aベストアンサー

60~198のの範囲の3の倍数の乱数を発生させ、A1からA1000のセルにその値を書き込んでいます。
200は3の倍数にならないので198を上限にしています。
MyRandを呼び出すと60から198の範囲の3の倍数の乱数を返します。
(あなたが実際に使うのは、MyRandだけです)
上限を201にしたいなら、66を67に変えてください。
MyRandを呼び出す前にRandomizeを1回実行してください。そうしないと毎回同じ結果が返ります。
---------------------------------
Option Explicit
Public Sub 乱数作成()
Dim i As Long
Dim r As Long
'乱数を作成しA列へ格納する(1000回分)
Randomize
For i = 1 To 1000
r = MyRand()
Cells(i, 1).Value = r
Next
End Sub

'60から198の範囲内の3の倍数の乱数を生成する。
Public Function MyRand() As Long
MyRand = Int((66 - 20 + 1) * Rnd + 20) * 3
End Function

60~198のの範囲の3の倍数の乱数を発生させ、A1からA1000のセルにその値を書き込んでいます。
200は3の倍数にならないので198を上限にしています。
MyRandを呼び出すと60から198の範囲の3の倍数の乱数を返します。
(あなたが実際に使うのは、MyRandだけです)
上限を201にしたいなら、66を67に変えてください。
MyRandを呼び出す前にRandomizeを1回実行してください。そうしないと毎回同じ結果が返ります。
---------------------------------
Option Explicit
Public Sub 乱数作成()
Dim i As Long
...続きを読む

QVBA 再帰について

こんばんは
再帰についておしえてください。
実行結果は120となります。
F8で動作を追っていくと
Sample_subに5を渡してn<=1になるとENDIFにうつり
その後、END funtionとEndifの間をいききしております。
どうして、こういう動作をするのでしょうか?
よろしくおねがいいたします。

Sub sample()
MsgBox sample_sub(5)
End Sub
Function sample_sub(ByVal n As Integer)
If n <= 1 Then
sample_sub = 1 'ここで再帰処理は終了します。
Else
sample_sub = n * sample_sub(n - 1) 'ここで自分自身を呼び出しています。
End If
End Function

Aベストアンサー

VBA の
Function名 = 戻り値
って書き方に惑わされていませんか?
> sample_sub(5)
で呼び出したときの sample_sub=〜 と、その中の
> sample_sub = n * sample_sub(n - 1) 'ここで自分自身を呼び出しています。
にある sample_sub(n - 1) で呼び出されたときの sample_sub=〜 とは、別なものになります。
「一つの変数sample_sub」 の値が変化しているわけではありません。
ステップ実行で見ると、プログラムの同じ行を指しているので「一つの変数sample_sub」 の値が変化している」様に見えてしまいますが、そうではないのです。


別の例を用意します。
sample_sub(5) で呼び出したのと、同じ動きをする関数 sample_sub_5 を作ります。

Function sample_sub_5()
If 5 <= 1 Then
sample_sub_5 = 1
Else
sample_sub_5 = 5 * sample_sub_4()
End If
End Function

同様に4〜1を用意します

Function sample_sub_4()
If 4 <= 1 Then
sample_sub_4 = 1
Else
sample_sub_4 = 4 * sample_sub_3()
End If
End Function

Function sample_sub_3()
If 3 <= 1 Then
sample_sub_3 = 1
Else
sample_sub_3 = 3 * sample_sub_2()
End If
End Function

Function sample_sub_2()
If 2 <= 1 Then
sample_sub_2 = 1
Else
sample_sub_2 = 2 * sample_sub_1()
End If
End Function

Function sample_sub_1()
If 1 <= 1 Then
sample_sub_1 = 1
Else
sample_sub_1 = 1 * sample_sub_0()
End If
End Function


この sample_sub_5() での動作は、 sample_sub(5) とまったく同じになります。

VBA の
Function名 = 戻り値
って書き方に惑わされていませんか?
> sample_sub(5)
で呼び出したときの sample_sub=〜 と、その中の
> sample_sub = n * sample_sub(n - 1) 'ここで自分自身を呼び出しています。
にある sample_sub(n - 1) で呼び出されたときの sample_sub=〜 とは、別なものになります。
「一つの変数sample_sub」 の値が変化しているわけではありません。
ステップ実行で見ると、プログラムの同じ行を指しているので「一つの変数sample_sub」 の値が変化している」様に見えてしまいますが、そ...続きを読む

Q【VBA】IF文 複数(ネスト)の時の処理について

こんにちは。
if文についておしえてください。
以下のようなマクロがあるとします。

変数 tensuuに-1をいれて実行すると①→②のように動作し「入力エラー」と表示されます。
tensuuに120を入れて実行すると①´→②´の順に動作し「入力エラー1」と表示されます。

どして、-1のときは入力エラー1にはいかず入力エラーにいくのでしょうか?
120のときは入力エラーにはいかず入力エラー1にいくのでしょうか?

動きがよくわかりません。
IF文とELSEはどういう紐づけがされているのでしょうか?

よろしくおねがいいたします。
   
Sub t()
tensuu = -1
If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If
Else
MsgBox "入力エラー1" '②´
End If
Else
MsgBox "入力エラー" '②
End If
End Sub

こんにちは。
if文についておしえてください。
以下のようなマクロがあるとします。

変数 tensuuに-1をいれて実行すると①→②のように動作し「入力エラー」と表示されます。
tensuuに120を入れて実行すると①´→②´の順に動作し「入力エラー1」と表示されます。

どして、-1のときは入力エラー1にはいかず入力エラーにいくのでしょうか?
120のときは入力エラーにはいかず入力エラー1にいくのでしょうか?

動きがよくわかりません。
IF文とELSEはどういう紐づけがされているのでしょうか?

よろし...続きを読む

Aベストアンサー

If 〜 Then 〜 Else 〜 End If
で1セットです。

ネスト(入れ子)になったIF文というのは、 Then 〜 とか Else 〜 の〜の部分にIf文がくるものです。
ですから、外のIfを越えてしまうことはありません。
よって、一番内側から見ていけば、構造がはっきりします。


一番内側から見ます。

If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If

が1セットです。
これを 「文1」とすると元のプログラムは

If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
End If
Else
MsgBox "入力エラー" '②
End If

となります。この状態で「一番内側」を見ると

If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
End If
です。これを「文2」とすると

If tensuu >= 0 Then '①
「文2」
Else
MsgBox "入力エラー" '②
End If


余談ですが
この例の場合、外側2つは、判定内容と処理とが離れてしまい、見辛いのは確かです。
if 条件 Then A Else B は if not条件 Then B Else A と同じ、ということから、Thenでの処理とElseでの処理を入れかえれば、
条件の直ぐ下の処理が来るので、見易さが格段によくなります。

If tensuu < 0 Then '① ' tensuu<0 は not (tensuu>=0)と同じ
MsgBox "入力エラー" '②
ElseIf tensuu > 100 Then '①´
MsgBox "入力エラー1" '②´
ElseIf tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If ' ElseIfで継いでいるので、ネストにはなっていない

If 〜 Then 〜 Else 〜 End If
で1セットです。

ネスト(入れ子)になったIF文というのは、 Then 〜 とか Else 〜 の〜の部分にIf文がくるものです。
ですから、外のIfを越えてしまうことはありません。
よって、一番内側から見ていけば、構造がはっきりします。


一番内側から見ます。

If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If

が1セットです。
これを 「文1」とすると元のプログラムは

If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
...続きを読む

Qexclelのvba逆引き辞典について

これにほぼvbaのコードが網羅されるくらいほとんど載っていますでしょうか。

Aベストアンサー

質問の答えとしては、ご質問者のレベルに依存するかと思います。
別の質問のWeb コントロールなどを試みているなら、そうした専門書もあるようですが、逆引きに収録されることはありません。

翔泳社の『VBA逆引き辞典』
ふつうのユーザーが満足できるレベルにはあるかと思います。この書籍は、VBAエキスパート試験を考慮に入れたものだそうで、どうも小技が目立つような気がします。VBAは、もともと小技の連発ですから、VBAを覚えるつもりなら、お勧めかもしれません。

秀和の『ExcelVBA逆引き大全』という本もあります。
個人的には、どうも、File System Object や正規表現までサポートしているなら、こちらの方が長いあいだ使えそうだと思いますが、VBAも、いきなり高いレベルに足を踏み入れても手も付かないと思います。私は、このシリーズ(VBA, VB.Net, VB6, VC++)を持っていますが、正確さには今ひとつ落ちるけれども、最初の導入部分では、助かることが多いです。

しかし、「VBA全般」という点では、私たちが想像するよりも、遥かに難しいし、資料もさっぱり手に入りません。

それと、VBAの原点は、VB6であるということは忘れてはならないことです。VB6の書籍で役に立つと思えば、古本屋さんでもよいので、何冊か手に入れることもよいと思います。特に、アルゴリズムに関係するものは、VBAで、ネットで書いている人がいますが、わざとイレギュラーな書き方をしていて、最初から読んで組み込まないと分からないような書き方になっていたりしています。外国のものもほとんど役に立ちません。VB6で書かれたものは、かなりのレベルで移植することが可能です。

質問の答えとしては、ご質問者のレベルに依存するかと思います。
別の質問のWeb コントロールなどを試みているなら、そうした専門書もあるようですが、逆引きに収録されることはありません。

翔泳社の『VBA逆引き辞典』
ふつうのユーザーが満足できるレベルにはあるかと思います。この書籍は、VBAエキスパート試験を考慮に入れたものだそうで、どうも小技が目立つような気がします。VBAは、もともと小技の連発ですから、VBAを覚えるつもりなら、お勧めかもしれません。

秀和の『ExcelVBA逆引き大全』という本も...続きを読む

Qユーザ定義型は定義されてません

こんばんは
実行すると「ユーザ定義型は定義されてません」と表示されます。
どなたかわかる方おしえてください。
Sub m()
Dim a As New NotesSession
・・・

End Sub

Aベストアンサー

参考になるかな?

セッションオブジェクトを作成する
https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_ACCESSING_THE_DOMINO_OBJECTS_THROUGH_COM_CREATING.html

QvbaからIEを操作するための記載したさいの変数について

こんにちは
以下のスクリプトで質問があります。

objIE.documentをウオッチリストに登録して確認すると「変数なし」
htmlDocを同様に確認するとプロパティなどの要素がが表示されます。

htmlDocに代入していると思うので、
objIE.documentにも同様に表示されてもいいような気がしますが
なぜ表示されないのでしょうか?

このページを読み込んだ時objieのすべての要素をしゅとくしているのではないのでしょうか?


Sub testIE()
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット

objIE.Visible = True 'IEを表示
objIE.navigate "http://www.jreast.co.jp/" 'IEでURLを開く

Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち

DoEvents

Loop

Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット ①

Debug.Print htmlDoc.Title 'HTMLドキュメントのタイトルを表示

End Sub

こんにちは
以下のスクリプトで質問があります。

objIE.documentをウオッチリストに登録して確認すると「変数なし」
htmlDocを同様に確認するとプロパティなどの要素がが表示されます。

htmlDocに代入していると思うので、
objIE.documentにも同様に表示されてもいいような気がしますが
なぜ表示されないのでしょうか?

このページを読み込んだ時objieのすべての要素をしゅとくしているのではないのでしょうか?


Sub testIE()
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Set objI...続きを読む

Aベストアンサー

こんにちは。

>このページを読み込んだ時objieのすべての要素を取得しているのではないのでしょうか? (一部訂正)
確かに、全部取得しています。

全体的には、 objIE.document.body.innerHTML
を、テキストファイルに、落としてその中で調べることができます。

はっきりしたことは分かりませんが、対象のobjIE/WebサイトのHTMLは、全体的にはオブジェクトとしていろいろあるので、逆に雛形が作れず見れないのかと想像しています。

ふつう、私は、こういう場合の開発は、Debug ツールを使わないで、直接、IEのF12開発ツールで、画面を半分に割って、それで調べながら行っています。そして、Class や ID を切り出して、その中身を調べます。

Q(VBA)チェックボックスのclickのイベントが、プログラムからの操作でも反応してしまいます。

エクセルのマクロを作成中なのですが、
チェックボックスのTrue/Falseを他のプロシージャから直接変更すると、
clickのイベントに設定してあるはずのプロシージャが反応してしまいます。
本来、そういった操作で反応するのはchangeのイベントだと認識しているため、
意図しない挙動になってしまって困っています。何が原因でしょうか?
エクセルのバージョンは2013、VBAのバージョンは7.1です。

以下ソース
(ユーザーフォームにテキストボックス「TextBox」とチェックボックス「CheckBox」を配置)
テキストボックスに何かを入力するとチェックボックスをTrueにしますが、
そうするとCheckBox_Clickでないと表示されないはずのメッセージボックスが出てしまいます。

Private Sub TextBox_Change()
Me.CheckBox = True
End Sub

Private Sub CheckBox_Click()
MsgBox "test"
End Sub

エクセルのマクロを作成中なのですが、
チェックボックスのTrue/Falseを他のプロシージャから直接変更すると、
clickのイベントに設定してあるはずのプロシージャが反応してしまいます。
本来、そういった操作で反応するのはchangeのイベントだと認識しているため、
意図しない挙動になってしまって困っています。何が原因でしょうか?
エクセルのバージョンは2013、VBAのバージョンは7.1です。

以下ソース
(ユーザーフォームにテキストボックス「TextBox」とチェックボックス「CheckBox」を配置...続きを読む

Aベストアンサー

こんばんは。

>他のプロシージャから直接変更すると、
このように、ActiveControl で、回避すればよいと思います。
If ActiveControl.Name = CheckBox1.Name Then

なお、私なら、このようにしていると思います。TextBox が空なら、CheckBox もオフになるということです。意味が違っていたら、ご指摘ください。

Private Sub TextBox_Change()
 If Me.TextBox.Text <> "" Then
  Me.CheckBox.Value = 1
 Else
  Me.CheckBox.Value = 0
 End If
End Sub
Private Sub CheckBox_Click()
 '直接処理しないと、MsgBox は働かない。
 If ActiveControl.Name = CheckBox.Name Then
   MsgBox "Test"
 End If
End Sub

Qオブジェクト指向の壁

Java言語などは「オブジェクト指向」が売り?だと思うのですが
素人や初心者が、ぶち当たる「オブジェクト指向の壁」って何だと思いますか?

暇な時にでも回答ください。

Aベストアンサー

多分無い
思考停止状態でもプログラミングできるのがオブジェクト指向みたいなものです
まあこれは言いすぎかもですけどw

ただし、しっかりと理解をしようとすると
カプセル化、継承、ポリモーフィズムなど
オブジェクト指向の基本機能が奥が深すぎて難しい気がする

私自身、オブジェクト指向は普段使わないので、説明できないです。
なんとなくこんなものとふんわりと理解はしていますが
正確な説明や、使い道などが全然分かりません

このふんわりとした理解でも使えてしまうのが
オブジェクト指向の欠点
内部の動作を理解できていなくてもプログラムが組めてしまうので
予想外なバグに対応できない初心者が多いみたいです

オブジェクト指向から入ったプログラマーが嫌われがちなのはこういった背景があります

Qボタン一個で表示非表示切り替えマクロについて教えてください。 長文失礼します。マクロ初心者です。 ま

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 後期
7 空白 実績
ーーーーーーーーーーーーーーーーーーーーー

・ (★3行ずつ×10〜15コ分続く)
・ (★取引名がないとこは3行とも空白)
ーーーーーーーーーーーーーーーーーーー
20 小計 前期計
21 後期計
22 合計
23 実績計 (★小計欄は4行)
ーーーーーーーーーーーーーーーーーーーーーー
ここまでで1項目、(運用、保守などで区切っています)
次は保守の、同じのが。という風に1000行以上続きます。

別のファイルの取引no.と一致したら費目金額を反映させるマクロを取り込みボタンに設定中なので、
このフォーマットは変えられません。

そして、今回作成しなければならないのが、
表示非表示切り替えボタンです。
3行の一番上に取引名が入り、下2行は空白です。
一番上に取引名が入ってなかったら、以下の3行まとめて非表示/表示を切り替えたいんです。
現状、基本は1項目につき3行ずつ×10ですが
取引名が多数あるものはその分増やしているので統一はしていません。

また、各項目1つでも取引名があれば小計欄は非表示しない。
0だったら小計欄も非表示にする。
というルールです。


先方のお願いは
ボタン一個で、表示をクリックしたら表示され、ボタンの名前は非表示に変わり、非表示をクリックしたら非表示になり、名前は表示に、ということなのですが、


全然できてないのですが、
私が今考えていたコードは

If 切り替え.Caption = ”表示” Then
For i = 2 To LastRow Step 3
★まずここで、3行ずつ回すも、小計欄は4行なのでどうしたらいいのか
続き

If Cells(i,1) <> ”” And _
Cells(i,1) <> ”小計” Then
icnt = icnt + 1
EndIf
値があったらカウントし
後に、icnt>=1 Then
小計欄は残す、という流れをイメージしたのですが…


If Cells(i,1)= ”” Then
Rows(i).Hidden

If Cells(i,1) = ”小計” Then
If icnt>=1 Then
という流れにする場合、
もし残すなら、
次の項目からまたスタートとなるにはどうすればいいのか…
非表示の場合まとめて4行はアクティブセル+3という式にしたらいいのか、、
すみませんがもしよろしければコードをご教示ください。

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 ...続きを読む

Aベストアンサー

こんにちは

ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうまくいかないと思います。

一例として、調べる対象の行(先頭行)を変数rwとして、順に見ていくものと考えた場合

 rw = 2 '←対象行の初期値
 Do While rw <= LastRow
  If Cells(rw, 1).Value = "小計" Then
   '小計の場合の処理
   ' ~~~
   rw = rw + 4 '←次の行(4でよいのか不明ですが)
  Else
   '3行セットの場合の処理
   ' ~~~
   rw = rw + 3 '←次の行
  End If
 Loop

のような考え方にすれば、対象の行数が異なる場合でも、条件分けして処理をすることで、次に参照する行までの行数を変えることが可能です。
上の例では、小計欄の4行の1行目には必ず「小計」と記されていて、それで識別しても良いとの保証があるものと仮定しています。(取引名には「小計」というものは絶対に存在しないなど)

こんにちは

ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうま...続きを読む

QエクセルVBA 文字列の分解について

こんばんは
変数 shetに「2007年2月」という文字列がはいっております。
これをそれぞれ2007と2に分けるため、いかのようにいたしました。
もうすこしスマートに記載する方法はございませんでしょうか。
(変数や配列などをこのために2つ使っており非常に見にくいと思っているため)

tmps = Split(shet, "年")
qw = tmps(0)
qw1 = tmps(1)
tmps1 = Split(qw1, "月")
qr = tmps1(0)

以上 宜しくおねがいいたします。

Aベストアンサー

二種類のマクロを提示します。Basp21 というのは、フリーのPerl ライクの正規表現オブジェクトです。VBAは、Lispのような言語ではないので、それなりの書き方に決まってきてしまいます。

Sub TextConvert()
 Dim text_date As String
 Dim bufDate As Variant
 Dim y As Integer, m As Integer
 text_date = "2007年2月"
 bufDate = DateValue(text_date)
 y = Year(bufDate)
 m = Month(bufDate)
End Sub

'Basp21の利用で、配列に入れる場合
Sub Basp21Test()
'配列に入れるなら、PerlライクのBasp21で切り分けます
 Dim text_date As String
 Dim bufDate As Variant
 Dim y As Integer, m As Integer
 Dim ar
 Dim bobj As Object
 Set bobj = CreateObject("Basp21")
 text_date = "2007年2月"
 ar = bobj.Split("/[年月]/kg", text_date)
 y = ar(0)
 m = ar(1)
End Sub

二種類のマクロを提示します。Basp21 というのは、フリーのPerl ライクの正規表現オブジェクトです。VBAは、Lispのような言語ではないので、それなりの書き方に決まってきてしまいます。

Sub TextConvert()
 Dim text_date As String
 Dim bufDate As Variant
 Dim y As Integer, m As Integer
 text_date = "2007年2月"
 bufDate = DateValue(text_date)
 y = Year(bufDate)
 m = Month(bufDate)
End Sub

'Basp21の利用で、配列に入れる場合
Sub Basp21Test()
'配列に入れるなら、PerlライクのBasp21で...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング