IE操作のVBAでF8キーを使いステップイン編集すると異常終了するようになってしまいました。
ステップイン編集中、①でF8を押して②が反転した瞬間「MicrosoftExcelは動作を停止しました 問題を解決しています」のダイアログが出て終了してしまいます。

Sub IE起動()

Dim IE As Object

①Set IE = CreateObject("internetExplorer.application")
②IE.Visible = True 
IE.navigate ("http://www.goo.ne.jp")

End Sub

ステップイン編集時のみ起こり、マクロボタンを作ってそこから実行すると普通に実行できます。
つい最近までは普通に編集できていました。症状に気付いたのは昨日からです。
環境はwindows7、EXCEL2013、IE11です。

どなたか対処法をご存知でしょうか。よろしくお願いします。

A 回答 (2件)

#1の回答者です。



>通過する瞬間、異常終了してしまいます。F5キーや実行ボタンでは普通に動作します。
おそらく、セキュリティのどこかに触れているのだろうと思います。

試してみると、こちらでは、エラーが出る場合とそうでない場合がありますが、私の場合は、いわば通過儀礼の部分をステップで追うということはしませんし、例えば、Active X コントロールをステップインするのと同じで、エラーは出ても、オートメーション・オブジェクトを生成する段階で、割り込みを入れてエラーが出ることに、あまり疑問を持ったことがありません。

ステップイン(F8)と、実行(run)との違いは、前者はインタープリタ型で、後者は、コンパイル(P-code)されていますから、ステップインとは必ずしも仕様自体が同じではありません。

ここ何度か、IE は、バージョンを挙げたようで、Microsoft 側では、さかんに、Microsoft Edge を使ってほしいような様子です。しかし、Edge をVBAで本格的に使うには、Selenium VBAを利用するということになりますが、思った以上に情報が豊富ではありません。

私の場合は、ステップインをする場合は、IEオブジェクトの横取りの方が多いと思います。そうしないと、IEオブジェクトだらけになってしまいます。(.Visible = True なら手動で終わらせますがキリがないですからね)

つまり、開いているIE画面からIEオブジェクトを、ShellWin
Set objShellWin = CreateObject("Shell.Application").Windows()
取って、それから、操作をするということです。単純に、そのobjShellWinから、IE オブジェクトを引き出してもよいのですが、複数のIEオブジェクトから目的のオブジェクトを取り出すには、テクニックが必要だと思います。
    • good
    • 0
この回答へのお礼

大変詳しい解説をありがとうございます。

お話が高度すぎて半分も理解できていないのですが、
>いわば通過儀礼の部分をステップで追うということはしませんし
これを参考に、エラーが出るコードの後ろにブレイクを作り、実行ボタンでブレイクまで進んでしまって、そこからステップインで動作確認という流れでなんとかしようと思います。(自分はまだ動作確認しながらでないとコードが書けない)

IEオブジェクトの使いまわしや開放のお話も大変参考になりました。
セキュリティも確認しておらず根本は解決していないのですが、とりあえず急場は凌げそうです。いろいろとご親切にありがとうございました。

お礼日時:2017/09/18 00:21

私の最近のマクロは、インターネットアクセスが中心ですが、



'//
 Dim objIE As SHDocVw.InternetExplorer '参照設定済みInternet Controls
 Dim strURL As String
 Set objIE = New ShDocVw.InternetExplorer
 strURL ="https://oshiete.goo.ne.jp/articles/qa/2817/"
'----Set in
 objIE.Navigate2 strURL 'Navigate だと、単独になる
 objIE.Visible = True 'なしでも可能
 Do While objIE.Busy Or objIE.ReadyState <> 4: DoEvents: Loop
'-----Set out
'//
'●
このように、Set in - Set out は常に崩さないことです。ただし、Do - Loop間でエラーが発生した時のために、DoEvents は、ESC で抜けるために入っています。

本格的には、参照設定で、Internet Controls を使ったほうが安全です。
もし、ステップインにするなら、安定化した後●に、ブレークポイントを入れてくたさい。

