Leon Durham opened the inning with a single off Rick Reuschel (5-4), and Moreland followed with his 12th homer of the year, a shot into the left-field bleachers.
Reuschel, who allowed 10 hits, walked one and struck out four, had been given a 2-1 lead in the eighth inning when Andy Van Slyke hit a two-out, two-run home run off Jamie Moyer (8-4).
Moyer allowed eight hits, struck out three and walked four for his first complete game since last Aug. 16 and the first by a Cub pitcher since Steve Trout beat Montreal, 7-1, on April 26. It was only the fourth complete game by a Chicago pitcher this season.
The Pirates trailed, 1-0, with two out in the eighth when Bo Diaz walked and Van Slyke followed with his ninth home run of the season, a shot into the center-field bleachers.
The Cubs scored their first run when Dave Martinez tripled with one out in the third inning and came home on Rafael Palmeiro's sharp single to left.
Barry Bonds then drew a one-out walk, and after being trapped off first by Moyer, beat Leon Durham's throw to second for a stolen base.
After striking out Bobby Bonilla, Moyer also walked Johnny Ray. Diaz then hit a long drive to right-center, but Martinez made a running catch to end the inning.