← 文法解説一覧に戻る

現在完了形

過去に起きたことが今の状態につながっていることを表す形です。過去形との違いは「今」に視点があるかどうかです。

現在完了形は名前に「過去」が入っていませんが、これは偶然ではありません。話題の中心はあくまで現在で、過去はその原因として持ち出されているだけです。過去形が「過去の一点を切り取って報告する」のに対し、現在完了形は「その結果、今どうなっているか」を語ります。この視点の違いが、使える語と使えない語を決めています。

視点は常に今にある

I have lost my key. は「鍵をなくした」だけでなく「だから今も持っていない」まで含みます。今の状態を語るための形です。

過去の一点を示す語と共存できない

yesterday / last week / three years ago / when など、過去の一点を指す語とは一緒に使えません。視点が過去に移ってしまうからです。

4つの意味がある

完了・結果・経験・継続の4つです。どれになるかは一緒に使われる副詞でほぼ決まります。

have / has + 過去分詞

見分け方

現在完了形にできるかどうか、また4つの意味のどれになるかは、次の順で判定します。

1. 過去の一点を示す語があるか

yesterday / ago / last 〜 / in 2020 があれば過去形です。現在完了形は使えません。

2. 一緒に使われている副詞を見る

just / already / yet なら完了、ever / never / times なら経験、for / since なら継続です。

3. 今どうなっているかが問題になっているか

「だから今〜だ」という含みがあれば現在完了形です。単に過去の出来事を報告するだけなら過去形です。

正体判断の根拠
I lost my key yesterday.過去形yesterday という過去の一点がある。今持っているかは不明。
I have lost my key.現在完了形(結果)今も見つかっていない、という現在の状態を含む。
He went to Osaka.過去形大阪へ行った、という過去の事実だけ。
He has gone to Osaka.現在完了形(結果)行ってしまって今ここにいない、まで含む。has been なら「行ったことがある」で意味が変わる。

用法別の例文

4つの意味と、それぞれに使われる副詞をセットで覚えるのが最も効率的です。

完了(ちょうど〜したところだ)

just / already / yet と一緒に使われます。yet は否定文と疑問文で使います。

I have just finished my homework.

ちょうど宿題を終えたところだ。

just は have と過去分詞の間に置きます。

She has already left the office.

彼女はもう退社してしまった。

already は肯定文で使います。

The package has not arrived yet.

その荷物はまだ届いていない。

yet は文末に置きます。 否定文で「まだ」、疑問文で「もう」の意味になります。

結果(〜してしまった、その結果今は〜だ)

過去の行為の結果が今も続いていることを表します。

I have lost my wallet.

財布をなくしてしまった。

今も見つかっていない。

He has gone to London.

彼はロンドンへ行ってしまった。

今ここにいない。 has been to なら「行ったことがある」で経験になります。

経験(〜したことがある)

ever / never / once / twice / 回数 と一緒に使われます。

Have you ever been to Kyoto?

京都へ行ったことはありますか。

疑問文の ever。 have been to は「行ったことがある」、have gone to は「行ってしまった」です。

I have never eaten natto.

納豆を食べたことがない。

never は not を含むので、not は不要です。

She has visited Paris three times.

彼女はパリを3回訪れたことがある。

回数を示す語と使われます。

継続(ずっと〜している)

for(期間)と since(起点)と一緒に使われます。状態動詞で使うのが基本です。

I have lived here for ten years.

私は10年間ここに住んでいる。

for + 期間の長さ。

We have known each other since childhood.

私たちは子どものころから知り合いだ。

since + 起点。 know は状態動詞なので進行形にしません。

How long have you worked here?

ここで働いてどのくらいになりますか。

How long で期間を尋ねます。

現在完了進行形(ずっと〜し続けている)

動作動詞で継続を表すときは have been + ing にします。

I have been waiting for an hour.

1時間ずっと待っている。

wait は動作動詞なので進行形にします。

It has been raining since morning.

朝からずっと雨が降っている。

動作の継続を強調する形です。

演習問題(ステップ解説)

例題1: 過去形か現在完了形かを決める

I ( ) my umbrella on the train yesterday.

  1. 文末に yesterday があります。過去の一点を示す語です。
  2. 現在完了形は過去の一点を示す語と一緒に使えません。
  3. よって過去形にします。
  4. 答えは left です。have left にすると yesterday と矛盾します。

yesterday / ago / last 〜 があれば、迷わず過去形です。

例題2: been と gone を区別する

He has ( ) to Hawaii twice.

  1. twice があるので経験を表しています。
  2. 経験を表すのは have been to です。「行ったことがある」の意味になります。
  3. have gone to にすると「行ってしまって今ここにいない」となり、twice と合いません。
  4. 答えは been です。

have been to は経験、have gone to は結果。twice などの回数があれば been です。

日本人が間違えやすいポイント

yesterday や last week など、過去の一点を示す語と一緒に使ってしまう誤りが最も多く出ます。× I have finished it yesterday. → ○ I finished it yesterday. 現在完了形は今に視点があるため、過去の一点に視点を固定する語とは共存できません。when で始まる疑問文も同じ理由で使えません(× When have you finished it?)。

よく出るひっかけ問題

have been to と have gone to は別物

have been to は「行ったことがある・行ってきたところだ」、have gone to は「行ってしまって今ここにいない」です。主語が he や she のときに特に区別が問われます。

since の後ろは起点、for の後ろは長さ

since 2020 / since I was a child は起点、for ten years / for a long time は長さです。since の後ろに期間を置くことはできません。

状態動詞は進行形にしない

I have known him for years. は正しく、I have been knowing him は誤りです。know / like / belong などの状態動詞は現在完了進行形にしません。

never には not を付けない

I have never been there. が正しい形です。never 自体が否定を含むため、I have not never とはしません。

yet は否定文と疑問文で意味が変わる

否定文では「まだ」、疑問文では「もう」です。Have you finished yet? は「もう終わりましたか」となります。

米語では過去形で代用されることがある

Did you eat yet? のように、米語の会話では現在完了形の代わりに過去形が使われることがあります。ただし試験では現在完了形が求められます。

練習問題

一緒に使われている副詞に注目して解いてください。

問1 I ( ) to Canada three times.

1. have been

2. have gone

3. went

4. was going

答: 1 three times があるので経験を表します。経験は have been to です。have gone to にすると「行ってしまって今いない」となり、回数と合いません。

問2 She ( ) her homework an hour ago.

1. has finished

2. finished

3. has been finishing

4. finishes

答: 2 an hour ago は過去の一点を示す語なので、現在完了形は使えません。過去形 finished にします。

問3 We have lived in this town ( ) 2015.

1. for

2. since

3. during

4. from

答: 2 2015 は起点なので since です。for の後ろには ten years のような長さが来ます。

問4 I have been ( ) for two hours.

1. knowing him

2. waiting

3. belonged

4. liking it

答: 2 現在完了進行形にできるのは動作動詞です。wait は動作動詞なので使えますが、know / belong / like は状態動詞なので進行形にしません。

問5 次のうち文法的に正しくないものはどれですか。

1. Have you ever visited Osaka?

2. I have not seen him yet.

3. When have you arrived here?

4. She has just left.

答: 3 3番は When が過去の一点を尋ねる語なので現在完了形と共存できません。When did you arrive here? が正しい形です。

アプリで演習問題を解く・保存する →