ShDocVw.InternetExplorer は、古い書き方ですが、安定しているような気がします。
    • good
    • 0
この回答へのお礼

すぐにご回答いただきありがとうございます。

先に結論を書きますと、上記のマクロをコピーペーストしてステップインで実行しましても3行目、
Set objIE = New ShDocVw.InternetExplorer
を通過する瞬間、異常終了してしまいます。F5キーや実行ボタンでは普通に動作します。
Internet Controlsの参照設定は忘れており、ご指摘後に参照設定しました(汗)

お礼日時:2017/09/17 15:20

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

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

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

Qエクセルでの和暦から西暦への変換について お願いします。 列に、昭和と平成が入り混じって入力してあり

エクセルでの和暦から西暦への変換について



お願いします。
列に、昭和と平成が入り混じって入力してあります。
昭和50年8月30日生まれであれば、500830。
平成2年12月4日生まれであれば、021204。

この、6桁の数字を西暦0000/00/00と変えたいのですが、どのような方法があるのか教えて頂きたいです。

又、その西暦を使用して、違う列に年齢が出るようにしたいのです。

よろしくお願いいたします。

例 550828→1980/8/28→38歳

Aベストアンサー

裏技を使いました。数字を分解する必要はありません。

A1:500830
=DATEDIF(DATEVALUE(IF(LEFT(TEXT(A1,"000000"),2)*1>29,"S","H")&TEXT(A1*1,"00!/00!/00")),NOW()+1,"Y")

ポイント:*1>29,
平成30の生年月日は存在しないので、昭和にしました。

うまくない場合は、
DATEDIF(DATEVALUE("S" & TEXT(A1*1,"00!/00!/00")),NOW()+1,"Y")
としても可能です。マニュアルですが、S-昭和, H-平成, M-明治を入れます。

問題はここ:NOW()+1
法律的には誕生日の前日午後12時に1歳年齢が加算されるというそうで、+1 にするそうです。つまり、4月1日生まれは早生まれになるわけです。

ひとつ条件があるのは、数字は、数値にしていることだけです。書式文字列(@)にしてしまうと、うまく行きません。逆に、文字列接頭辞(')を使っていたら、最初のLEFT(TEXT(A1,...),2)が不要です。

裏技を使いました。数字を分解する必要はありません。

A1:500830
=DATEDIF(DATEVALUE(IF(LEFT(TEXT(A1,"000000"),2)*1>29,"S","H")&TEXT(A1*1,"00!/00!/00")),NOW()+1,"Y")

ポイント:*1>29,
平成30の生年月日は存在しないので、昭和にしました。

うまくない場合は、
DATEDIF(DATEVALUE("S" & TEXT(A1*1,"00!/00!/00")),NOW()+1,"Y")
としても可能です。マニュアルですが、S-昭和, H-平成, M-明治を入れます。

問題はここ:NOW()+1
法律的には誕生日の前日午後12時に1歳年齢が加算されるというそうで、+1 にす...続きを読む

Qダブルクリックしたセルの4行下の値を得るにはマクロでどう書きますか

よろしくお願いします。
いつもgooの皆さんには大変お世話になっています
エクセルは2013です

ダブルクリックしたセルの4行下のセルの値を得るには
MsgBox "4行下の値は" に続いてどう書けば良いでしょうか

セルの数だけ延々とIfで書く方法しか思いつきません
If Not Intersect(Target, Range("H37,J37,K37,N37")) Is Nothing Then
 Cancel = True
 If Target.Address = "$H$37" Then
 MsgBox "4行下の値は" & Range("H41")
 End If
 If Target.Address = "$J$37" Then
 MsgBox "4行下の値は" & Range("J41")
 End If

 続く

End If

Ifを使わずに一行で求める方法はないでしょうか

If Not Intersect(Target, Range("H37,J37,K37,N37")) Is Nothing Then
 Cancel = True
 MsgBox "4行下の値は" & ダブルクリックされたセルの4行下のセルの値
End If

よろしくお願いします。
いつもgooの皆さんには大変お世話になっています
エクセルは2013です

ダブルクリックしたセルの4行下のセルの値を得るには
MsgBox "4行下の値は" に続いてどう書けば良いでしょうか

セルの数だけ延々とIfで書く方法しか思いつきません
If Not Intersect(Target, Range("H37,J37,K37,N37")) Is Nothing Then
 Cancel = True
 If Target.Address = "$H$37" Then
 MsgBox "4行下の値は" & Range("H41")
 End If
 If Target.Address = "$J$37" Then
 MsgBo...続きを読む

Aベストアンサー

こんばんは。

簡単に書けば、こういうことなのですが、もっと難しい話なのでしょうか?

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
MsgBox Target.Offset(4).Value
End Sub

Qエクセル セル内の除去について

エクセルのセル一つについて 「〇○○  ×××  」と文字○があった場合、〇○○の右の空白のスペースからすべて右側を×××を含めて除去する方法はありませんか。〇○○、×××の文字、文字数はセルごとに違うものとします。

Aベストアンサー

例えば、
A1に、

> 「〇○○  ×××  」

が入力されているとして、

B1に、
=FIND(" ",A1)
で最初に空白文字が現れる文字の場所を取得。

C1に、
=LEFT(A1,B1-1)
で最初に空白が現れるより左の文字列を取得。

とか。

Q【エクセル VBA】条件式 以下を作成したいです。 1.F列が「○」だったら、C列の値をG列に持って

【エクセル VBA】条件式
以下を作成したいです。

1.F列が「○」だったら、C列の値をG列に持ってくる
2.G列の値は重複しないようにする(G列に既に同じ値があれば無視する)
3.G列には「1-Path=~(Cの値)」ということ形式にする



わかる方よろしくお願いします。

Aベストアンサー

以下のマクロを標準モジュールに登録してください。

Option Explicit
Public Sub 値設定()
Dim dicT As Object
Dim maxrow As Long
Dim row As Long
Dim number As Long
Dim key As Variant
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
maxrow = Cells(Rows.Count, "C").End(xlUp).row
number = 1
For row = 2 To maxrow
Cells(row, "G").Value = ""
If Cells(row, "F").Value = "○" Then
key = Cells(row, "C").Value
If dicT.exists(key) = False Then
Cells(number + 1, "G").Value = number & "-Path=" & key
dicT(key) = True
number = number + 1
End If
End If
Next
MsgBox ("完了")
End Sub

以下のマクロを標準モジュールに登録してください。

Option Explicit
Public Sub 値設定()
Dim dicT As Object
Dim maxrow As Long
Dim row As Long
Dim number As Long
Dim key As Variant
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
maxrow = Cells(Rows.Count, "C").End(xlUp).row
number = 1
For row = 2 To maxrow
Cells(row, "G").Value = ""
If Cells(row, "F").Value = "○" Then
key = Cells(row, "C").Value
...続きを読む

Qエクセルで英文の単語を行から列へ移す方法ってありますか?

例えば This is a dog. という文章をA1のセルに入力して、それを縦列に単語単位で移し替えたいのです。

this
is
a
dog
というようにする方法はあるでしょうか?スペースやピリオドを分離記号として使えればいいような気がしますが、これを何百行の文章でやりたいのです。これで単語帳を作れればと思っています。

Aベストアンサー

私自身も、同じようにやっていましたが、例えば、Japan Times のNews を利用したりします。

Excelだけでというのは、少し無理がありますが、データ-区切り位置ウィザードを使えばある程度は可能です。それと同じようにマクロで作る方法もあります。

かつては、文章を入れると、リスト(難易度により区分けされる-訳も付く)ができるシャープのツールやIBMのツールが市販であったのですが、軒並みなくなってしまいました。

その代わりに、例えば、代わりにコンコーダンサーというツールがあります。一種のデータベースから作り上げます。
http://forest.watch.impress.co.jp/article/2006/03/14/okiniiri.html

もし、興味があれば、お試しください。
他にも、FireFox 等と、Weblioを結びつけた単語の拾い出しツールがあったはずです。
現在、なぜ辞めてしまったのかというと、そういう方法では間に合わなくなったからです。今は、十数年ぶりにベストセラーの単語帳(Word Power Made Easy)を使うことにしました。

私自身も、同じようにやっていましたが、例えば、Japan Times のNews を利用したりします。

Excelだけでというのは、少し無理がありますが、データ-区切り位置ウィザードを使えばある程度は可能です。それと同じようにマクロで作る方法もあります。

かつては、文章を入れると、リスト(難易度により区分けされる-訳も付く)ができるシャープのツールやIBMのツールが市販であったのですが、軒並みなくなってしまいました。

その代わりに、例えば、代わりにコンコーダンサーというツールがあります。一種のデー...続きを読む

Qマクロ 繰り返しコピー方法

いつもお世話になっております。
マクロ初心者です。

2つのシートで、【Sheet3】シートから【Aタイプ】シートへコピーします。
Sheet3→一覧表。Aタイプ→請求書となります。
№1~№45まで繰り返しコピー&ペーストします。
下記の通り№1と№2で作成しましたが、45回繰り返し作成する方法がわかりません。
おわかりの方、ご教示願います。


Worksheets("Sheet3").Range("F4").Copy    ’№1
Worksheets("Aタイプ").Range("E9").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("G4").Copy Worksheets("Aタイプ").Range("A9:C9")
Worksheets("Sheet3").Range("D4").Copy
Worksheets("Aタイプ").Range("A11").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("U4").Copy
Worksheets("Aタイプ").Range("E19").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("K4").Copy
Worksheets("Aタイプ").Range("F20").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("L4").Copy
Worksheets("Aタイプ").Range("F21").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("M4").Copy
Worksheets("Aタイプ").Range("F22").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("N4").Copy
Worksheets("Aタイプ").Range("F23").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("Z4").Copy
Worksheets("Aタイプ").Range("E24").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AB4").Copy
Worksheets("Aタイプ").Range("E25").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AC4").Copy
Worksheets("Aタイプ").Range("G26").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("H4").Copy
Worksheets("Aタイプ").Range("F27").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AF4").Copy
Worksheets("Aタイプ").Range("G28").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("Q4").Copy
Worksheets("Aタイプ").Range("G29").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("R4").Copy
Worksheets("Aタイプ").Range("G30").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AH4").Copy
Worksheets("Aタイプ").Range("G31").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AI4").Copy
Worksheets("Aタイプ").Range("G32").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AK4").Copy
Worksheets("Aタイプ").Range("G33").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("AL4").Copy
Worksheets("Aタイプ").Range("G34").PasteSpecial Paste:=xlPasteValues

Worksheets("Sheet3").Range("F5").Copy   ’№2
Worksheets("Aタイプ").Range("E51").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("G5").Copy Worksheets("Aタイプ").Range("A51:C51")
Worksheets("Sheet3").Range("D5").Copy
Worksheets("Aタイプ").Range("A53").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Range("U5").Copy
Worksheets("Aタイプ").Range("E61").PasteSpecial Paste:=xlPasteValues

いつもお世話になっております。
マクロ初心者です。

2つのシートで、【Sheet3】シートから【Aタイプ】シートへコピーします。
Sheet3→一覧表。Aタイプ→請求書となります。
№1~№45まで繰り返しコピー&ペーストします。
下記の通り№1と№2で作成しましたが、45回繰り返し作成する方法がわかりません。
おわかりの方、ご教示願います。


Worksheets("Sheet3").Range("F4").Copy    ’№1
Worksheets("Aタイプ").Range("E9").PasteSpecial Paste:=xlPasteValues
Worksheets("Sheet3").Ra...続きを読む

Aベストアンサー

>下記の部分は全コピーですが、この部分のみが動きません。
>Worksheets("Sheet3").Range("G4").Offset(fromRow).Copy Worksheets("Aタイプ").Range("A9:C9").Offset(toRow)

こちらの環境では正常に動作しています。
1回目(G4)と2日目(G5)ですが、添付のような結果になります。
これが、望んだ結果だと思いますが、いかがでしょうか。

QExcelで順位表を作りたい

こんにちは、
エクセルで添付のようなA1~G9の表から順位表を作りたいと思っています。
(目的はA13からC15を作りたい)
(本当はもっと沢山の人がいますがとりあえずサンプルは3人です)


最初C列をRANK関数を使ってみたのですが、C,E,G列など飛び飛びの列ではうまくいきませんでした
^^;
何か効率的に関数などをつかって作る方法はありますでしょうか?
もし解る方がいましたらよろしくお願いします

Aベストアンサー

》 実は実際の表ではB9,E9,G9に合計の回数の合計が入ります
後出しジャンケンは狡いです。(^_^)
添付図のような対策を採ったけど如何でしょうか?

添付図では次の変更をしています。
11.式 =IF(C$2="点",C9,"") を入力したセル C11 を右4列にオートフィル
12.セル B10 の式 =RANK.EQ(C9,$C$9:$G$9) を =RANK.EQ(C9,$C$11:$G$11)
 ̄ ̄に変更して、そのセルを右4列に再オートフィル

再度の「実は…」はご勘弁を。

QExcelである地点に一番近い座標を検索したい

ある地点(緯度、経度)に一番近い地点を検索するためにエクセルのVBAで
実現するにはどうしたらいいでしょうか?

シート2にA列に緯度、B列に経度で表される点の集合(A1、B1)~
(A1000、B1000)があります。
シート1の(A1、B1)にある(緯度、経度)を入力した場合に、そこ
から距離が一番近い点をシート2の一覧から検索し、シート1の(C1,D1)
に表示させたいのですがどのようにすればよいか教えてください。

ちなみに座標は世界測地系となります。
よろしくお願いいたします。

Aベストアンサー

ANo1です

>VBAでの記述方法が知りたかったため質問させていただきました。
コードの記述法は一通りと決まっているわけではありません。
特に、ご質問のような全体的な質問だけを行うと、それを解決するプログラムを10人の人が作成すれば、十人十色で様々なプログラムができることでしょう。

それぞれが同じ答えを出しますが、考え方や実際のコードも様々です。
仮にそのうちの一つを得たところで、それがベストな解法という保証はありませんし、唯一の解法というわけでもありません。
勉強中とのことですが、(考え方は理解できているようですので)まずはご自身でコード化してみて、その上でわからないことを具体的に質問なされば、より適切な回答が得られるものと思います。

「どこから手を付けてよいのかわからない」、「サンプルが見てみたかっただけ」というのであれば、ネットで検索すれば(ご質問の問題とは異なりますが)プログラムのサンプルはいくらでも見つかるはずですし、それについての解説もされていることでしょう。
それを見て勉強になるなら、それを何度か繰り返した方が早いでしょう。

考え方がわかっているのなら、一つの方法として、処理の手順をできるだけ細分化して書いてみるという方法があると思います。
文章の方が書きやすければ文章で、フロー的に書きたければそれでも良いです(いわゆるフローチャート)
細分化してゆくことによって、ほとんどプログラムのコードと同じレベルの文章にすることも可能です。
例えば、ご質問の距離の最小値とその位置(=セルの位置)を求める手順なら、
-------------------------------------------
1)最小値を記憶する変数(例:distance)とそのセル位置を記憶する変数(例:rw)を用意する。
2)distanceには、考えられる大きな値を初期値としてセットする
(例:地球1周分の距離など)

ここまでが、準備処理です。
3)以下の4)、5)を1行目から1000行目までループ
  4)n行目の座標値から距離を求め、それがdistanceより小さければ
    5)distanceにその距離を記憶し、rwにその行番号を記憶
  大きな場合は何もしない。
ここまでをループ

6)上記ループを終了すると、distanceに最小値が、rwにはその行位置が代入されているので、それを利用して後の処理を行う
-------------------------------------------
といったように書き表せます。
ここまでは「記述法」というよりは「処理手順を考える」話と言えるでしょう。
このくらいまで細分化しておけばほぼコード化が可能と思いますが、もう少し詳細に書き表せば、そのままコード化ができるようになるでしょう。

上記の1)~5)くらいまでの表現になれば、十人十色とはいえ、ほぼ同様のプログラムになるものと想像できます。
面倒だと思うかも知れませんが、このような手順を踏むことで、だんだん頭の中でもある程度の処理を組み立てられるようになるはずと思います。

細分化した手順を記述できない場合は、「記述法」の問題というよりも、どのようにして処理すればよいのかの考え方がわからないということになりますので、そちらを勉強なさった方が良いでしょう。
(VBAに限らず、プログラムに共通する考え方と言えます)


さて、こんなことばかり書いていても「知りたいことが何もわからない!」とおっしゃるかもしれませんので、少しだけ具体的な例を・・・
実は、上記の1)~5)で細分化していない部分があります。
それは、No1でも触れた、距離計算の部分です。
考え方はNo1にも記しましたが、それをコード化した一例を示してみます。
(以下は高校幾何レベルの計算法なので、もっと要領の良い記述法があると思います)
-------------------------------------------
DefDbl D, P, S

Function spherDistance(ByRef p1 As Range, ByRef p2 As Range) As Double
 Dim s1, s2, dx, dy, dz, p
p = WorksheetFunction.Pi() / 180 '角度変換係数(deg→rad)
Const r = 6378137 '設定半径

 s1 = Cos(p1(1).Value * p)
 s2 = Cos(p2(1).Value * p)
 dx = s2 * Cos(p2(2).Value * p) - s1 * Cos(p1(2).Value * p)
 dy = s2 * Sin(p2(2).Value * p) - s1 * Sin(p1(2).Value * p)
 dz = Sin(p2(1).Value * p) - Sin(p1(1).Value * p)

 spherDistance = 2 * r * WorksheetFunction.Asin(Sqr(dx * dx + dy * dy + dz * dz) / 2)
End Function
-------------------------------------------
2点間の距離計算の部分だけを関数spherDistanceとしたものですが、全部をVBAで処理するなら上記の4)の部分で一度だけしか利用しないので、わざわざ関数化する必要もないでしょう。
(ループ内に直接記述する方が効率的に記述できるので)
敢えて関数化したのは、VBAからも参照できる他に、ANo2様が回答なさっている、エクセルの関数利用での解法にも利用できるからです。
計算に使用している半径はgoogle map(V2の頃)で使われていた、6378137mをとりあえず設定しています。
(記事を検索してみましたが、旧いせいか見つかりませんでした。代わりに、その頃の半径に関する質問と回答を見つけました)
https://groups.google.com/forum/#!topic/google-maps-api/mw8kYD0Zga4

上記関数の利用方法は、VBAモジュールに記述した上で、spherDistance(座標1, 座標2) で呼び出すと、2点間の距離が返されます。
例えば(A列,B列),(C列,D列)に2点の座標(緯度、経度)があり、これらの距離をE列に求めたければ、E1セルに
 = spherDistance(A1:B1, C1:D1)
の式を入力し、下方にフィルコピーすれば、それぞれの2点間の距離が求められます。
ご質問のケースでは、2点のうちの1点は固定なので、絶対指定をすれば良いことになります。
距離が求められれば、No2様が回答なさっていらっしゃるように、最小値を探してその座標を参照するような仕組みにすることで、関数だけでも解決できますね。

ユーザ関数を利用せずに、通常のエクセル関数だけで距離を求める式を作成してみるなら、
=2*半径*ASIN(SQRT((COS(C1*角換算)*COS(D1*角換算)-COS(A1*角換算)*COS(B1*角換算))*(COS(C1*角換算)*COS(D1*角換算)-COS(A1*角換算)*COS(B1*角換算))+(COS(C1*角換算)*SIN(D1*角換算)-COS(A1*角換算)*SIN(B1*角換算))*(COS(C1*角換算)*SIN(D1*角換算)-COS(A1*角換算)*SIN(B1*角換算))+(SIN(C1*角換算)-SIN(A1*角換算))*(SIN(C1*角換算)-SIN(A1*角換算)))/2)
のように表すことも可能です。これをフィルコピーしても同様の結果が得られます。
(式は長いですが、上記のユーザ関数とまったく同じ内容です)
(式中の「半径」,「角換算」は、名前の定義で半径と角度の換算係数となるように設定しておきます。実際の式を組込むともっと長い式になってしまいますので…)


・・・なんだか話が脱線してしまいました。
上記手順の4)の「距離を求め」のところでspherDistance()と同様な計算を行うか、そのまま関数を利用すれば距離が求められますので、その他の部分は、文章で表した内容をコード化すれば良いことになります。

※ お勉強中とのことなので、敢えて直接の回答を示さない方法をとりました。
  単に、結果だけを得ても、何の勉強にもならないと考えましたので・・・

ANo1です

>VBAでの記述方法が知りたかったため質問させていただきました。
コードの記述法は一通りと決まっているわけではありません。
特に、ご質問のような全体的な質問だけを行うと、それを解決するプログラムを10人の人が作成すれば、十人十色で様々なプログラムができることでしょう。

それぞれが同じ答えを出しますが、考え方や実際のコードも様々です。
仮にそのうちの一つを得たところで、それがベストな解法という保証はありませんし、唯一の解法というわけでもありません。
勉強中とのことですが、(...続きを読む

Qエクセルで 異なるデータを含む2つのデータを 1つの表にまとめる方法を教えてください

初めて質問をします。
あまりエクセルが詳しくなく わからないので 教えて下さい。

2つのデータがあります。
Aには仕入れ数、Bには売り上げ数があります。
双方の商品名はすべて一致するわけではなく、「AにあってBにない」「BにあってAがない」ものもあります。


    データA 【仕入れ】     データB 【売上】

管理No 商品  仕入れ数   管理No 商品   売上数
   1  りんご  3        2  みかん  8
   2  みかん  8       3    バナナ    3
   3  バナナ    4      1  りんご    2
   4  いちご    1      7   もも     3
   5  オレンジ  3      10    キウイ     2
   6  レモン    3     11    ぶどう     2
   7  もも     3     13    大根      1
   8  なし     2
   9  カキ    5
  10  キウイ  2
  11  ぶどう    1
  12   マンゴー   1


上記の2つのデータを以下のようにまとめたいのですが 可能でしょうか?
(ABすべての商品名を出して それぞれの数を表示する)

管理No   商品    仕入れ数      売上数
   1   りんご      3        2
   2   みかん      8      8
    3   ばなな      4        3
   4   いちご      1        0
   5    オレンジ  3        0
   6   レモン      3     0
   7   もも       3     3
   8   なし       2     0
   9   カキ      5     0
   10   キウイ      2      2
   11   ぶどう      1       2
   12   マンゴー    1      0
   13   大根      0      1
      


数字がずれていてすみません。
どうぞよろしくお願いします。

初めて質問をします。
あまりエクセルが詳しくなく わからないので 教えて下さい。

2つのデータがあります。
Aには仕入れ数、Bには売り上げ数があります。
双方の商品名はすべて一致するわけではなく、「AにあってBにない」「BにあってAがない」ものもあります。


    データA 【仕入れ】     データB 【売上】

管理No 商品  仕入れ数   管理No 商品   売上数
   1  りんご  3        2  みかん  8
   2  みかん  8       ...続きを読む

Aベストアンサー

こんにちは!

>(ABすべての商品名を出して それぞれの数を表示する)
というコトですので、手っ取り早くVBAでの一例です。

↓の画像のようにそれぞれのシート名は「仕入れ」・「売上」となっていて、Sheet3に表示するとします。
尚、「商品」の「管理No」はシリアルナンバーのように決まっているものとします。
そして、Sheet3の1行目項目行は入力済みという前提です。

Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() '//この行から//
Dim i As Long, lastRow1 As Long, lastRow2 As Long, lastRow3 As Long
Dim c As Range, r As Range
Dim wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("仕入れ")
Set wS2 = Worksheets("売上")
Application.ScreenUpdating = False
With Worksheets("Sheet3") '//←「Sheet3」はまとめるシート名に!"//
lastRow3 = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow3 > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow3, "D")).ClearContents
End If
.Range("E:F").Insert
lastRow1 = wS1.Cells(Rows.Count, "A").End(xlUp).Row
Range(wS1.Cells(1, "A"), wS1.Cells(lastRow1, "A")).Copy .Range("E1")
lastRow2 = wS2.Cells(Rows.Count, "A").End(xlUp).Row
Range(wS2.Cells(2, "A"), wS2.Cells(lastRow2, "A")).Copy .Cells(Rows.Count, "E").End(xlUp).Offset(1)
.Range("E:E").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("F1"), unique:=True
.Range("F:F").Sort key1:=.Range("F1"), order1:=xlAscending, Header:=xlYes
lastRow3 = .Cells(Rows.Count, "F").End(xlUp).Row
Range(.Cells(2, "F"), .Cells(lastRow3, "F")).Copy .Range("A2")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
Set c = wS1.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
.Cells(i, "B") = c.Offset(, 1)
.Cells(i, "C") = c.Offset(, 2)
End If
Set r = wS2.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
If .Cells(i, "B") = "" Then
.Cells(i, "B") = r.Offset(, 1)
End If
.Cells(i, "D") = r.Offset(, 2)
End If
Next i
.Range("E:F").Delete
.Columns.AutoFit
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub '//この行まで//

※ 関数でないので、データ変更があるたびにマクロを実行する必要があります。

※ コード内の「Sheet3」の部分は実際のシート名に変更してください。m(_ _)m

こんにちは!

>(ABすべての商品名を出して それぞれの数を表示する)
というコトですので、手っ取り早くVBAでの一例です。

↓の画像のようにそれぞれのシート名は「仕入れ」・「売上」となっていて、Sheet3に表示するとします。
尚、「商品」の「管理No」はシリアルナンバーのように決まっているものとします。
そして、Sheet3の1行目項目行は入力済みという前提です。

Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → ...続きを読む

Qエクセル 数式を教えてください!

エクセルの数式を教えてください!

エクセルでタイムカードを作成しているのですが、休憩時間が2枠ある場合(①通常時間帯②深夜時間帯)の各時間(拘束時間・労働時間・日勤時間・通常残業・深夜
時間・深夜残業)の算出数式が分かりません。

画像のように、休憩時間は①通常時間帯と②深夜時間帯(22:00~5:00)の2枠あり、それぞれ合計時間を数値で入力します。
各時間帯の休憩時間がそれぞれ、
・拘束時間・労働時間・日勤時間・通常残業・深夜時間・深夜残業に反映させるようにしたいのですが、休憩が2枠あるため数式がうまくいきません。。

深夜帯(深夜時間・深夜残業)は22:00~5:00で、1日の労働時間が8時間を超えた場合に残業となります。

画像のように、【拘束時間・労働時間・日勤時間・通常残業・深夜時間・深夜残業】に適切な数値(出勤退勤はh:mmで入力し、その他は15分=0.25単位の数値)で計算されるようにしたいです!

賢者の皆様、どうか宜しくお願い致します!

Aベストアンサー

ANo3です。

>15分を0.25と数値で計算させる方法がわからないので
シリアル値は1日が1.0となるように計算しています。

シリアル値の時間をTとするなら
 =HOUR(T)+MINUTE(T)/60
とすることで、時間単位(15分は0.25時間)に該当する値を得られます。
例えば、3:15 → 3.25 となります。

上記の1日=1.0(1日=24時間)を利用すれば、もっと簡単に
 =T*24
とすることでも、同様の結果を得ることができます。

※どちらの場合も、表示書式は「数値」や「標準」としておく必要があります。


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

人気Q&Aランキング